| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|\
| |
| | |
Add stdlib.h include for atol().
|
| |
| |
| |
| |
| | |
This attempts to fix issue #600. `man atol` claims that atol() is in
stdlib.h, which wasn't included yet.
|
|/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When two ninja instances run in parallel in the same build directory,
one instance could write a deps entry header and a few ids, and then the
other instance could write a file name in the middle of the deps header.
When ninja reads this deps log on the next run, it will deserialize the
file name as indices, which will cause an out-of-bounds read.
(This can happen if a user runs a "compile this file" that uses ninja to
compile the current buffer in an editor, and also does a full build in a
terminal at the same time for example.)
While running two ninja instances in parallel in the same build
directory isn't a good idea, it happens to mostly work in non-deps mode:
There's redundant edge execution, but nothing crashes. This is partially
because the command log is line-buffered and a single log entry only
consists of a single line.
This change makes sure that deps entries are always written in one go,
like command log entries currently are. Running two ninja binaries in
parallel on the same build directory still isn't a great idea, but it's
less likely to lead to crashes.
See issue #595.
|
|
|
|
|
|
| |
Removing the `CreatePhonyInEdge(node);` line in
`ImplicitDepLoader::LoadDepsFromLog()` made no tests fail before this change.
The new test is a port to depsmode of the existing DepFileOK test.
|
|
|
|
| |
No functionality change. Related to issue #590.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
in deps mode.
`ImplicitDepLoader::LoadDepFile()` already adds a depfile edge from every file
mentioned in a depfile to the depfile's output.
`ImplicitDepLoader::LoadDepsFromLog()` didn't do this yet, so add it. Else,
if a restat rule clears a generated .h file, this wouldn't propagate to cc files
depending on that .h file through a depfile.
Fixues issue #590.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
/showIncludes prints absolute paths. If a source file says
`#include <WiNdOwS.h>`, /showIncludes will use that spelling in
its output for the basename and use the on-disk cache for the
directory names in the rest for its output.
This makes the .d files created by `-t msvc -o` consistent with the
.d files written by gcc and clang.
Before this change, `-t msvc -o` would convert this output to
lower case. This is a problem if a build step produces a header file
with mixed case, such as "RuntimeFeatures.h". Due to the lowercasing,
the .d file would contain "runtimefeatures.h", while the build step
will create "RuntimeFeatures.h". Due to the case difference, ninja
would not realize that regeneration of the .h file would require
a rebuild of all source files having the header in the .d file.
(On the next build, ninja would rebuild them since stat()ing is not
case-sensitive on Windows.) One possible fix for this is to make sure
that generators always write generated header files in lower case too,
but on Mac gcc doesn't do lower-casing and .d files end up with the
case-as-written, so generators would have to be different on Mac and
Windows, which is undesirable.
If case-insensitve path comparisons are useful, they should be done
somewhere else (e.g. in CanonicalizePath()) where they affect both
paths read from .d files and paths read from .ninja files. This should
then be controlled by a top-level variable.
This patch changes behavior, but it only has an effect on generated
header files, which aren't common, and it only affects -t msvc, which
is still marked as experimental. (cmake doesn't use it yet.)
(If a file has both `#include <windows.h>` and `<Windows.h>`, this
will now take 2 stat() calls instead of just one, but that should
have a negligible cost.)
|
| |
|
|
|
|
|
| |
This removes the ugly Globals struct, and the ResetState() hack.
This also eliminates the only goto!
|
| |
|
| |
|
|\
| |
| | |
Don't use va_start() with reference parameters, it's undefined behavior.
|
| |
| |
| |
| | |
Should fix issue #584.
|
|\ \
| | |
| | | |
Ninja -t browse opens localhost in browser, which doesn't work when using ssh
|
| | |
| | |
| | |
| | | |
Change-Id: Ic4be6527151a7ff68afab62e61951071ad5694b7
|
|\ \ \
| | | |
| | | | |
do not unconditionally use PATH_MAX with getcwd
|
| |/ /
| | |
| | |
| | |
| | |
| | | |
Instead, grow a buffer until getcwd either succeeds or fails with an errno different than ERANGE
(meaning the passed buffer was too short to represent the actual path).
Reset errno before calling getcwd to check it eventually did not fail.
|
|\ \ \
| | | |
| | | | |
Added bootstrap/configure option to force pselect
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
All modern Linux kernels have ppoll() but sometimes
you might want to compile on something ancient.
This patch adds the possibility to force the use
of pselect() instead by passing --force-pselect
to bootstrap/configure.
The use of ppoll() is still default for Linux
and OpenBSD
|
|/ / |
|
|\ \
| | |
| | | |
Set stdout to binary mode in -t msvc.
|
| | |
| | |
| | |
| | | |
Fixes issue #575.
|
|\ \ \
| |/ /
|/| | |
structs not classes.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
For some reason that I do not, ninja prefers:
struct Foo {
Foo();
private:
void Blah();
};
Rather than
class Foo {
public:
Foo();
private:
void Blah();
};
This catches the last two usages of "class" in the code base.
Signed-off-by: Thiago Farina <tfarina@chromium.org>
|
| | | |
|
| |/
|/| |
|
| | |
|
|\ \
| | |
| | | |
Remove a few unused includes.
|
| |/ |
|
|/
|
|
|
|
|
| |
At any phase in the test where multiple edges are ready
simultaneously, acquire all edges and sort them into a predictable
order. This allows the test to execute deterministically regardless
of the order of edge allocation.
|
|\
| |
| | |
Add support for OpenBSD.
|
| |
| |
| |
| |
| |
| | |
POLLRDHUP is Linux-specific, and isn't necessary for polling pipes
anyway. Linux and OpenBSD both return POLLHUP if no process has the
pipe open for writing.
|
| |
| |
| |
| |
| |
| | |
Use ppoll() on OpenBSD. Also, fix interrupt handling to recognize
that on FreeBSD and OpenBSD, an interrupt might have been delivered
even if pselect()/ppoll() don't return -1/EINTR.
|
| | |
|
|\ \
| |/
|/| |
Implement deps log recompaction.
|
| |
| |
| |
| |
| | |
Now that Recompact() keeps all data structures intact, it can just be
called at the beginning of a build and the build will still work.
|
| |
| |
| |
| |
| |
| | |
Previously, a DepsLog would become invalid after Recompact() was called,
due to Recompact() making all node ids refer to a temporary DepsLog
object constructed in Recompact().
|
| |
| |
| |
| |
| |
| | |
This is a behavior change, but it should be safe: Graph only queries the
deps log at startup, before running any command. Nothing else currently
queries the deps log.
|
| |
| |
| |
| | |
No functionality change.
|
| |
| |
| |
| | |
No functionality change.
|
|/ |
|
| |
|
|\
| |
| | |
Introduce a Truncate() function that works on POSIX and Windows.
|
| |
| |
| |
| | |
Hopefully fixes the build on Windows.
|
|\ \
| | |
| | | |
Make sure that recompaction writes a pristine new depslog.
|
| |/
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
...even if a prior run of DepsLog::Recompact() exited without cleaning
up, for example due to a crash or because someone added a `return true;`
in the middle of the function while debugging. Or because someone hits
ctrl-c during deps log recompaction.
No test, because I can't think of a way to trigger this scenario
programmatically.
Part of issue #554.
|
|/
|
|
| |
Part of issue #554.
|
| |
|
| |
|
|
|
|
|
|
| |
If a read fails while reading an entry, truncate the log to the last
successfully read entry. This prevents corruption when a subsequent
run appends another entry.
|