diff options
author | Brad King <brad.king@kitware.com> | 2019-02-12 14:16:50 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2019-04-18 12:21:44 (GMT) |
commit | a3cbb4d4ddbd3661720603cc26b25cad6177b4c8 (patch) | |
tree | 77c2fbdb481653ae300342b025d2af9438f3e9a9 /src/clean.cc | |
parent | c21f3f2a1d8cb0aea45804ffc788947c4096281b (diff) | |
download | Ninja-a3cbb4d4ddbd3661720603cc26b25cad6177b4c8.zip Ninja-a3cbb4d4ddbd3661720603cc26b25cad6177b4c8.tar.gz Ninja-a3cbb4d4ddbd3661720603cc26b25cad6177b4c8.tar.bz2 |
clean: remove outputs specified by dyndep files
Some outputs may not be known in the main build manifest and are instead
discovered through a dyndep binding. Load dyndep files that are
available during cleaning so that we can clean these outputs too.
Diffstat (limited to 'src/clean.cc')
-rw-r--r-- | src/clean.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/clean.cc b/src/clean.cc index caee8d3..d1f221d 100644 --- a/src/clean.cc +++ b/src/clean.cc @@ -27,6 +27,7 @@ Cleaner::Cleaner(State* state, DiskInterface* disk_interface) : state_(state), config_(config), + dyndep_loader_(state, disk_interface), removed_(), cleaned_(), cleaned_files_count_(0), @@ -103,6 +104,7 @@ void Cleaner::PrintFooter() { int Cleaner::CleanAll(bool generator) { Reset(); PrintHeader(); + LoadDyndeps(); for (vector<Edge*>::iterator e = state_->edges_.begin(); e != state_->edges_.end(); ++e) { // Do not try to remove phony targets @@ -148,6 +150,7 @@ int Cleaner::CleanTarget(Node* target) { Reset(); PrintHeader(); + LoadDyndeps(); DoCleanTarget(target); PrintFooter(); return status_; @@ -170,6 +173,7 @@ int Cleaner::CleanTarget(const char* target) { int Cleaner::CleanTargets(int target_count, char* targets[]) { Reset(); PrintHeader(); + LoadDyndeps(); for (int i = 0; i < target_count; ++i) { string target_name = targets[i]; uint64_t slash_bits; @@ -213,6 +217,7 @@ int Cleaner::CleanRule(const Rule* rule) { Reset(); PrintHeader(); + LoadDyndeps(); DoCleanRule(rule); PrintFooter(); return status_; @@ -237,6 +242,7 @@ int Cleaner::CleanRules(int rule_count, char* rules[]) { Reset(); PrintHeader(); + LoadDyndeps(); for (int i = 0; i < rule_count; ++i) { const char* rule_name = rules[i]; const Rule* rule = state_->bindings_.LookupRule(rule_name); @@ -259,3 +265,16 @@ void Cleaner::Reset() { removed_.clear(); cleaned_.clear(); } + +void Cleaner::LoadDyndeps() { + // Load dyndep files that exist, before they are cleaned. + for (vector<Edge*>::iterator e = state_->edges_.begin(); + e != state_->edges_.end(); ++e) { + if (Node* dyndep = (*e)->dyndep_) { + // Capture and ignore errors loading the dyndep file. + // We clean as much of the graph as we know. + std::string err; + dyndep_loader_.LoadDyndeps(dyndep, &err); + } + } +} |