1 // Copyright 2011 Google Inc. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "manifest_parser.h"
16 
17 #include <assert.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 
21 #include <vector>
22 
23 #include "graph.h"
24 #include "state.h"
25 #include "util.h"
26 #include "version.h"
27 
28 using namespace std;
29 
ManifestParser(State* state, FileReader* file_reader, ManifestParserOptions options)30 ManifestParser::ManifestParser(State* state, FileReader* file_reader,
31                                ManifestParserOptions options)
32     : Parser(state, file_reader),
33       options_(options), quiet_(false) {
34   env_ = &state->bindings_;
35 }
36 
Parse(const string& filename, const string& input, string* err)37 bool ManifestParser::Parse(const string& filename, const string& input,
38                            string* err) {
39   lexer_.Start(filename, input);
40 
41   for (;;) {
42     Lexer::Token token = lexer_.ReadToken();
43     switch (token) {
44     case Lexer::POOL:
45       if (!ParsePool(err))
46         return false;
47       break;
48     case Lexer::BUILD:
49       if (!ParseEdge(err))
50         return false;
51       break;
52     case Lexer::RULE:
53       if (!ParseRule(err))
54         return false;
55       break;
56     case Lexer::DEFAULT:
57       if (!ParseDefault(err))
58         return false;
59       break;
60     case Lexer::IDENT: {
61       lexer_.UnreadToken();
62       string name;
63       EvalString let_value;
64       if (!ParseLet(&name, &let_value, err))
65         return false;
66       string value = let_value.Evaluate(env_);
67       // Check ninja_required_version immediately so we can exit
68       // before encountering any syntactic surprises.
69       if (name == "ninja_required_version")
70         CheckNinjaVersion(value);
71       env_->AddBinding(name, value);
72       break;
73     }
74     case Lexer::INCLUDE:
75       if (!ParseFileInclude(false, err))
76         return false;
77       break;
78     case Lexer::SUBNINJA:
79       if (!ParseFileInclude(true, err))
80         return false;
81       break;
82     case Lexer::ERROR: {
83       return lexer_.Error(lexer_.DescribeLastError(), err);
84     }
85     case Lexer::TEOF:
86       return true;
87     case Lexer::NEWLINE:
88       break;
89     default:
90       return lexer_.Error(string("unexpected ") + Lexer::TokenName(token),
91                           err);
92     }
93   }
94   return false;  // not reached
95 }
96 
97 
ParsePool(string* err)98 bool ManifestParser::ParsePool(string* err) {
99   string name;
100   if (!lexer_.ReadIdent(&name))
101     return lexer_.Error("expected pool name", err);
102 
103   if (!ExpectToken(Lexer::NEWLINE, err))
104     return false;
105 
106   if (state_->LookupPool(name) != NULL)
107     return lexer_.Error("duplicate pool '" + name + "'", err);
108 
109   int depth = -1;
110 
111   while (lexer_.PeekToken(Lexer::INDENT)) {
112     string key;
113     EvalString value;
114     if (!ParseLet(&key, &value, err))
115       return false;
116 
117     if (key == "depth") {
118       string depth_string = value.Evaluate(env_);
119       depth = atol(depth_string.c_str());
120       if (depth < 0)
121         return lexer_.Error("invalid pool depth", err);
122     } else {
123       return lexer_.Error("unexpected variable '" + key + "'", err);
124     }
125   }
126 
127   if (depth < 0)
128     return lexer_.Error("expected 'depth =' line", err);
129 
130   state_->AddPool(new Pool(name, depth));
131   return true;
132 }
133 
134 
ParseRule(string* err)135 bool ManifestParser::ParseRule(string* err) {
136   string name;
137   if (!lexer_.ReadIdent(&name))
138     return lexer_.Error("expected rule name", err);
139 
140   if (!ExpectToken(Lexer::NEWLINE, err))
141     return false;
142 
143   if (env_->LookupRuleCurrentScope(name) != NULL)
144     return lexer_.Error("duplicate rule '" + name + "'", err);
145 
146   Rule* rule = new Rule(name);  // XXX scoped_ptr
147 
148   while (lexer_.PeekToken(Lexer::INDENT)) {
149     string key;
150     EvalString value;
151     if (!ParseLet(&key, &value, err))
152       return false;
153 
154     if (Rule::IsReservedBinding(key)) {
155       rule->AddBinding(key, value);
156     } else {
157       // Die on other keyvals for now; revisit if we want to add a
158       // scope here.
159       return lexer_.Error("unexpected variable '" + key + "'", err);
160     }
161   }
162 
163   if (rule->bindings_["rspfile"].empty() !=
164       rule->bindings_["rspfile_content"].empty()) {
165     return lexer_.Error("rspfile and rspfile_content need to be "
166                         "both specified", err);
167   }
168 
169   if (rule->bindings_["command"].empty())
170     return lexer_.Error("expected 'command =' line", err);
171 
172   env_->AddRule(rule);
173   return true;
174 }
175 
ParseLet(string* key, EvalString* value, string* err)176 bool ManifestParser::ParseLet(string* key, EvalString* value, string* err) {
177   if (!lexer_.ReadIdent(key))
178     return lexer_.Error("expected variable name", err);
179   if (!ExpectToken(Lexer::EQUALS, err))
180     return false;
181   if (!lexer_.ReadVarValue(value, err))
182     return false;
183   return true;
184 }
185 
ParseDefault(string* err)186 bool ManifestParser::ParseDefault(string* err) {
187   EvalString eval;
188   if (!lexer_.ReadPath(&eval, err))
189     return false;
190   if (eval.empty())
191     return lexer_.Error("expected target name", err);
192 
193   do {
194     string path = eval.Evaluate(env_);
195     if (path.empty())
196       return lexer_.Error("empty path", err);
197     uint64_t slash_bits;  // Unused because this only does lookup.
198     CanonicalizePath(&path, &slash_bits);
199     std::string default_err;
200     if (!state_->AddDefault(path, &default_err))
201       return lexer_.Error(default_err, err);
202 
203     eval.Clear();
204     if (!lexer_.ReadPath(&eval, err))
205       return false;
206   } while (!eval.empty());
207 
208   return ExpectToken(Lexer::NEWLINE, err);
209 }
210 
ParseEdge(string* err)211 bool ManifestParser::ParseEdge(string* err) {
212   vector<EvalString> ins, outs, validations;
213 
214   {
215     EvalString out;
216     if (!lexer_.ReadPath(&out, err))
217       return false;
218     while (!out.empty()) {
219       outs.push_back(out);
220 
221       out.Clear();
222       if (!lexer_.ReadPath(&out, err))
223         return false;
224     }
225   }
226 
227   // Add all implicit outs, counting how many as we go.
228   int implicit_outs = 0;
229   if (lexer_.PeekToken(Lexer::PIPE)) {
230     for (;;) {
231       EvalString out;
232       if (!lexer_.ReadPath(&out, err))
233         return false;
234       if (out.empty())
235         break;
236       outs.push_back(out);
237       ++implicit_outs;
238     }
239   }
240 
241   if (outs.empty())
242     return lexer_.Error("expected path", err);
243 
244   if (!ExpectToken(Lexer::COLON, err))
245     return false;
246 
247   string rule_name;
248   if (!lexer_.ReadIdent(&rule_name))
249     return lexer_.Error("expected build command name", err);
250 
251   const Rule* rule = env_->LookupRule(rule_name);
252   if (!rule)
253     return lexer_.Error("unknown build rule '" + rule_name + "'", err);
254 
255   for (;;) {
256     // XXX should we require one path here?
257     EvalString in;
258     if (!lexer_.ReadPath(&in, err))
259       return false;
260     if (in.empty())
261       break;
262     ins.push_back(in);
263   }
264 
265   // Add all implicit deps, counting how many as we go.
266   int implicit = 0;
267   if (lexer_.PeekToken(Lexer::PIPE)) {
268     for (;;) {
269       EvalString in;
270       if (!lexer_.ReadPath(&in, err))
271         return false;
272       if (in.empty())
273         break;
274       ins.push_back(in);
275       ++implicit;
276     }
277   }
278 
279   // Add all order-only deps, counting how many as we go.
280   int order_only = 0;
281   if (lexer_.PeekToken(Lexer::PIPE2)) {
282     for (;;) {
283       EvalString in;
284       if (!lexer_.ReadPath(&in, err))
285         return false;
286       if (in.empty())
287         break;
288       ins.push_back(in);
289       ++order_only;
290     }
291   }
292 
293   // Add all validations, counting how many as we go.
294   if (lexer_.PeekToken(Lexer::PIPEAT)) {
295     for (;;) {
296       EvalString validation;
297       if (!lexer_.ReadPath(&validation, err))
298         return false;
299       if (validation.empty())
300         break;
301       validations.push_back(validation);
302     }
303   }
304 
305   if (!ExpectToken(Lexer::NEWLINE, err))
306     return false;
307 
308   // Bindings on edges are rare, so allocate per-edge envs only when needed.
309   bool has_indent_token = lexer_.PeekToken(Lexer::INDENT);
310   BindingEnv* env = has_indent_token ? new BindingEnv(env_) : env_;
311   while (has_indent_token) {
312     string key;
313     EvalString val;
314     if (!ParseLet(&key, &val, err))
315       return false;
316 
317     env->AddBinding(key, val.Evaluate(env_));
318     has_indent_token = lexer_.PeekToken(Lexer::INDENT);
319   }
320 
321   Edge* edge = state_->AddEdge(rule);
322   edge->env_ = env;
323 
324   string pool_name = edge->GetBinding("pool");
325   if (!pool_name.empty()) {
326     Pool* pool = state_->LookupPool(pool_name);
327     if (pool == NULL)
328       return lexer_.Error("unknown pool name '" + pool_name + "'", err);
329     edge->pool_ = pool;
330   }
331 
332   edge->outputs_.reserve(outs.size());
333   for (size_t i = 0, e = outs.size(); i != e; ++i) {
334     string path = outs[i].Evaluate(env);
335     if (path.empty())
336       return lexer_.Error("empty path", err);
337     uint64_t slash_bits;
338     CanonicalizePath(&path, &slash_bits);
339     if (!state_->AddOut(edge, path, slash_bits)) {
340       if (options_.dupe_edge_action_ == kDupeEdgeActionError) {
341         lexer_.Error("multiple rules generate " + path, err);
342         return false;
343       } else {
344         if (!quiet_) {
345           Warning(
346               "multiple rules generate %s. builds involving this target will "
347               "not be correct; continuing anyway",
348               path.c_str());
349         }
350         if (e - i <= static_cast<size_t>(implicit_outs))
351           --implicit_outs;
352       }
353     }
354   }
355 
356   if (edge->outputs_.empty()) {
357     // All outputs of the edge are already created by other edges. Don't add
358     // this edge.  Do this check before input nodes are connected to the edge.
359     state_->edges_.pop_back();
360     delete edge;
361     return true;
362   }
363   edge->implicit_outs_ = implicit_outs;
364 
365   edge->inputs_.reserve(ins.size());
366   for (vector<EvalString>::iterator i = ins.begin(); i != ins.end(); ++i) {
367     string path = i->Evaluate(env);
368     if (path.empty())
369       return lexer_.Error("empty path", err);
370     uint64_t slash_bits;
371     CanonicalizePath(&path, &slash_bits);
372     state_->AddIn(edge, path, slash_bits);
373   }
374   edge->implicit_deps_ = implicit;
375   edge->order_only_deps_ = order_only;
376 
377   edge->validations_.reserve(validations.size());
378   for (std::vector<EvalString>::iterator v = validations.begin();
379       v != validations.end(); ++v) {
380     string path = v->Evaluate(env);
381     if (path.empty())
382       return lexer_.Error("empty path", err);
383     uint64_t slash_bits;
384     CanonicalizePath(&path, &slash_bits);
385     state_->AddValidation(edge, path, slash_bits);
386   }
387 
388   if (options_.phony_cycle_action_ == kPhonyCycleActionWarn &&
389       edge->maybe_phonycycle_diagnostic()) {
390     // CMake 2.8.12.x and 3.0.x incorrectly write phony build statements
391     // that reference themselves.  Ninja used to tolerate these in the
392     // build graph but that has since been fixed.  Filter them out to
393     // support users of those old CMake versions.
394     Node* out = edge->outputs_[0];
395     vector<Node*>::iterator new_end =
396         remove(edge->inputs_.begin(), edge->inputs_.end(), out);
397     if (new_end != edge->inputs_.end()) {
398       edge->inputs_.erase(new_end, edge->inputs_.end());
399       if (!quiet_) {
400         Warning("phony target '%s' names itself as an input; "
401                 "ignoring [-w phonycycle=warn]",
402                 out->path().c_str());
403       }
404     }
405   }
406 
407   // Lookup, validate, and save any dyndep binding.  It will be used later
408   // to load generated dependency information dynamically, but it must
409   // be one of our manifest-specified inputs.
410   string dyndep = edge->GetUnescapedDyndep();
411   if (!dyndep.empty()) {
412     uint64_t slash_bits;
413     CanonicalizePath(&dyndep, &slash_bits);
414     edge->dyndep_ = state_->GetNode(dyndep, slash_bits);
415     edge->dyndep_->set_dyndep_pending(true);
416     vector<Node*>::iterator dgi =
417       std::find(edge->inputs_.begin(), edge->inputs_.end(), edge->dyndep_);
418     if (dgi == edge->inputs_.end()) {
419       return lexer_.Error("dyndep '" + dyndep + "' is not an input", err);
420     }
421     assert(!edge->dyndep_->generated_by_dep_loader());
422   }
423 
424   return true;
425 }
426 
ParseFileInclude(bool new_scope, string* err)427 bool ManifestParser::ParseFileInclude(bool new_scope, string* err) {
428   EvalString eval;
429   if (!lexer_.ReadPath(&eval, err))
430     return false;
431   string path = eval.Evaluate(env_);
432 
433   ManifestParser subparser(state_, file_reader_, options_);
434   if (new_scope) {
435     subparser.env_ = new BindingEnv(env_);
436   } else {
437     subparser.env_ = env_;
438   }
439 
440   if (!subparser.Load(path, err, &lexer_))
441     return false;
442 
443   if (!ExpectToken(Lexer::NEWLINE, err))
444     return false;
445 
446   return true;
447 }
448