diff options
author | Evan Martin <martine@danga.com> | 2011-01-23 04:51:52 (GMT) |
---|---|---|
committer | Evan Martin <martine@danga.com> | 2011-01-23 04:51:52 (GMT) |
commit | a206206f3ff6c118f89cce04bf39f424bd1a6510 (patch) | |
tree | fad94b150e9d2bed7fdc48ec80d5f180e1298982 /src | |
parent | c1cb4f5ee82b1d41a5fb028aea0c6daa0461f050 (diff) | |
download | Ninja-a206206f3ff6c118f89cce04bf39f424bd1a6510.zip Ninja-a206206f3ff6c118f89cce04bf39f424bd1a6510.tar.gz Ninja-a206206f3ff6c118f89cce04bf39f424bd1a6510.tar.bz2 |
allow implicit deps
Diffstat (limited to 'src')
-rw-r--r-- | src/build_test.cc | 2 | ||||
-rw-r--r-- | src/parsers.cc | 26 | ||||
-rw-r--r-- | src/parsers.h | 1 | ||||
-rw-r--r-- | src/parsers_test.cc | 14 |
4 files changed, 38 insertions, 5 deletions
diff --git a/src/build_test.cc b/src/build_test.cc index 2588174..71c950b 100644 --- a/src/build_test.cc +++ b/src/build_test.cc @@ -469,7 +469,7 @@ TEST_F(BuildTest, OrderOnlyDeps) { string err; ASSERT_NO_FATAL_FAILURE(AssertParse(&state_, "rule cc\n command = cc $in\n depfile = $out.d\n" -"build foo.o: cc foo.c | otherfile\n")); +"build foo.o: cc foo.c || otherfile\n")); fs_.Create("foo.c", now_, ""); fs_.Create("otherfile", now_, ""); fs_.Create("foo.o.d", now_, "foo.o: blah.h bar.h\n"); diff --git a/src/parsers.cc b/src/parsers.cc index 7b810fe..f309854 100644 --- a/src/parsers.cc +++ b/src/parsers.cc @@ -20,6 +20,7 @@ string Token::AsString() const { case EQUALS: return "'='"; case COLON: return "':'"; case PIPE: return "'|'"; + case PIPE2: return "'||'"; case TEOF: return "eof"; case INDENT: return "indenting in"; case OUTDENT: return "indenting out"; @@ -181,8 +182,13 @@ Token::Type Tokenizer::PeekToken() { token_.type_ = Token::EQUALS; ++cur_; } else if (*cur_ == '|') { - token_.type_ = Token::PIPE; - ++cur_; + if (cur_ + 1 < end_ && cur_[1] == '|') { + token_.type_ = Token::PIPE2; + cur_ += 2; + } else { + token_.type_ = Token::PIPE; + ++cur_; + } } else if (*cur_ == '\n') { token_.type_ = Token::NEWLINE; ++cur_; @@ -413,7 +419,7 @@ bool ManifestParser::ParseEdge(string* err) { } // Add all order-only deps, counting how many as we go. - int order_only = 0; + int implicit = 0; if (tokenizer_.PeekToken() == Token::PIPE) { tokenizer_.ConsumeToken(); for (;;) { @@ -421,6 +427,19 @@ bool ManifestParser::ParseEdge(string* err) { if (!tokenizer_.ReadIdent(&in)) break; ins.push_back(in); + ++implicit; + } + } + + // Add all order-only deps, counting how many as we go. + int order_only = 0; + if (tokenizer_.PeekToken() == Token::PIPE2) { + tokenizer_.ConsumeToken(); + for (;;) { + string in; + if (!tokenizer_.ReadIdent(&in)) + break; + ins.push_back(in); ++order_only; } } @@ -467,6 +486,7 @@ bool ManifestParser::ParseEdge(string* err) { state_->AddIn(edge, *i); for (vector<string>::iterator i = outs.begin(); i != outs.end(); ++i) state_->AddOut(edge, *i); + edge->implicit_deps_ = implicit; edge->order_only_deps_ = order_only; return true; diff --git a/src/parsers.h b/src/parsers.h index ec9a677..55417cd 100644 --- a/src/parsers.h +++ b/src/parsers.h @@ -21,6 +21,7 @@ struct Token { EQUALS, COLON, PIPE, + PIPE2, INDENT, OUTDENT, TEOF diff --git a/src/parsers_test.cc b/src/parsers_test.cc index 82ef8f3..1ba34da 100644 --- a/src/parsers_test.cc +++ b/src/parsers_test.cc @@ -289,10 +289,22 @@ TEST_F(ParserTest, Include) { EXPECT_EQ("inner", state.bindings_.LookupVariable("var")); } -TEST_F(ParserTest, OrderOnly) { +TEST_F(ParserTest, Implicit) { ASSERT_NO_FATAL_FAILURE(AssertParse( "rule cat\n command = cat $in > $out\n" "build foo: cat bar | baz\n")); + + Edge* edge = state.LookupNode("foo")->in_edge_; + ASSERT_TRUE(edge->is_implicit(1)); +} + +TEST_F(ParserTest, OrderOnly) { + ASSERT_NO_FATAL_FAILURE(AssertParse( +"rule cat\n command = cat $in > $out\n" +"build foo: cat bar || baz\n")); + + Edge* edge = state.LookupNode("foo")->in_edge_; + ASSERT_TRUE(edge->is_order_only(1)); } TEST(MakefileParser, Basic) { |