summaryrefslogtreecommitdiffstats
path: root/src/manifest_parser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/manifest_parser.cc')
-rw-r--r--src/manifest_parser.cc76
1 files changed, 25 insertions, 51 deletions
diff --git a/src/manifest_parser.cc b/src/manifest_parser.cc
index 2d052b5..9d17932 100644
--- a/src/manifest_parser.cc
+++ b/src/manifest_parser.cc
@@ -154,22 +154,8 @@ bool ManifestParser::ParseRule(string* err) {
if (!ParseLet(&key, &value, err))
return false;
- if (key == "command") {
- rule->command_ = value;
- } else if (key == "depfile") {
- rule->depfile_ = value;
- } else if (key == "description") {
- rule->description_ = value;
- } else if (key == "generator") {
- rule->generator_ = true;
- } else if (key == "restat") {
- rule->restat_ = true;
- } else if (key == "rspfile") {
- rule->rspfile_ = value;
- } else if (key == "rspfile_content") {
- rule->rspfile_content_ = value;
- } else if (key == "pool") {
- rule->pool_ = value;
+ if (Rule::IsReservedBinding(key)) {
+ rule->AddBinding(key, value);
} else {
// Die on other keyvals for now; revisit if we want to add a
// scope here.
@@ -177,12 +163,13 @@ bool ManifestParser::ParseRule(string* err) {
}
}
- if (rule->rspfile_.empty() != rule->rspfile_content_.empty()) {
- return lexer_.Error("rspfile and rspfile_content need to be both specified",
- err);
+ if (rule->bindings_["rspfile"].empty() !=
+ rule->bindings_["rspfile_content"].empty()) {
+ return lexer_.Error("rspfile and rspfile_content need to be "
+ "both specified", err);
}
- if (rule->command_.empty())
+ if (rule->bindings_["command"].empty())
return lexer_.Error("expected 'command =' line", err);
state_->AddRule(rule);
@@ -296,42 +283,29 @@ bool ManifestParser::ParseEdge(string* err) {
if (!ExpectToken(Lexer::NEWLINE, err))
return false;
- // Default to using outer env.
- BindingEnv* env = env_;
- Pool* pool = NULL;
+ // XXX scoped_ptr to handle error case.
+ BindingEnv* env = new BindingEnv(env_);
- // But create and fill a nested env if there are variables in scope.
- if (lexer_.PeekToken(Lexer::INDENT)) {
- // XXX scoped_ptr to handle error case.
- env = new BindingEnv(env_);
- do {
- string key;
- EvalString val;
- if (!ParseLet(&key, &val, err))
- return false;
- if (key == "pool") {
- string pool_name = val.Evaluate(env_);
- pool = state_->LookupPool(pool_name);
- if (pool == NULL)
- return lexer_.Error("undefined pool '" + pool_name + "'", err);
- } else {
- env->AddBinding(key, val.Evaluate(env_));
- }
- } while (lexer_.PeekToken(Lexer::INDENT));
- }
+ while (lexer_.PeekToken(Lexer::INDENT)) {
+ string key;
+ EvalString val;
+ if (!ParseLet(&key, &val, err))
+ return false;
- if (pool == NULL) {
- if (!rule->pool_.empty()) {
- pool = state_->LookupPool(rule->pool_.Evaluate(env_));
- if (pool == NULL)
- return lexer_.Error("cannot resolve pool for this edge.", err);
- } else {
- pool = &State::kDefaultPool;
- }
+ env->AddBinding(key, val.Evaluate(env_));
}
- Edge* edge = state_->AddEdge(rule, pool);
+ Edge* edge = state_->AddEdge(rule);
edge->env_ = env;
+
+ string pool_name = edge->GetBinding("pool");
+ if (!pool_name.empty()) {
+ Pool* pool = state_->LookupPool(pool_name);
+ if (pool == NULL)
+ return lexer_.Error("unknown pool name", err);
+ edge->pool_ = pool;
+ }
+
for (vector<EvalString>::iterator i = ins.begin(); i != ins.end(); ++i) {
string path = i->Evaluate(env);
string path_err;