Don't delete phony targets when cleaning a specified target
authorPeter Collingbourne <peter@pcc.me.uk>
Sun, 26 Feb 2012 22:32:48 +0000 (22:32 +0000)
committerPeter Collingbourne <pcc03@doc.ic.ac.uk>
Tue, 28 Feb 2012 18:12:01 +0000 (18:12 +0000)
Also, modify Cleaner::CleanAll to use Edge::is_phony.

src/clean.cc
src/clean_test.cc

index e09ab4e..2565c28 100644 (file)
@@ -102,7 +102,7 @@ int Cleaner::CleanAll(bool generator) {
   for (vector<Edge*>::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<Node*>::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<Node*>::iterator n = e->inputs_.begin(); n != e->inputs_.end();
          ++n) {
       DoCleanTarget(*n);
     }
index fbbe6a1..a93a3b4 100644 (file)
@@ -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"));
+}