diff options
author | Nico Weber <thakis@chromium.org> | 2014-05-21 22:07:47 (GMT) |
---|---|---|
committer | Nico Weber <thakis@chromium.org> | 2014-05-21 22:18:01 (GMT) |
commit | bc239cca4f3f0757ba34d0306fbc2a2b75d067a2 (patch) | |
tree | e01abd5130c1e0f7ecca0dc0f0a24e8b9113dc0f /src/build.cc | |
parent | 7103c32646df958b0287c65b1c660bf528a191d6 (diff) | |
download | Ninja-bc239cca4f3f0757ba34d0306fbc2a2b75d067a2.zip Ninja-bc239cca4f3f0757ba34d0306fbc2a2b75d067a2.tar.gz Ninja-bc239cca4f3f0757ba34d0306fbc2a2b75d067a2.tar.bz2 |
Make "depfile=$out.d" work if $out contains escaped characters, rspfile too.
Fixes #730. This has always been broken, but due to #690 more paths are now
escaped (e.g. paths containing + characters, like file.c++). Also see
discussion in #689.
The approach is to give EdgeEnv an enum deciding on whether or not to escape
file names, and provide functions that evaluate depfile and rspfile with that
set that to kNoEscape. (depfile=$out.d doesn't make sense on edges with
multiple outputs.)
This should be relatively safe, as $in and $out can't be used on edges, only
on rules (#687).
Diffstat (limited to 'src/build.cc')
-rw-r--r-- | src/build.cc | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/build.cc b/src/build.cc index 91f1754..64bcea3 100644 --- a/src/build.cc +++ b/src/build.cc @@ -541,7 +541,7 @@ void Builder::Cleanup() { for (vector<Edge*>::iterator i = active_edges.begin(); i != active_edges.end(); ++i) { - string depfile = (*i)->GetBinding("depfile"); + string depfile = (*i)->GetUnescapedDepfile(); for (vector<Node*>::iterator ni = (*i)->outputs_.begin(); ni != (*i)->outputs_.end(); ++ni) { // Only delete this output if it was actually modified. This is @@ -696,7 +696,7 @@ bool Builder::StartEdge(Edge* edge, string* err) { // Create response file, if needed // XXX: this may also block; do we care? - string rspfile = edge->GetBinding("rspfile"); + string rspfile = edge->GetUnescapedRspfile(); if (!rspfile.empty()) { string content = edge->GetBinding("rspfile_content"); if (!disk_interface_->WriteFile(rspfile, content)) @@ -772,7 +772,7 @@ bool Builder::FinishCommand(CommandRunner::Result* result, string* err) { restat_mtime = input_mtime; } - string depfile = edge->GetBinding("depfile"); + string depfile = edge->GetUnescapedDepfile(); if (restat_mtime != 0 && deps_type.empty() && !depfile.empty()) { TimeStamp depfile_mtime = disk_interface_->Stat(depfile); if (depfile_mtime > restat_mtime) @@ -788,7 +788,7 @@ bool Builder::FinishCommand(CommandRunner::Result* result, string* err) { plan_.EdgeFinished(edge); // Delete any left over response file. - string rspfile = edge->GetBinding("rspfile"); + string rspfile = edge->GetUnescapedRspfile(); if (!rspfile.empty() && !g_keep_rsp) disk_interface_->RemoveFile(rspfile); @@ -828,7 +828,7 @@ bool Builder::ExtractDeps(CommandRunner::Result* result, } else #endif if (deps_type == "gcc") { - string depfile = result->edge->GetBinding("depfile"); + string depfile = result->edge->GetUnescapedDepfile(); if (depfile.empty()) { *err = string("edge with deps=gcc but no depfile makes no sense"); return false; |