summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrank Henigman <fjhenigman@google.com>2017-12-18 04:30:03 (GMT)
committerFrank Henigman <fjhenigman@chromium.org>2018-04-05 03:02:09 (GMT)
commitb9d3ba2f169e172f2d73330f6a1d1f0436baa859 (patch)
tree6cdb82615568743e53fb9486a87198789daf3356
parenta741b119e6d29061a4fbdedf35dc196e4cee67ec (diff)
downloadNinja-b9d3ba2f169e172f2d73330f6a1d1f0436baa859.zip
Ninja-b9d3ba2f169e172f2d73330f6a1d1f0436baa859.tar.gz
Ninja-b9d3ba2f169e172f2d73330f6a1d1f0436baa859.tar.bz2
Canonicalize targets of clean command.
This corrects an inconsistency where build targets were canonicalized but clean targets were not. For example you could build ./foo but not clean ./foo.
-rw-r--r--src/clean.cc23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/clean.cc b/src/clean.cc
index 1d6ba9e..4f31a03 100644
--- a/src/clean.cc
+++ b/src/clean.cc
@@ -180,15 +180,22 @@ int Cleaner::CleanTargets(int target_count, char* targets[]) {
Reset();
PrintHeader();
for (int i = 0; i < target_count; ++i) {
- const char* target_name = targets[i];
- Node* target = state_->LookupNode(target_name);
- if (target) {
- if (IsVerbose())
- printf("Target %s\n", target_name);
- DoCleanTarget(target);
- } else {
- Error("unknown target '%s'", target_name);
+ string target_name = targets[i];
+ uint64_t slash_bits;
+ string err;
+ if (!CanonicalizePath(&target_name, &slash_bits, &err)) {
+ Error("failed to canonicalize '%s': %s", target_name.c_str(), err.c_str());
status_ = 1;
+ } else {
+ Node* target = state_->LookupNode(target_name);
+ if (target) {
+ if (IsVerbose())
+ printf("Target %s\n", target_name.c_str());
+ DoCleanTarget(target);
+ } else {
+ Error("unknown target '%s'", target_name.c_str());
+ status_ = 1;
+ }
}
}
PrintFooter();