diff options
author | Brad King <brad.king@kitware.com> | 2017-09-07 14:56:25 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2017-09-08 13:07:52 (GMT) |
commit | c0dde0ff7911780152dbe86d5782ebdecfeb37f2 (patch) | |
tree | fa0c474dbf0d9254e8346fdc4f9b2c79c5bbc63e /src/manifest_parser_test.cc | |
parent | e679202a14d9ca08ccd0f471f2bcbf6388ddb3de (diff) | |
download | Ninja-c0dde0ff7911780152dbe86d5782ebdecfeb37f2.zip Ninja-c0dde0ff7911780152dbe86d5782ebdecfeb37f2.tar.gz Ninja-c0dde0ff7911780152dbe86d5782ebdecfeb37f2.tar.bz2 |
Restore tolerance of self-referencing phony build statements
Since commit v1.8.0^2~3^2~1 (Teach RecomputeDirty to detect cycles in
the build graph, 2015-11-13) we correctly reject self-referencing phony
build statements like
build a: phony a
as cycles. Unfortunately this breaks support for CMake 2.8.12.x and
3.0.x because those versions incorrectly produce edges of this form
(that we used to tolerate). In order to preserve compatibility with
those CMake versions we need to restore tolerance of these edges.
Add a special case to the manifest parser to filter out self-referencing
inputs of phony edges of the form produced by those CMake versions.
Warn by default, but add a `-w phonycycle={err,warn}` option to make it
an error.
Fixes: #1322
Diffstat (limited to 'src/manifest_parser_test.cc')
-rw-r--r-- | src/manifest_parser_test.cc | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/manifest_parser_test.cc b/src/manifest_parser_test.cc index 756efdf..39ed810 100644 --- a/src/manifest_parser_test.cc +++ b/src/manifest_parser_test.cc @@ -384,6 +384,32 @@ TEST_F(ParserTest, DuplicateEdgeInIncludedFile) { err); } +TEST_F(ParserTest, PhonySelfReferenceIgnored) { + ASSERT_NO_FATAL_FAILURE(AssertParse( +"build a: phony a\n" +)); + + Node* node = state.LookupNode("a"); + Edge* edge = node->in_edge(); + ASSERT_TRUE(edge->inputs_.empty()); +} + +TEST_F(ParserTest, PhonySelfReferenceKept) { + const char kInput[] = +"build a: phony a\n"; + ManifestParserOptions parser_opts; + parser_opts.phony_cycle_action_ = kPhonyCycleActionError; + ManifestParser parser(&state, &fs_, parser_opts); + string err; + EXPECT_TRUE(parser.ParseTest(kInput, &err)); + EXPECT_EQ("", err); + + Node* node = state.LookupNode("a"); + Edge* edge = node->in_edge(); + ASSERT_EQ(edge->inputs_.size(), 1); + ASSERT_EQ(edge->inputs_[0], node); +} + TEST_F(ParserTest, ReservedWords) { ASSERT_NO_FATAL_FAILURE(AssertParse( "rule build\n" |