OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "tools/gn/builder.h" | 5 #include "tools/gn/builder.h" |
6 | 6 |
7 #include "tools/gn/config.h" | 7 #include "tools/gn/config.h" |
8 #include "tools/gn/err.h" | 8 #include "tools/gn/err.h" |
9 #include "tools/gn/loader.h" | 9 #include "tools/gn/loader.h" |
10 #include "tools/gn/scheduler.h" | 10 #include "tools/gn/scheduler.h" |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 bool Builder::ResolveItem(BuilderRecord* record, Err* err) { | 401 bool Builder::ResolveItem(BuilderRecord* record, Err* err) { |
402 DCHECK(record->can_resolve() && !record->resolved()); | 402 DCHECK(record->can_resolve() && !record->resolved()); |
403 | 403 |
404 if (record->type() == BuilderRecord::ITEM_TARGET) { | 404 if (record->type() == BuilderRecord::ITEM_TARGET) { |
405 Target* target = record->item()->AsTarget(); | 405 Target* target = record->item()->AsTarget(); |
406 if (!ResolveDeps(&target->deps(), err) || | 406 if (!ResolveDeps(&target->deps(), err) || |
407 !ResolveDeps(&target->datadeps(), err) || | 407 !ResolveDeps(&target->datadeps(), err) || |
408 !ResolveConfigs(&target->configs(), err) || | 408 !ResolveConfigs(&target->configs(), err) || |
409 !ResolveConfigs(&target->all_dependent_configs(), err) || | 409 !ResolveConfigs(&target->all_dependent_configs(), err) || |
410 !ResolveConfigs(&target->direct_dependent_configs(), err) || | 410 !ResolveConfigs(&target->direct_dependent_configs(), err) || |
411 !ResolveForwardDependentConfigs(target, err)) | 411 !ResolveForwardDependentConfigs(target, err) || |
| 412 !ResolveToolchain(target, err)) |
412 return false; | 413 return false; |
413 } else if (record->type() == BuilderRecord::ITEM_TOOLCHAIN) { | 414 } else if (record->type() == BuilderRecord::ITEM_TOOLCHAIN) { |
414 Toolchain* toolchain = record->item()->AsToolchain(); | 415 Toolchain* toolchain = record->item()->AsToolchain(); |
415 if (!ResolveDeps(&toolchain->deps(), err)) | 416 if (!ResolveDeps(&toolchain->deps(), err)) |
416 return false; | 417 return false; |
417 } | 418 } |
418 | 419 |
419 record->set_resolved(true); | 420 record->set_resolved(true); |
420 record->item()->OnResolved(); | 421 record->item()->OnResolved(); |
421 if (!resolved_callback_.is_null()) | 422 if (!resolved_callback_.is_null()) |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 "This target has a forward_dependent_configs_from entry that was " | 493 "This target has a forward_dependent_configs_from entry that was " |
493 "not present in\nthe deps. A target can only forward things it " | 494 "not present in\nthe deps. A target can only forward things it " |
494 "depends on. It was forwarding:\n " + | 495 "depends on. It was forwarding:\n " + |
495 configs[config_i].label.GetUserVisibleName(false)); | 496 configs[config_i].label.GetUserVisibleName(false)); |
496 return false; | 497 return false; |
497 } | 498 } |
498 } | 499 } |
499 return true; | 500 return true; |
500 } | 501 } |
501 | 502 |
| 503 bool Builder::ResolveToolchain(Target* target, Err* err) { |
| 504 BuilderRecord* record = GetResolvedRecordOfType( |
| 505 target->settings()->toolchain_label(), target->defined_from(), |
| 506 BuilderRecord::ITEM_TOOLCHAIN, err); |
| 507 if (!record) { |
| 508 *err = Err(target->defined_from(), |
| 509 "Toolchain for target not defined.", |
| 510 "I was hoping to find a toolchain " + |
| 511 target->settings()->toolchain_label().GetUserVisibleName(false)); |
| 512 return false; |
| 513 } |
| 514 |
| 515 if (!target->SetToolchain(record->item()->AsToolchain(), err)) |
| 516 return false; |
| 517 |
| 518 return true; |
| 519 } |
| 520 |
502 std::string Builder::CheckForCircularDependencies( | 521 std::string Builder::CheckForCircularDependencies( |
503 const std::vector<const BuilderRecord*>& bad_records) const { | 522 const std::vector<const BuilderRecord*>& bad_records) const { |
504 std::vector<const BuilderRecord*> cycle; | 523 std::vector<const BuilderRecord*> cycle; |
505 if (!RecursiveFindCycle(bad_records[0], &cycle)) | 524 if (!RecursiveFindCycle(bad_records[0], &cycle)) |
506 return std::string(); // Didn't find a cycle, something else is wrong. | 525 return std::string(); // Didn't find a cycle, something else is wrong. |
507 | 526 |
508 // Walk backwards since the dependency arrows point in the reverse direction. | 527 // Walk backwards since the dependency arrows point in the reverse direction. |
509 std::string ret; | 528 std::string ret; |
510 for (int i = static_cast<int>(cycle.size()) - 1; i >= 0; i--) { | 529 for (int i = static_cast<int>(cycle.size()) - 1; i >= 0; i--) { |
511 ret += " " + cycle[i]->label().GetUserVisibleName(false); | 530 ret += " " + cycle[i]->label().GetUserVisibleName(false); |
512 if (i != 0) | 531 if (i != 0) |
513 ret += " ->\n"; | 532 ret += " ->\n"; |
514 } | 533 } |
515 | 534 |
516 return ret; | 535 return ret; |
517 } | 536 } |
OLD | NEW |