From a83020b750e7b3c8c801fcf79ebe94d7dd4840dd Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 21 Apr 2013 17:55:10 -0700 Subject: Don't record deps in dry runs. deps_log() is NULL during dry runs, so this fixes a crash. It also matches ninja 1.2.0's behavior as far as I can tell. Fixes issue #551. --- src/build.cc | 4 +++- src/build_test.cc | 31 ++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/build.cc b/src/build.cc index fed3065..c9842ce 100644 --- a/src/build.cc +++ b/src/build.cc @@ -715,7 +715,9 @@ void Builder::FinishCommand(CommandRunner::Result* result) { // extraction itself can fail, which makes the command fail from a // build perspective. vector deps_nodes; - string deps_type = edge->GetBinding("deps"); + string deps_type; + if (!config_.dry_run) + deps_type = edge->GetBinding("deps"); if (!deps_type.empty()) { string extract_err; if (!ExtractDeps(result, deps_type, &deps_nodes, &extract_err) && diff --git a/src/build_test.cc b/src/build_test.cc index 827998b..68a5142 100644 --- a/src/build_test.cc +++ b/src/build_test.cc @@ -1353,7 +1353,7 @@ TEST_F(BuildTest, PhonyWithNoInputs) { ASSERT_EQ(1u, command_runner_.commands_ran_.size()); } -TEST_F(BuildTest, DepsGccWithEmptyDeps) { +TEST_F(BuildTest, DepsGccWithEmptyDepfileErrorsOut) { ASSERT_NO_FATAL_FAILURE(AssertParse(&state_, "rule cc\n" " command = cc\n" @@ -1554,3 +1554,32 @@ TEST_F(BuildWithDepsLogTest, ObsoleteDeps) { builder.command_runner_.release(); } } + +TEST_F(BuildWithDepsLogTest, DepsIgnoredInDryRun) { + const char* manifest = + "build out: cat in1\n" + " deps = gcc\n" + " depfile = in1.d\n"; + + fs_.Create("out", ""); + fs_.Tick(); + fs_.Create("in1", ""); + + State state; + ASSERT_NO_FATAL_FAILURE(AddCatRule(&state)); + ASSERT_NO_FATAL_FAILURE(AssertParse(&state, manifest)); + + // The deps log is NULL in dry runs. + config_.dry_run = true; + Builder builder(&state, config_, NULL, NULL, &fs_); + builder.command_runner_.reset(&command_runner_); + command_runner_.commands_ran_.clear(); + + string err; + EXPECT_TRUE(builder.AddTarget("out", &err)); + ASSERT_EQ("", err); + EXPECT_TRUE(builder.Build(&err)); + ASSERT_EQ(1u, command_runner_.commands_ran_.size()); + + builder.command_runner_.release(); +} -- cgit v0.12 From 01ae2fbae0fc44171ecddcbdeee1a572b477a691 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 21 Apr 2013 22:03:20 -0700 Subject: keep dry run more similar to normal run --- src/build.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/build.cc b/src/build.cc index c9842ce..5cf9d27 100644 --- a/src/build.cc +++ b/src/build.cc @@ -715,9 +715,7 @@ void Builder::FinishCommand(CommandRunner::Result* result) { // extraction itself can fail, which makes the command fail from a // build perspective. vector deps_nodes; - string deps_type; - if (!config_.dry_run) - deps_type = edge->GetBinding("deps"); + string deps_type = edge->GetBinding("deps"); if (!deps_type.empty()) { string extract_err; if (!ExtractDeps(result, deps_type, &deps_nodes, &extract_err) && @@ -789,7 +787,7 @@ void Builder::FinishCommand(CommandRunner::Result* result) { restat_mtime); } - if (!deps_type.empty()) { + if (!deps_type.empty() && !config_.dry_run) { assert(edge->outputs_.size() == 1 && "should have been rejected by parser"); Node* out = edge->outputs_[0]; TimeStamp deps_mtime = disk_interface_->Stat(out->path()); -- cgit v0.12