don't fail on missing implicit deps
authorEvan Martin <martine@danga.com>
Sat, 4 Dec 2010 23:15:39 +0000 (15:15 -0800)
committerEvan Martin <martine@danga.com>
Sat, 4 Dec 2010 23:15:39 +0000 (15:15 -0800)
build.cc
build_test.cc
ninja.h
ninja_test.cc

index 6282b5f..c8e9f27 100644 (file)
--- a/build.cc
+++ b/build.cc
@@ -37,10 +37,12 @@ bool Plan::AddSubTarget(Node* node, vector<Node*>* stack, string* err) {
   bool awaiting_inputs = false;
   for (vector<Node*>::iterator i = edge->inputs_.begin();
        i != edge->inputs_.end(); ++i) {
-    if (AddSubTarget(*i, stack, err))
+    if (!edge->is_implicit(i - edge->inputs_.begin()) &&
+        AddSubTarget(*i, stack, err)) {
       awaiting_inputs = true;
-    else if (!err->empty())
+    } else if (!err->empty()) {
       return false;
+    }
   }
   assert(stack->back() == node);
   stack->pop_back();
index 81f2fbe..2ded588 100644 (file)
@@ -396,6 +396,7 @@ TEST_F(BuildTest, DepFileOK) {
 "rule cc\n  command = cc $in\n  depfile = $out.d\n"
 "build foo.o: cc foo.c\n"));
   Touch("foo.c");
+  Dirty("bar.h");  // Mark bar.h as missing.
   file_contents_["foo.o.d"] = "foo.o: blah.h bar.h\n";
   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
   ASSERT_EQ("", err);
diff --git a/ninja.h b/ninja.h
index 8eabc3c..ecfb2d0 100644 (file)
--- a/ninja.h
+++ b/ninja.h
@@ -125,6 +125,10 @@ struct Edge {
   // pointer...)
   int implicit_deps_;
   int order_only_deps_;
+  bool is_implicit(int index) {
+    return index >= ((int)inputs_.size()) - order_only_deps_ - implicit_deps_ &&
+        !is_order_only(index);
+  }
   bool is_order_only(int index) {
     return index >= ((int)inputs_.size()) - order_only_deps_;
   }
index b018ff4..12ba93c 100644 (file)
@@ -20,7 +20,7 @@ StateTestWithBuiltinRules::StateTestWithBuiltinRules() {
 }
 
 Node* StateTestWithBuiltinRules::GetNode(const string& path) {
-  return state_.stat_cache()->GetFile(path)->node_;
+  return state_.GetNode(path);
 }
 
 TEST(State, Basic) {