diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2011-09-14 00:32:15 (GMT) |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2011-09-14 02:01:12 (GMT) |
commit | f14039d44a93b7717e5335a371ea22fe4561aaf8 (patch) | |
tree | a888a3578c1d2eaf452d9f86273aa7cbadad136c /src | |
parent | 22c309760a5a38ccc88a6f700e101868236ce4ab (diff) | |
download | Ninja-f14039d44a93b7717e5335a371ea22fe4561aaf8.zip Ninja-f14039d44a93b7717e5335a371ea22fe4561aaf8.tar.gz Ninja-f14039d44a93b7717e5335a371ea22fe4561aaf8.tar.bz2 |
Consider missing phony targets with no dependencies out of date
Commit 639c8f0 ("don't mark phony edges dirty if none of their
inputs are dirty") modified the behaviour of the "phony" built-in
rule. Previously, when the output file was missing, it was marked
as dirty. After 639c8f0, it was always marked as clean unless one
of the dependencies was dirty. The depfile mechanism uses the old
behaviour of "phony" to rebuild an object file if any of the headers
were missing.
Restore the old "phony" behaviour only for the case where the build
statement has no dependencies. This is slightly inconsistent, but I
can't really see any other use case for an alias of nothing. Also,
document this behaviour.
Diffstat (limited to 'src')
-rw-r--r-- | src/build_test.cc | 9 | ||||
-rw-r--r-- | src/graph.cc | 5 |
2 files changed, 13 insertions, 1 deletions
diff --git a/src/build_test.cc b/src/build_test.cc index 752a4b4..84359a3 100644 --- a/src/build_test.cc +++ b/src/build_test.cc @@ -533,6 +533,15 @@ TEST_F(BuildTest, OrderOnlyDeps) { EXPECT_TRUE(builder_.AddTarget("foo.o", &err)); EXPECT_EQ("", err); EXPECT_TRUE(builder_.AlreadyUpToDate()); + + // implicit dep missing, expect rebuild. + fs_.RemoveFile("bar.h"); + commands_ran_.clear(); + state_.stat_cache_.Invalidate(); + EXPECT_TRUE(builder_.AddTarget("foo.o", &err)); + EXPECT_TRUE(builder_.Build(&err)); + ASSERT_EQ("", err); + ASSERT_EQ(1u, commands_ran_.size()); } TEST_F(BuildTest, Phony) { diff --git a/src/graph.cc b/src/graph.cc index 5c37ac0..9c99b3d 100644 --- a/src/graph.cc +++ b/src/graph.cc @@ -77,9 +77,12 @@ bool Edge::RecomputeDirty(State* state, DiskInterface* disk_interface, if (is_phony()) { // Phony edges don't write any output. - // They're only dirty if an input is dirty. + // They're only dirty if an input is dirty, or if there are no inputs + // and we're missing the output. if (dirty) (*i)->dirty_ = true; + else if (inputs_.empty() && !(*i)->file_->exists()) + (*i)->dirty_ = true; continue; } |