summaryrefslogtreecommitdiffstats
path: root/src/build.cc
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2012-10-27 20:09:40 (GMT)
committerEvan Martin <martine@danga.com>2012-12-29 20:34:25 (GMT)
commit13dd08c1a03e5a8f4299816fbd3af1b6cb6d9642 (patch)
tree9564593d47936d2e47d88e344c2f6915ba8753a3 /src/build.cc
parent3249938cdf574058a066436aea06b0541ded6958 (diff)
downloadNinja-13dd08c1a03e5a8f4299816fbd3af1b6cb6d9642.zip
Ninja-13dd08c1a03e5a8f4299816fbd3af1b6cb6d9642.tar.gz
Ninja-13dd08c1a03e5a8f4299816fbd3af1b6cb6d9642.tar.bz2
rearrange handling of builtin bindings to make rules simpler
Now, a 'build' block can override any special binding like 'command' or 'description' if it needs to.
Diffstat (limited to 'src/build.cc')
-rw-r--r--src/build.cc38
1 files changed, 20 insertions, 18 deletions
diff --git a/src/build.cc b/src/build.cc
index b4229c4..701fa92 100644
--- a/src/build.cc
+++ b/src/build.cc
@@ -256,9 +256,9 @@ void BuildStatus::PrintStatus(Edge* edge) {
bool force_full_command = config_.verbosity == BuildConfig::VERBOSE;
- string to_print = edge->GetDescription();
+ string to_print = edge->GetBinding("description");
if (to_print.empty() || force_full_command)
- to_print = edge->EvaluateCommand();
+ to_print = edge->GetBinding("command");
#ifdef _WIN32
CONSOLE_SCREEN_BUFFER_INFO csbi;
@@ -612,7 +612,7 @@ void Builder::Cleanup() {
for (vector<Edge*>::iterator i = active_edges.begin();
i != active_edges.end(); ++i) {
- bool has_depfile = !(*i)->rule_->depfile().empty();
+ string depfile = (*i)->GetBinding("depfile");
for (vector<Node*>::iterator ni = (*i)->outputs_.begin();
ni != (*i)->outputs_.end(); ++ni) {
// Only delete this output if it was actually modified. This is
@@ -622,12 +622,13 @@ void Builder::Cleanup() {
// need to rebuild an output because of a modified header file
// mentioned in a depfile, and the command touches its depfile
// but is interrupted before it touches its output file.)
- if (has_depfile ||
- (*ni)->mtime() != disk_interface_->Stat((*ni)->path()))
+ if (!depfile.empty() ||
+ (*ni)->mtime() != disk_interface_->Stat((*ni)->path())) {
disk_interface_->RemoveFile((*ni)->path());
+ }
}
- if (has_depfile)
- disk_interface_->RemoveFile((*i)->EvaluateDepFile());
+ if (!depfile.empty())
+ disk_interface_->RemoveFile(depfile);
}
}
}
@@ -771,11 +772,11 @@ bool Builder::StartEdge(Edge* edge, string* err) {
// Create response file, if needed
// XXX: this may also block; do we care?
- if (edge->HasRspFile()) {
- if (!disk_interface_->WriteFile(edge->GetRspFile(),
- edge->GetRspFileContent())) {
+ string rspfile = edge->GetBinding("rspfile");
+ if (!rspfile.empty()) {
+ string content = edge->GetBinding("rspfile_content");
+ if (!disk_interface_->WriteFile(rspfile, content))
return false;
- }
}
// start command computing and run it
@@ -792,7 +793,7 @@ void Builder::FinishEdge(Edge* edge, bool success, const string& output) {
TimeStamp restat_mtime = 0;
if (success) {
- if (edge->rule().restat() && !config_.dry_run) {
+ if (edge->GetBindingBool("restat") && !config_.dry_run) {
bool node_cleaned = false;
for (vector<Node*>::iterator i = edge->outputs_.begin();
@@ -817,9 +818,9 @@ void Builder::FinishEdge(Edge* edge, bool success, const string& output) {
restat_mtime = input_mtime;
}
- if (restat_mtime != 0 && !edge->rule().depfile().empty()) {
- TimeStamp depfile_mtime =
- disk_interface_->Stat(edge->EvaluateDepFile());
+ string depfile = edge->GetBinding("depfile");
+ if (restat_mtime != 0 && !depfile.empty()) {
+ TimeStamp depfile_mtime = disk_interface_->Stat(depfile);
if (depfile_mtime > restat_mtime)
restat_mtime = depfile_mtime;
}
@@ -830,9 +831,10 @@ void Builder::FinishEdge(Edge* edge, bool success, const string& output) {
}
}
- // delete the response file on success (if exists)
- if (edge->HasRspFile())
- disk_interface_->RemoveFile(edge->GetRspFile());
+ // Delete the response file on success (if exists)
+ string rspfile = edge->GetBinding("rspfile");
+ if (!rspfile.empty())
+ disk_interface_->RemoveFile(rspfile);
plan_.EdgeFinished(edge);
}