summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2011-01-23 04:51:52 (GMT)
committerEvan Martin <martine@danga.com>2011-01-23 04:51:52 (GMT)
commita206206f3ff6c118f89cce04bf39f424bd1a6510 (patch)
treefad94b150e9d2bed7fdc48ec80d5f180e1298982 /src
parentc1cb4f5ee82b1d41a5fb028aea0c6daa0461f050 (diff)
downloadNinja-a206206f3ff6c118f89cce04bf39f424bd1a6510.zip
Ninja-a206206f3ff6c118f89cce04bf39f424bd1a6510.tar.gz
Ninja-a206206f3ff6c118f89cce04bf39f424bd1a6510.tar.bz2
allow implicit deps
Diffstat (limited to 'src')
-rw-r--r--src/build_test.cc2
-rw-r--r--src/parsers.cc26
-rw-r--r--src/parsers.h1
-rw-r--r--src/parsers_test.cc14
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) {