From 0a4010790b10dcb3ed3c7af0c0a5ba06155c996d Mon Sep 17 00:00:00 2001 From: Evan Martin Date: Sat, 30 Oct 2010 18:29:54 -0700 Subject: use success exit code when nothing to build --- ninja.cc | 9 +++++++-- ninja.h | 20 +------------------- ninja_jumble.cc | 20 +++++++++++++++++++- ninja_test.cc | 2 +- 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/ninja.cc b/ninja.cc index 7d9e25b..0bcfb95 100644 --- a/ninja.cc +++ b/ninja.cc @@ -58,8 +58,13 @@ int main(int argc, char** argv) { Builder builder(&state); for (int i = optind; i < argc; ++i) { if (!builder.AddTarget(argv[i], &err)) { - fprintf(stderr, "%s\n", err.c_str()); - return 1; + if (!err.empty()) { + fprintf(stderr, "%s\n", err.c_str()); + return 1; + } else { + // Added a target that is already up-to-date; not really + // an error. + } } } diff --git a/ninja.h b/ninja.h index 4fd790f..94e9d19 100644 --- a/ninja.h +++ b/ninja.h @@ -164,25 +164,7 @@ struct Builder { : state_(state), plan_(state), disk_interface_(&default_disk_interface_) {} virtual ~Builder() {} - Node* AddTarget(const string& name, string* err) { - Node* node = plan_.state_->LookupNode(name); - if (!node) { - *err = "unknown target: '" + name + "'"; - return NULL; - } - node->file_->StatIfNecessary(disk_interface_); - if (node->in_edge_) { - if (!node->in_edge_->RecomputeDirty(state_, disk_interface_, err)) - return false; - } - if (!node->dirty_) { - *err = "target is clean; nothing to do"; - return NULL; - } - if (!plan_.AddTarget(node, err)) - return NULL; - return node; - } + Node* AddTarget(const string& name, string* err); bool Build(Shell* shell, string* err); State* state_; diff --git a/ninja_jumble.cc b/ninja_jumble.cc index fa0023f..cbba387 100644 --- a/ninja_jumble.cc +++ b/ninja_jumble.cc @@ -409,6 +409,25 @@ bool Shell::RunCommand(Edge* edge) { } +Node* Builder::AddTarget(const string& name, string* err) { + Node* node = plan_.state_->LookupNode(name); + if (!node) { + *err = "unknown target: '" + name + "'"; + return NULL; + } + node->file_->StatIfNecessary(disk_interface_); + if (node->in_edge_) { + if (!node->in_edge_->RecomputeDirty(state_, disk_interface_, err)) + return false; + } + if (!node->dirty_) + return NULL; // Intentionally no error. + + if (!plan_.AddTarget(node, err)) + return NULL; + return node; +} + bool Builder::Build(Shell* shell, string* err) { if (plan_.want_.empty()) { *err = "no work to do"; @@ -493,4 +512,3 @@ string EvalString::Evaluate(Env* env) { } return result; } - diff --git a/ninja_test.cc b/ninja_test.cc index 1e31e77..e376935 100644 --- a/ninja_test.cc +++ b/ninja_test.cc @@ -219,7 +219,7 @@ TEST_F(BuildTest, Chain) { err.clear(); commands_ran_.clear(); EXPECT_FALSE(builder_.AddTarget("c5", &err)); - ASSERT_EQ("target is clean; nothing to do", err); + ASSERT_EQ("", err); EXPECT_TRUE(builder_.Build(this, &err)); ASSERT_EQ(0, commands_ran_.size()); -- cgit v0.12