summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/build.cc10
-rw-r--r--src/build_test.cc18
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]"));