From 3353e5508614598ff18592bda55f68a6223911cf Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Sun, 26 Feb 2012 22:32:48 +0000 Subject: Don't delete phony targets when cleaning a specified target Also, modify Cleaner::CleanAll to use Edge::is_phony. --- src/clean.cc | 16 +++++++++------- src/clean_test.cc | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/clean.cc b/src/clean.cc index e09ab4e..2565c28 100644 --- a/src/clean.cc +++ b/src/clean.cc @@ -102,7 +102,7 @@ int Cleaner::CleanAll(bool generator) { for (vector::iterator e = state_->edges_.begin(); e != state_->edges_.end(); ++e) { // Do not try to remove phony targets - if ((*e)->rule_ == &State::kPhonyRule) + if ((*e)->is_phony()) continue; // Do not remove generator's files unless generator specified. if (!generator && (*e)->rule().generator()) @@ -123,12 +123,14 @@ int Cleaner::CleanAll(bool generator) { } void Cleaner::DoCleanTarget(Node* target) { - if (target->in_edge()) { - Remove(target->path()); - if (target->in_edge()->HasRspFile()) - Remove(target->in_edge()->GetRspFile()); - for (vector::iterator n = target->in_edge()->inputs_.begin(); - n != target->in_edge()->inputs_.end(); + if (Edge* e = target->in_edge()) { + // Do not try to remove phony targets + if (!e->is_phony()) { + Remove(target->path()); + if (e->HasRspFile()) + Remove(e->GetRspFile()); + } + for (vector::iterator n = e->inputs_.begin(); n != e->inputs_.end(); ++n) { DoCleanTarget(*n); } diff --git a/src/clean_test.cc b/src/clean_test.cc index fbbe6a1..a93a3b4 100644 --- a/src/clean_test.cc +++ b/src/clean_test.cc @@ -317,3 +317,28 @@ TEST_F(CleanTest, CleanFailure) { Cleaner cleaner(&state_, config_, &fs_); EXPECT_NE(0, cleaner.CleanAll()); } + +TEST_F(CleanTest, CleanPhony) { + ASSERT_NO_FATAL_FAILURE(AssertParse(&state_, +"build phony: phony t1 t2\n" +"build t1: cat\n" +"build t2: cat\n")); + + fs_.Create("phony", 1, ""); + fs_.Create("t1", 1, ""); + fs_.Create("t2", 1, ""); + + // Check that CleanAll does not remove "phony". + Cleaner cleaner(&state_, config_, &fs_); + EXPECT_EQ(0, cleaner.CleanAll()); + EXPECT_EQ(2, cleaner.cleaned_files_count()); + EXPECT_NE(0, fs_.Stat("phony")); + + fs_.Create("t1", 1, ""); + fs_.Create("t2", 1, ""); + + // Check that CleanTarget does not remove "phony". + EXPECT_EQ(0, cleaner.CleanTarget("phony")); + EXPECT_EQ(2, cleaner.cleaned_files_count()); + EXPECT_NE(0, fs_.Stat("phony")); +} -- cgit v0.12