diff options
-rw-r--r-- | src/build.cc | 10 | ||||
-rw-r--r-- | src/build_test.cc | 18 |
2 files changed, 24 insertions, 4 deletions
diff --git a/src/build.cc b/src/build.cc index 2d3d9b4..5e874df 100644 --- a/src/build.cc +++ b/src/build.cc @@ -873,7 +873,7 @@ void Builder::FinishCommand(CommandRunner::Result* result) { } if (!deps_type.empty()) { - assert(edge->outputs_.size() == 1); + assert(edge->outputs_.size() == 1 && "should have been rejected by parser"); Node* out = edge->outputs_[0]; TimeStamp mtime = disk_interface_->Stat(out->path()); // XXX we could reuse the restat logic to avoid a second stat, @@ -899,8 +899,10 @@ bool Builder::ExtractDeps(CommandRunner::Result* result, #endif if (deps_type == "gcc") { string depfile = result->edge->GetBinding("depfile"); - if (depfile.empty()) - return true; // No dependencies to load. + if (depfile.empty()) { + *err = string("edge with deps=gcc but no depfile makes no sense\n"); + return false; + } string content = disk_interface_->ReadFile(depfile, err); if (!err->empty()) @@ -922,7 +924,7 @@ bool Builder::ExtractDeps(CommandRunner::Result* result, } if (disk_interface_->RemoveFile(depfile) < 0) { - *err = string("deleting depfile: ") + strerror(errno); + *err = string("deleting depfile: ") + strerror(errno) + string("\n"); return false; } } else { diff --git a/src/build_test.cc b/src/build_test.cc index a227854..7df742f 100644 --- a/src/build_test.cc +++ b/src/build_test.cc @@ -1353,6 +1353,24 @@ TEST_F(BuildTest, PhonyWithNoInputs) { ASSERT_EQ(1u, command_runner_.commands_ran_.size()); } +TEST_F(BuildTest, DepsGccWithEmptyDeps) { + ASSERT_NO_FATAL_FAILURE(AssertParse(&state_, +"rule cc\n" +" command = cc\n" +" deps = gcc\n" +"build out: cc\n")); + Dirty("out"); + + string err; + EXPECT_TRUE(builder_.AddTarget("out", &err)); + ASSERT_EQ("", err); + EXPECT_FALSE(builder_.AlreadyUpToDate()); + + EXPECT_FALSE(builder_.Build(&err)); + ASSERT_EQ("subcommand failed", err); + ASSERT_EQ(1u, command_runner_.commands_ran_.size()); +} + TEST_F(BuildTest, StatusFormatReplacePlaceholder) { EXPECT_EQ("[%/s0/t0/r0/u0/f0]", status_.FormatProgressStatus("[%%/s%s/t%t/r%r/u%u/f%f]")); |