diff options
author | Evan Martin <martine@danga.com> | 2011-03-07 19:25:10 (GMT) |
---|---|---|
committer | Evan Martin <martine@danga.com> | 2011-03-07 19:25:54 (GMT) |
commit | 15d4695878749c3525c96e856ef08dfb19a2c3e5 (patch) | |
tree | d5829403a867eb44e1e7ec957ab77fcf2ad707c8 | |
parent | a5980c6bb2d6ccb6ffed2d92304c55ba94622963 (diff) | |
download | Ninja-15d4695878749c3525c96e856ef08dfb19a2c3e5.zip Ninja-15d4695878749c3525c96e856ef08dfb19a2c3e5.tar.gz Ninja-15d4695878749c3525c96e856ef08dfb19a2c3e5.tar.bz2 |
files that have both implicit and explicit edges should be implicit
This is just deleting some code that was written in anticipation
of staying memory-resident; when loading a depfile, we don't need
to attempt to update existing entries in the dependency list, we
just need to blindly add them.
-rw-r--r-- | src/graph.cc | 14 | ||||
-rw-r--r-- | src/graph_test.cc | 24 |
2 files changed, 27 insertions, 11 deletions
diff --git a/src/graph.cc b/src/graph.cc index bdbcf3b..35ae088 100644 --- a/src/graph.cc +++ b/src/graph.cc @@ -213,17 +213,9 @@ bool Edge::LoadDepFile(State* state, DiskInterface* disk_interface, return false; Node* node = state->GetNode(*i); - for (vector<Node*>::iterator j = inputs_.begin(); j != inputs_.end(); ++j) { - if (*j == node) { - node = NULL; - break; - } - } - if (node) { - inputs_.insert(inputs_.end() - order_only_deps_, node); - node->out_edges_.push_back(this); - ++implicit_deps_; - } + inputs_.insert(inputs_.end() - order_only_deps_, node); + node->out_edges_.push_back(this); + ++implicit_deps_; } return true; diff --git a/src/graph_test.cc b/src/graph_test.cc index 758315e..b67cf99 100644 --- a/src/graph_test.cc +++ b/src/graph_test.cc @@ -88,3 +88,27 @@ TEST_F(GraphTest, FunkyMakefilePath) { // non-canonical path; we should still find it. EXPECT_TRUE(GetNode("out.o")->dirty_); } + +TEST_F(GraphTest, ExplicitImplicit) { + ASSERT_NO_FATAL_FAILURE(AssertParse(&state_, +"rule catdep\n" +" depfile = $out.d\n" +" command = cat $in > $out\n" +"build implicit.h: cat data\n" +"build out.o: catdep foo.cc || implicit.h\n")); + fs_.Create("data", 2, ""); + fs_.Create("implicit.h", 1, ""); + fs_.Create("foo.cc", 1, ""); + fs_.Create("out.o.d", 1, "out.o: implicit.h\n"); + fs_.Create("out.o", 1, ""); + + Edge* edge = GetNode("out.o")->in_edge_; + string err; + EXPECT_TRUE(edge->RecomputeDirty(&state_, &fs_, &err)); + ASSERT_EQ("", err); + + // We have both an implicit and an explicit dep on implicit.h. + // The implicit dep should "win" (in the sense that it should cause + // the output to be dirty). + EXPECT_TRUE(GetNode("out.o")->dirty_); +} |