Index: tools/gn/builder.cc |
diff --git a/tools/gn/builder.cc b/tools/gn/builder.cc |
index 132f4e0a604df5b6a023056cd9be3a2d4526ba13..50a027b389de3352afe54e67329c9ed2310a980e 100644 |
--- a/tools/gn/builder.cc |
+++ b/tools/gn/builder.cc |
@@ -91,17 +91,18 @@ void Builder::ItemDefined(scoped_ptr<Item> item) { |
// loads for targets that are required. |
switch (type) { |
case BuilderRecord::ITEM_TARGET: |
- if (!TargetDefined(record, &err)) { |
- g_scheduler->FailWithError(err); |
- return; |
- } |
+ TargetDefined(record, &err); |
break; |
case BuilderRecord::ITEM_TOOLCHAIN: |
- loader_->ToolchainLoaded(record->item()->AsToolchain()); |
+ ToolchainDefined(record, &err); |
break; |
default: |
break; |
} |
+ if (err.has_error()) { |
+ g_scheduler->FailWithError(err); |
+ return; |
+ } |
if (record->can_resolve()) { |
if (!ResolveItem(record, &err)) { |
@@ -243,6 +244,22 @@ bool Builder::TargetDefined(BuilderRecord* record, Err* err) { |
return true; |
} |
+bool Builder::ToolchainDefined(BuilderRecord* record, Err* err) { |
+ Toolchain* toolchain = record->item()->AsToolchain(); |
+ |
+ if (!AddDeps(record, toolchain->deps(), err)) |
+ return false; |
+ |
+ // The default toolchain gets generated by default. Also propogate the |
+ // generate flag if it depends on items in a non-default toolchain. |
+ if (record->should_generate() || |
+ toolchain->settings()->default_toolchain_label() == toolchain->label()) |
+ RecursiveSetShouldGenerate(record, true); |
+ |
+ loader_->ToolchainLoaded(toolchain); |
+ return true; |
+} |
+ |
BuilderRecord* Builder::GetOrCreateRecordOfType(const Label& label, |
const ParseNode* request_from, |
BuilderRecord::ItemType type, |
@@ -380,6 +397,10 @@ bool Builder::ResolveItem(BuilderRecord* record, Err* err) { |
!ResolveConfigs(&target->direct_dependent_configs(), err) || |
!ResolveForwardDependentConfigs(target, err)) |
return false; |
+ } else if (record->type() == BuilderRecord::ITEM_TOOLCHAIN) { |
+ Toolchain* toolchain = record->item()->AsToolchain(); |
+ if (!ResolveDeps(&toolchain->deps(), err)) |
+ return false; |
} |
record->set_resolved(true); |