27 : state_(state), file_reader_(file_reader) {
34 *err =
"loading '" + filename +
"': " + read_err;
37 contents.resize(contents.size() + 10);
38 return Parse(filename, contents, err);
69 if (!
ParseLet(&name, &let_value, err))
74 if (name ==
"ninja_required_version")
112 return lexer_.
Error(
"duplicate pool '" + name +
"'", err);
122 if (key ==
"depth") {
124 depth = atol(depth_string.c_str());
128 return lexer_.
Error(
"unexpected variable '" + key +
"'", err);
133 return lexer_.
Error(
"expected 'depth =' line", err);
149 *err =
"duplicate rule '" + name +
"'";
166 return lexer_.
Error(
"unexpected variable '" + key +
"'", err);
170 if (rule->
bindings_[
"rspfile"].empty() !=
171 rule->
bindings_[
"rspfile_content"].empty()) {
172 return lexer_.
Error(
"rspfile and rspfile_content need to be "
173 "both specified", err);
177 return lexer_.
Error(
"expected 'command =' line", err);
211 }
while (!eval.
empty());
220 vector<EvalString> ins, outs;
235 }
while (!out.
empty());
243 return lexer_.
Error(
"expected build command name", err);
247 return lexer_.
Error(
"unknown build rule '" + rule_name +
"'", err);
306 if (!pool_name.empty()) {
313 for (vector<EvalString>::iterator i = ins.begin(); i != ins.end(); ++i) {
314 string path = i->Evaluate(env);
320 for (vector<EvalString>::iterator i = outs.begin(); i != outs.end(); ++i) {
321 string path = i->Evaluate(env);
332 if (!deps_type.empty() && edge->
outputs_.size() > 1) {
333 return lexer_.
Error(
"multiple outputs aren't (yet?) supported by depslog; "
334 "bring this up on the mailing list if it affects you",
351 return lexer_.
Error(
"loading '" + path +
"': " + read_err, err);
360 if (!subparser.
Parse(path, contents, err))
371 if (token != expected) {