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 "build.h"
16
17 #include <assert.h>
18 #include <errno.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <functional>
22
23 #if defined(__SVR4) && defined(__sun)
24 #include <sys/termios.h>
25 #endif
26
27 #include "build_log.h"
28 #include "clparser.h"
29 #include "debug_flags.h"
30 #include "depfile_parser.h"
31 #include "deps_log.h"
32 #include "disk_interface.h"
33 #include "graph.h"
34 #include "metrics.h"
35 #include "state.h"
36 #include "status.h"
37 #include "subprocess.h"
38 #include "util.h"
39
40 using namespace std;
41
42 namespace {
43
44 /// A CommandRunner that doesn't actually run the commands.
45 struct DryRunCommandRunner : public CommandRunner {
~DryRunCommandRunner__anon7fbae7dd0111::DryRunCommandRunner46 virtual ~DryRunCommandRunner() {}
47
48 // Overridden from CommandRunner:
49 virtual bool CanRunMore() const;
50 virtual bool StartCommand(Edge* edge);
51 virtual bool WaitForCommand(Result* result);
52
53 private:
54 queue<Edge*> finished_;
55 };
56
CanRunMore() const57 bool DryRunCommandRunner::CanRunMore() const {
58 return true;
59 }
60
StartCommand(Edge * edge)61 bool DryRunCommandRunner::StartCommand(Edge* edge) {
62 finished_.push(edge);
63 return true;
64 }
65
WaitForCommand(Result * result)66 bool DryRunCommandRunner::WaitForCommand(Result* result) {
67 if (finished_.empty())
68 return false;
69
70 result->status = ExitSuccess;
71 result->edge = finished_.front();
72 finished_.pop();
73 return true;
74 }
75
76 } // namespace
77
Plan(Builder * builder)78 Plan::Plan(Builder* builder)
79 : builder_(builder)
80 , command_edges_(0)
81 , wanted_edges_(0)
82 {}
83
Reset()84 void Plan::Reset() {
85 command_edges_ = 0;
86 wanted_edges_ = 0;
87 ready_.clear();
88 want_.clear();
89 }
90
AddTarget(const Node * target,string * err)91 bool Plan::AddTarget(const Node* target, string* err) {
92 return AddSubTarget(target, NULL, err, NULL);
93 }
94
AddSubTarget(const Node * node,const Node * dependent,string * err,set<Edge * > * dyndep_walk)95 bool Plan::AddSubTarget(const Node* node, const Node* dependent, string* err,
96 set<Edge*>* dyndep_walk) {
97 Edge* edge = node->in_edge();
98 if (!edge) { // Leaf node.
99 if (node->dirty()) {
100 string referenced;
101 if (dependent)
102 referenced = ", needed by '" + dependent->path() + "',";
103 *err = "'" + node->path() + "'" + referenced + " missing "
104 "and no known rule to make it";
105 }
106 return false;
107 }
108
109 if (edge->outputs_ready())
110 return false; // Don't need to do anything.
111
112 // If an entry in want_ does not already exist for edge, create an entry which
113 // maps to kWantNothing, indicating that we do not want to build this entry itself.
114 pair<map<Edge*, Want>::iterator, bool> want_ins =
115 want_.insert(make_pair(edge, kWantNothing));
116 Want& want = want_ins.first->second;
117
118 if (dyndep_walk && want == kWantToFinish)
119 return false; // Don't need to do anything with already-scheduled edge.
120
121 // If we do need to build edge and we haven't already marked it as wanted,
122 // mark it now.
123 if (node->dirty() && want == kWantNothing) {
124 want = kWantToStart;
125 EdgeWanted(edge);
126 if (!dyndep_walk && edge->AllInputsReady())
127 ScheduleWork(want_ins.first);
128 }
129
130 if (dyndep_walk)
131 dyndep_walk->insert(edge);
132
133 if (!want_ins.second)
134 return true; // We've already processed the inputs.
135
136 for (vector<Node*>::iterator i = edge->inputs_.begin();
137 i != edge->inputs_.end(); ++i) {
138 if (!AddSubTarget(*i, node, err, dyndep_walk) && !err->empty())
139 return false;
140 }
141
142 return true;
143 }
144
EdgeWanted(const Edge * edge)145 void Plan::EdgeWanted(const Edge* edge) {
146 ++wanted_edges_;
147 if (!edge->is_phony())
148 ++command_edges_;
149 }
150
FindWork()151 Edge* Plan::FindWork() {
152 if (ready_.empty())
153 return NULL;
154 EdgeSet::iterator e = ready_.begin();
155 Edge* edge = *e;
156 ready_.erase(e);
157 return edge;
158 }
159
ScheduleWork(map<Edge *,Want>::iterator want_e)160 void Plan::ScheduleWork(map<Edge*, Want>::iterator want_e) {
161 if (want_e->second == kWantToFinish) {
162 // This edge has already been scheduled. We can get here again if an edge
163 // and one of its dependencies share an order-only input, or if a node
164 // duplicates an out edge (see https://github.com/ninja-build/ninja/pull/519).
165 // Avoid scheduling the work again.
166 return;
167 }
168 assert(want_e->second == kWantToStart);
169 want_e->second = kWantToFinish;
170
171 Edge* edge = want_e->first;
172 Pool* pool = edge->pool();
173 if (pool->ShouldDelayEdge()) {
174 pool->DelayEdge(edge);
175 pool->RetrieveReadyEdges(&ready_);
176 } else {
177 pool->EdgeScheduled(*edge);
178 ready_.insert(edge);
179 }
180 }
181
EdgeFinished(Edge * edge,EdgeResult result,string * err)182 bool Plan::EdgeFinished(Edge* edge, EdgeResult result, string* err) {
183 map<Edge*, Want>::iterator e = want_.find(edge);
184 assert(e != want_.end());
185 bool directly_wanted = e->second != kWantNothing;
186
187 // See if this job frees up any delayed jobs.
188 if (directly_wanted)
189 edge->pool()->EdgeFinished(*edge);
190 edge->pool()->RetrieveReadyEdges(&ready_);
191
192 // The rest of this function only applies to successful commands.
193 if (result != kEdgeSucceeded)
194 return true;
195
196 if (directly_wanted)
197 --wanted_edges_;
198 want_.erase(e);
199 edge->outputs_ready_ = true;
200
201 // Check off any nodes we were waiting for with this edge.
202 for (vector<Node*>::iterator o = edge->outputs_.begin();
203 o != edge->outputs_.end(); ++o) {
204 if (!NodeFinished(*o, err))
205 return false;
206 }
207 return true;
208 }
209
NodeFinished(Node * node,string * err)210 bool Plan::NodeFinished(Node* node, string* err) {
211 // If this node provides dyndep info, load it now.
212 if (node->dyndep_pending()) {
213 assert(builder_ && "dyndep requires Plan to have a Builder");
214 // Load the now-clean dyndep file. This will also update the
215 // build plan and schedule any new work that is ready.
216 return builder_->LoadDyndeps(node, err);
217 }
218
219 // See if we we want any edges from this node.
220 for (vector<Edge*>::const_iterator oe = node->out_edges().begin();
221 oe != node->out_edges().end(); ++oe) {
222 map<Edge*, Want>::iterator want_e = want_.find(*oe);
223 if (want_e == want_.end())
224 continue;
225
226 // See if the edge is now ready.
227 if (!EdgeMaybeReady(want_e, err))
228 return false;
229 }
230 return true;
231 }
232
EdgeMaybeReady(map<Edge *,Want>::iterator want_e,string * err)233 bool Plan::EdgeMaybeReady(map<Edge*, Want>::iterator want_e, string* err) {
234 Edge* edge = want_e->first;
235 if (edge->AllInputsReady()) {
236 if (want_e->second != kWantNothing) {
237 ScheduleWork(want_e);
238 } else {
239 // We do not need to build this edge, but we might need to build one of
240 // its dependents.
241 if (!EdgeFinished(edge, kEdgeSucceeded, err))
242 return false;
243 }
244 }
245 return true;
246 }
247
CleanNode(DependencyScan * scan,Node * node,string * err)248 bool Plan::CleanNode(DependencyScan* scan, Node* node, string* err) {
249 node->set_dirty(false);
250
251 for (vector<Edge*>::const_iterator oe = node->out_edges().begin();
252 oe != node->out_edges().end(); ++oe) {
253 // Don't process edges that we don't actually want.
254 map<Edge*, Want>::iterator want_e = want_.find(*oe);
255 if (want_e == want_.end() || want_e->second == kWantNothing)
256 continue;
257
258 // Don't attempt to clean an edge if it failed to load deps.
259 if ((*oe)->deps_missing_)
260 continue;
261
262 // If all non-order-only inputs for this edge are now clean,
263 // we might have changed the dirty state of the outputs.
264 vector<Node*>::iterator
265 begin = (*oe)->inputs_.begin(),
266 end = (*oe)->inputs_.end() - (*oe)->order_only_deps_;
267 #if __cplusplus < 201703L
268 #define MEM_FN mem_fun
269 #else
270 #define MEM_FN mem_fn // mem_fun was removed in C++17.
271 #endif
272 if (find_if(begin, end, MEM_FN(&Node::dirty)) == end) {
273 // Recompute most_recent_input.
274 Node* most_recent_input = NULL;
275 for (vector<Node*>::iterator i = begin; i != end; ++i) {
276 if (!most_recent_input || (*i)->mtime() > most_recent_input->mtime())
277 most_recent_input = *i;
278 }
279
280 // Now, this edge is dirty if any of the outputs are dirty.
281 // If the edge isn't dirty, clean the outputs and mark the edge as not
282 // wanted.
283 bool outputs_dirty = false;
284 if (!scan->RecomputeOutputsDirty(*oe, most_recent_input,
285 &outputs_dirty, err)) {
286 return false;
287 }
288 if (!outputs_dirty) {
289 for (vector<Node*>::iterator o = (*oe)->outputs_.begin();
290 o != (*oe)->outputs_.end(); ++o) {
291 if (!CleanNode(scan, *o, err))
292 return false;
293 }
294
295 want_e->second = kWantNothing;
296 --wanted_edges_;
297 if (!(*oe)->is_phony())
298 --command_edges_;
299 }
300 }
301 }
302 return true;
303 }
304
DyndepsLoaded(DependencyScan * scan,const Node * node,const DyndepFile & ddf,string * err)305 bool Plan::DyndepsLoaded(DependencyScan* scan, const Node* node,
306 const DyndepFile& ddf, string* err) {
307 // Recompute the dirty state of all our direct and indirect dependents now
308 // that our dyndep information has been loaded.
309 if (!RefreshDyndepDependents(scan, node, err))
310 return false;
311
312 // We loaded dyndep information for those out_edges of the dyndep node that
313 // specify the node in a dyndep binding, but they may not be in the plan.
314 // Starting with those already in the plan, walk newly-reachable portion
315 // of the graph through the dyndep-discovered dependencies.
316
317 // Find edges in the the build plan for which we have new dyndep info.
318 std::vector<DyndepFile::const_iterator> dyndep_roots;
319 for (DyndepFile::const_iterator oe = ddf.begin(); oe != ddf.end(); ++oe) {
320 Edge* edge = oe->first;
321
322 // If the edge outputs are ready we do not need to consider it here.
323 if (edge->outputs_ready())
324 continue;
325
326 map<Edge*, Want>::iterator want_e = want_.find(edge);
327
328 // If the edge has not been encountered before then nothing already in the
329 // plan depends on it so we do not need to consider the edge yet either.
330 if (want_e == want_.end())
331 continue;
332
333 // This edge is already in the plan so queue it for the walk.
334 dyndep_roots.push_back(oe);
335 }
336
337 // Walk dyndep-discovered portion of the graph to add it to the build plan.
338 std::set<Edge*> dyndep_walk;
339 for (std::vector<DyndepFile::const_iterator>::iterator
340 oei = dyndep_roots.begin(); oei != dyndep_roots.end(); ++oei) {
341 DyndepFile::const_iterator oe = *oei;
342 for (vector<Node*>::const_iterator i = oe->second.implicit_inputs_.begin();
343 i != oe->second.implicit_inputs_.end(); ++i) {
344 if (!AddSubTarget(*i, oe->first->outputs_[0], err, &dyndep_walk) &&
345 !err->empty())
346 return false;
347 }
348 }
349
350 // Add out edges from this node that are in the plan (just as
351 // Plan::NodeFinished would have without taking the dyndep code path).
352 for (vector<Edge*>::const_iterator oe = node->out_edges().begin();
353 oe != node->out_edges().end(); ++oe) {
354 map<Edge*, Want>::iterator want_e = want_.find(*oe);
355 if (want_e == want_.end())
356 continue;
357 dyndep_walk.insert(want_e->first);
358 }
359
360 // See if any encountered edges are now ready.
361 for (set<Edge*>::iterator wi = dyndep_walk.begin();
362 wi != dyndep_walk.end(); ++wi) {
363 map<Edge*, Want>::iterator want_e = want_.find(*wi);
364 if (want_e == want_.end())
365 continue;
366 if (!EdgeMaybeReady(want_e, err))
367 return false;
368 }
369
370 return true;
371 }
372
RefreshDyndepDependents(DependencyScan * scan,const Node * node,string * err)373 bool Plan::RefreshDyndepDependents(DependencyScan* scan, const Node* node,
374 string* err) {
375 // Collect the transitive closure of dependents and mark their edges
376 // as not yet visited by RecomputeDirty.
377 set<Node*> dependents;
378 UnmarkDependents(node, &dependents);
379
380 // Update the dirty state of all dependents and check if their edges
381 // have become wanted.
382 for (set<Node*>::iterator i = dependents.begin();
383 i != dependents.end(); ++i) {
384 Node* n = *i;
385
386 // Check if this dependent node is now dirty. Also checks for new cycles.
387 std::vector<Node*> validation_nodes;
388 if (!scan->RecomputeDirty(n, &validation_nodes, err))
389 return false;
390
391 // Add any validation nodes found during RecomputeDirty as new top level
392 // targets.
393 for (std::vector<Node*>::iterator v = validation_nodes.begin();
394 v != validation_nodes.end(); ++v) {
395 if (Edge* in_edge = (*v)->in_edge()) {
396 if (!in_edge->outputs_ready() &&
397 !AddTarget(*v, err)) {
398 return false;
399 }
400 }
401 }
402 if (!n->dirty())
403 continue;
404
405 // This edge was encountered before. However, we may not have wanted to
406 // build it if the outputs were not known to be dirty. With dyndep
407 // information an output is now known to be dirty, so we want the edge.
408 Edge* edge = n->in_edge();
409 assert(edge && !edge->outputs_ready());
410 map<Edge*, Want>::iterator want_e = want_.find(edge);
411 assert(want_e != want_.end());
412 if (want_e->second == kWantNothing) {
413 want_e->second = kWantToStart;
414 EdgeWanted(edge);
415 }
416 }
417 return true;
418 }
419
UnmarkDependents(const Node * node,set<Node * > * dependents)420 void Plan::UnmarkDependents(const Node* node, set<Node*>* dependents) {
421 for (vector<Edge*>::const_iterator oe = node->out_edges().begin();
422 oe != node->out_edges().end(); ++oe) {
423 Edge* edge = *oe;
424
425 map<Edge*, Want>::iterator want_e = want_.find(edge);
426 if (want_e == want_.end())
427 continue;
428
429 if (edge->mark_ != Edge::VisitNone) {
430 edge->mark_ = Edge::VisitNone;
431 for (vector<Node*>::iterator o = edge->outputs_.begin();
432 o != edge->outputs_.end(); ++o) {
433 if (dependents->insert(*o).second)
434 UnmarkDependents(*o, dependents);
435 }
436 }
437 }
438 }
439
Dump() const440 void Plan::Dump() const {
441 printf("pending: %d\n", (int)want_.size());
442 for (map<Edge*, Want>::const_iterator e = want_.begin(); e != want_.end(); ++e) {
443 if (e->second != kWantNothing)
444 printf("want ");
445 e->first->Dump();
446 }
447 printf("ready: %d\n", (int)ready_.size());
448 }
449
450 struct RealCommandRunner : public CommandRunner {
RealCommandRunnerRealCommandRunner451 explicit RealCommandRunner(const BuildConfig& config) : config_(config) {}
~RealCommandRunnerRealCommandRunner452 virtual ~RealCommandRunner() {}
453 virtual bool CanRunMore() const;
454 virtual bool StartCommand(Edge* edge);
455 virtual bool WaitForCommand(Result* result);
456 virtual vector<Edge*> GetActiveEdges();
457 virtual void Abort();
458
459 const BuildConfig& config_;
460 SubprocessSet subprocs_;
461 map<const Subprocess*, Edge*> subproc_to_edge_;
462 };
463
GetActiveEdges()464 vector<Edge*> RealCommandRunner::GetActiveEdges() {
465 vector<Edge*> edges;
466 for (map<const Subprocess*, Edge*>::iterator e = subproc_to_edge_.begin();
467 e != subproc_to_edge_.end(); ++e)
468 edges.push_back(e->second);
469 return edges;
470 }
471
Abort()472 void RealCommandRunner::Abort() {
473 subprocs_.Clear();
474 }
475
CanRunMore() const476 bool RealCommandRunner::CanRunMore() const {
477 size_t subproc_number =
478 subprocs_.running_.size() + subprocs_.finished_.size();
479 return (int)subproc_number < config_.parallelism
480 && ((subprocs_.running_.empty() || config_.max_load_average <= 0.0f)
481 || GetLoadAverage() < config_.max_load_average);
482 }
483
StartCommand(Edge * edge)484 bool RealCommandRunner::StartCommand(Edge* edge) {
485 string command = edge->EvaluateCommand();
486 Subprocess* subproc = subprocs_.Add(command, edge->use_console());
487 if (!subproc)
488 return false;
489 subproc_to_edge_.insert(make_pair(subproc, edge));
490
491 return true;
492 }
493
WaitForCommand(Result * result)494 bool RealCommandRunner::WaitForCommand(Result* result) {
495 Subprocess* subproc;
496 while ((subproc = subprocs_.NextFinished()) == NULL) {
497 bool interrupted = subprocs_.DoWork();
498 if (interrupted)
499 return false;
500 }
501
502 result->status = subproc->Finish();
503 result->output = subproc->GetOutput();
504
505 map<const Subprocess*, Edge*>::iterator e = subproc_to_edge_.find(subproc);
506 result->edge = e->second;
507 subproc_to_edge_.erase(e);
508
509 delete subproc;
510 return true;
511 }
512
Builder(State * state,const BuildConfig & config,BuildLog * build_log,DepsLog * deps_log,DiskInterface * disk_interface,Status * status,int64_t start_time_millis)513 Builder::Builder(State* state, const BuildConfig& config,
514 BuildLog* build_log, DepsLog* deps_log,
515 DiskInterface* disk_interface, Status *status,
516 int64_t start_time_millis)
517 : state_(state), config_(config), plan_(this), status_(status),
518 start_time_millis_(start_time_millis), disk_interface_(disk_interface),
519 scan_(state, build_log, deps_log, disk_interface,
520 &config_.depfile_parser_options) {
521 }
522
~Builder()523 Builder::~Builder() {
524 Cleanup();
525 }
526
Cleanup()527 void Builder::Cleanup() {
528 if (command_runner_.get()) {
529 vector<Edge*> active_edges = command_runner_->GetActiveEdges();
530 command_runner_->Abort();
531
532 for (vector<Edge*>::iterator e = active_edges.begin();
533 e != active_edges.end(); ++e) {
534 string depfile = (*e)->GetUnescapedDepfile();
535 for (vector<Node*>::iterator o = (*e)->outputs_.begin();
536 o != (*e)->outputs_.end(); ++o) {
537 // Only delete this output if it was actually modified. This is
538 // important for things like the generator where we don't want to
539 // delete the manifest file if we can avoid it. But if the rule
540 // uses a depfile, always delete. (Consider the case where we
541 // need to rebuild an output because of a modified header file
542 // mentioned in a depfile, and the command touches its depfile
543 // but is interrupted before it touches its output file.)
544 string err;
545 TimeStamp new_mtime = disk_interface_->Stat((*o)->path(), &err);
546 if (new_mtime == -1) // Log and ignore Stat() errors.
547 status_->Error("%s", err.c_str());
548 if (!depfile.empty() || (*o)->mtime() != new_mtime)
549 disk_interface_->RemoveFile((*o)->path());
550 }
551 if (!depfile.empty())
552 disk_interface_->RemoveFile(depfile);
553 }
554 }
555 }
556
AddTarget(const string & name,string * err)557 Node* Builder::AddTarget(const string& name, string* err) {
558 Node* node = state_->LookupNode(name);
559 if (!node) {
560 *err = "unknown target: '" + name + "'";
561 return NULL;
562 }
563 if (!AddTarget(node, err))
564 return NULL;
565 return node;
566 }
567
AddTarget(Node * target,string * err)568 bool Builder::AddTarget(Node* target, string* err) {
569 std::vector<Node*> validation_nodes;
570 if (!scan_.RecomputeDirty(target, &validation_nodes, err))
571 return false;
572
573 Edge* in_edge = target->in_edge();
574 if (!in_edge || !in_edge->outputs_ready()) {
575 if (!plan_.AddTarget(target, err)) {
576 return false;
577 }
578 }
579
580 // Also add any validation nodes found during RecomputeDirty as top level
581 // targets.
582 for (std::vector<Node*>::iterator n = validation_nodes.begin();
583 n != validation_nodes.end(); ++n) {
584 if (Edge* validation_in_edge = (*n)->in_edge()) {
585 if (!validation_in_edge->outputs_ready() &&
586 !plan_.AddTarget(*n, err)) {
587 return false;
588 }
589 }
590 }
591
592 return true;
593 }
594
AlreadyUpToDate() const595 bool Builder::AlreadyUpToDate() const {
596 return !plan_.more_to_do();
597 }
598
Build(string * err)599 bool Builder::Build(string* err) {
600 assert(!AlreadyUpToDate());
601
602 status_->PlanHasTotalEdges(plan_.command_edge_count());
603 int pending_commands = 0;
604 int failures_allowed = config_.failures_allowed;
605
606 // Set up the command runner if we haven't done so already.
607 if (!command_runner_.get()) {
608 if (config_.dry_run)
609 command_runner_.reset(new DryRunCommandRunner);
610 else
611 command_runner_.reset(new RealCommandRunner(config_));
612 }
613
614 // We are about to start the build process.
615 status_->BuildStarted();
616
617 // This main loop runs the entire build process.
618 // It is structured like this:
619 // First, we attempt to start as many commands as allowed by the
620 // command runner.
621 // Second, we attempt to wait for / reap the next finished command.
622 while (plan_.more_to_do()) {
623 // See if we can start any more commands.
624 if (failures_allowed && command_runner_->CanRunMore()) {
625 if (Edge* edge = plan_.FindWork()) {
626 if (edge->GetBindingBool("generator")) {
627 scan_.build_log()->Close();
628 }
629
630 if (!StartEdge(edge, err)) {
631 Cleanup();
632 status_->BuildFinished();
633 return false;
634 }
635
636 if (edge->is_phony()) {
637 if (!plan_.EdgeFinished(edge, Plan::kEdgeSucceeded, err)) {
638 Cleanup();
639 status_->BuildFinished();
640 return false;
641 }
642 } else {
643 ++pending_commands;
644 }
645
646 // We made some progress; go back to the main loop.
647 continue;
648 }
649 }
650
651 // See if we can reap any finished commands.
652 if (pending_commands) {
653 CommandRunner::Result result;
654 if (!command_runner_->WaitForCommand(&result) ||
655 result.status == ExitInterrupted) {
656 Cleanup();
657 status_->BuildFinished();
658 *err = "interrupted by user";
659 return false;
660 }
661
662 --pending_commands;
663 if (!FinishCommand(&result, err)) {
664 Cleanup();
665 status_->BuildFinished();
666 return false;
667 }
668
669 if (!result.success()) {
670 if (failures_allowed)
671 failures_allowed--;
672 }
673
674 // We made some progress; start the main loop over.
675 continue;
676 }
677
678 // If we get here, we cannot make any more progress.
679 status_->BuildFinished();
680 if (failures_allowed == 0) {
681 if (config_.failures_allowed > 1)
682 *err = "subcommands failed";
683 else
684 *err = "subcommand failed";
685 } else if (failures_allowed < config_.failures_allowed)
686 *err = "cannot make progress due to previous errors";
687 else
688 *err = "stuck [this is a bug]";
689
690 return false;
691 }
692
693 status_->BuildFinished();
694 return true;
695 }
696
StartEdge(Edge * edge,string * err)697 bool Builder::StartEdge(Edge* edge, string* err) {
698 METRIC_RECORD("StartEdge");
699 if (edge->is_phony())
700 return true;
701
702 int64_t start_time_millis = GetTimeMillis() - start_time_millis_;
703 running_edges_.insert(make_pair(edge, start_time_millis));
704
705 status_->BuildEdgeStarted(edge, start_time_millis);
706
707 // Create directories necessary for outputs.
708 // XXX: this will block; do we care?
709 for (vector<Node*>::iterator o = edge->outputs_.begin();
710 o != edge->outputs_.end(); ++o) {
711 if (!disk_interface_->MakeDirs((*o)->path()))
712 return false;
713 }
714
715 // Create response file, if needed
716 // XXX: this may also block; do we care?
717 string rspfile = edge->GetUnescapedRspfile();
718 if (!rspfile.empty()) {
719 string content = edge->GetBinding("rspfile_content");
720 if (!disk_interface_->WriteFile(rspfile, content))
721 return false;
722 }
723
724 // start command computing and run it
725 if (!command_runner_->StartCommand(edge)) {
726 err->assign("command '" + edge->EvaluateCommand() + "' failed.");
727 return false;
728 }
729
730 return true;
731 }
732
FinishCommand(CommandRunner::Result * result,string * err)733 bool Builder::FinishCommand(CommandRunner::Result* result, string* err) {
734 METRIC_RECORD("FinishCommand");
735
736 Edge* edge = result->edge;
737
738 // First try to extract dependencies from the result, if any.
739 // This must happen first as it filters the command output (we want
740 // to filter /showIncludes output, even on compile failure) and
741 // extraction itself can fail, which makes the command fail from a
742 // build perspective.
743 vector<Node*> deps_nodes;
744 string deps_type = edge->GetBinding("deps");
745 const string deps_prefix = edge->GetBinding("msvc_deps_prefix");
746 if (!deps_type.empty()) {
747 string extract_err;
748 if (!ExtractDeps(result, deps_type, deps_prefix, &deps_nodes,
749 &extract_err) &&
750 result->success()) {
751 if (!result->output.empty())
752 result->output.append("\n");
753 result->output.append(extract_err);
754 result->status = ExitFailure;
755 }
756 }
757
758 int64_t start_time_millis, end_time_millis;
759 RunningEdgeMap::iterator it = running_edges_.find(edge);
760 start_time_millis = it->second;
761 end_time_millis = GetTimeMillis() - start_time_millis_;
762 running_edges_.erase(it);
763
764 status_->BuildEdgeFinished(edge, end_time_millis, result->success(),
765 result->output);
766
767 // The rest of this function only applies to successful commands.
768 if (!result->success()) {
769 return plan_.EdgeFinished(edge, Plan::kEdgeFailed, err);
770 }
771
772 // Restat the edge outputs
773 TimeStamp output_mtime = 0;
774 bool restat = edge->GetBindingBool("restat");
775 if (!config_.dry_run) {
776 bool node_cleaned = false;
777
778 for (vector<Node*>::iterator o = edge->outputs_.begin();
779 o != edge->outputs_.end(); ++o) {
780 TimeStamp new_mtime = disk_interface_->Stat((*o)->path(), err);
781 if (new_mtime == -1)
782 return false;
783 if (new_mtime > output_mtime)
784 output_mtime = new_mtime;
785 if ((*o)->mtime() == new_mtime && restat) {
786 // The rule command did not change the output. Propagate the clean
787 // state through the build graph.
788 // Note that this also applies to nonexistent outputs (mtime == 0).
789 if (!plan_.CleanNode(&scan_, *o, err))
790 return false;
791 node_cleaned = true;
792 }
793 }
794
795 if (node_cleaned) {
796 TimeStamp restat_mtime = 0;
797 // If any output was cleaned, find the most recent mtime of any
798 // (existing) non-order-only input or the depfile.
799 for (vector<Node*>::iterator i = edge->inputs_.begin();
800 i != edge->inputs_.end() - edge->order_only_deps_; ++i) {
801 TimeStamp input_mtime = disk_interface_->Stat((*i)->path(), err);
802 if (input_mtime == -1)
803 return false;
804 if (input_mtime > restat_mtime)
805 restat_mtime = input_mtime;
806 }
807
808 string depfile = edge->GetUnescapedDepfile();
809 if (restat_mtime != 0 && deps_type.empty() && !depfile.empty()) {
810 TimeStamp depfile_mtime = disk_interface_->Stat(depfile, err);
811 if (depfile_mtime == -1)
812 return false;
813 if (depfile_mtime > restat_mtime)
814 restat_mtime = depfile_mtime;
815 }
816
817 // The total number of edges in the plan may have changed as a result
818 // of a restat.
819 status_->PlanHasTotalEdges(plan_.command_edge_count());
820
821 output_mtime = restat_mtime;
822 }
823 }
824
825 if (!plan_.EdgeFinished(edge, Plan::kEdgeSucceeded, err))
826 return false;
827
828 // Delete any left over response file.
829 string rspfile = edge->GetUnescapedRspfile();
830 if (!rspfile.empty() && !g_keep_rsp)
831 disk_interface_->RemoveFile(rspfile);
832
833 if (scan_.build_log()) {
834 if (!scan_.build_log()->RecordCommand(edge, start_time_millis,
835 end_time_millis, output_mtime)) {
836 *err = string("Error writing to build log: ") + strerror(errno);
837 return false;
838 }
839 }
840
841 if (!deps_type.empty() && !config_.dry_run) {
842 assert(!edge->outputs_.empty() && "should have been rejected by parser");
843 for (std::vector<Node*>::const_iterator o = edge->outputs_.begin();
844 o != edge->outputs_.end(); ++o) {
845 TimeStamp deps_mtime = disk_interface_->Stat((*o)->path(), err);
846 if (deps_mtime == -1)
847 return false;
848 if (!scan_.deps_log()->RecordDeps(*o, deps_mtime, deps_nodes)) {
849 *err = std::string("Error writing to deps log: ") + strerror(errno);
850 return false;
851 }
852 }
853 }
854 return true;
855 }
856
ExtractDeps(CommandRunner::Result * result,const string & deps_type,const string & deps_prefix,vector<Node * > * deps_nodes,string * err)857 bool Builder::ExtractDeps(CommandRunner::Result* result,
858 const string& deps_type,
859 const string& deps_prefix,
860 vector<Node*>* deps_nodes,
861 string* err) {
862 if (deps_type == "msvc") {
863 CLParser parser;
864 string output;
865 if (!parser.Parse(result->output, deps_prefix, &output, err))
866 return false;
867 result->output = output;
868 for (set<string>::iterator i = parser.includes_.begin();
869 i != parser.includes_.end(); ++i) {
870 // ~0 is assuming that with MSVC-parsed headers, it's ok to always make
871 // all backslashes (as some of the slashes will certainly be backslashes
872 // anyway). This could be fixed if necessary with some additional
873 // complexity in IncludesNormalize::Relativize.
874 deps_nodes->push_back(state_->GetNode(*i, ~0u));
875 }
876 } else if (deps_type == "gcc") {
877 string depfile = result->edge->GetUnescapedDepfile();
878 if (depfile.empty()) {
879 *err = string("edge with deps=gcc but no depfile makes no sense");
880 return false;
881 }
882
883 // Read depfile content. Treat a missing depfile as empty.
884 string content;
885 switch (disk_interface_->ReadFile(depfile, &content, err)) {
886 case DiskInterface::Okay:
887 break;
888 case DiskInterface::NotFound:
889 err->clear();
890 break;
891 case DiskInterface::OtherError:
892 return false;
893 }
894 if (content.empty())
895 return true;
896
897 DepfileParser deps(config_.depfile_parser_options);
898 if (!deps.Parse(&content, err))
899 return false;
900
901 // XXX check depfile matches expected output.
902 deps_nodes->reserve(deps.ins_.size());
903 for (vector<StringPiece>::iterator i = deps.ins_.begin();
904 i != deps.ins_.end(); ++i) {
905 uint64_t slash_bits;
906 CanonicalizePath(const_cast<char*>(i->str_), &i->len_, &slash_bits);
907 deps_nodes->push_back(state_->GetNode(*i, slash_bits));
908 }
909
910 if (!g_keep_depfile) {
911 if (disk_interface_->RemoveFile(depfile) < 0) {
912 *err = string("deleting depfile: ") + strerror(errno) + string("\n");
913 return false;
914 }
915 }
916 } else {
917 Fatal("unknown deps type '%s'", deps_type.c_str());
918 }
919
920 return true;
921 }
922
LoadDyndeps(Node * node,string * err)923 bool Builder::LoadDyndeps(Node* node, string* err) {
924 status_->BuildLoadDyndeps();
925
926 // Load the dyndep information provided by this node.
927 DyndepFile ddf;
928 if (!scan_.LoadDyndeps(node, &ddf, err))
929 return false;
930
931 // Update the build plan to account for dyndep modifications to the graph.
932 if (!plan_.DyndepsLoaded(&scan_, node, ddf, err))
933 return false;
934
935 // New command edges may have been added to the plan.
936 status_->PlanHasTotalEdges(plan_.command_edge_count());
937
938 return true;
939 }
940