Index: tools/gn/builder.cc |
diff --git a/tools/gn/builder.cc b/tools/gn/builder.cc |
index 22b4c478c9bd347ded71d84ad6b14469df99cf22..318931e4a46a9cee68e8a1779d708b63a0cf1c14 100644 |
--- a/tools/gn/builder.cc |
+++ b/tools/gn/builder.cc |
@@ -263,6 +263,20 @@ bool Builder::ToolchainDefined(BuilderRecord* record, Err* err) { |
if (!AddDeps(record, toolchain->deps(), err)) |
return false; |
+ for (int i = Toolchain::TYPE_NONE + 1; i < Toolchain::TYPE_NUMTYPES; i++) { |
+ Toolchain::ToolType tool_type = static_cast<Toolchain::ToolType>(i); |
+ Tool* tool = toolchain->GetTool(tool_type); |
+ if (!tool || tool->pool_label_pair().label.is_null()) |
+ continue; |
+ |
+ BuilderRecord* dep_record = GetOrCreateRecordOfType( |
+ tool->pool_label_pair().label, tool->pool_label_pair().origin, |
+ BuilderRecord::ITEM_POOL, err); |
+ if (!dep_record) |
+ return false; |
+ record->AddDep(dep_record); |
+ } |
+ |
// 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() || |
@@ -429,6 +443,8 @@ bool Builder::ResolveItem(BuilderRecord* record, Err* err) { |
Toolchain* toolchain = record->item()->AsToolchain(); |
if (!ResolveDeps(&toolchain->deps(), err)) |
return false; |
+ if (!ResolvePools(toolchain, err)) |
+ return false; |
} |
record->set_resolved(true); |
@@ -497,6 +513,30 @@ bool Builder::ResolveToolchain(Target* target, Err* err) { |
return true; |
} |
+bool Builder::ResolvePools(Toolchain* toolchain, Err* err) { |
+ for (int i = Toolchain::TYPE_NONE + 1; i < Toolchain::TYPE_NUMTYPES; i++) { |
+ Toolchain::ToolType tool_type = static_cast<Toolchain::ToolType>(i); |
+ Tool* tool = toolchain->GetTool(tool_type); |
+ if (!tool || tool->pool_label_pair().label.is_null()) |
+ continue; |
+ |
+ BuilderRecord* record = GetResolvedRecordOfType( |
+ tool->pool_label_pair().label, toolchain->defined_from(), |
+ BuilderRecord::ITEM_POOL, err); |
+ if (!record) { |
+ * err = Err(tool->pool_label_pair().origin, |
+ "Pool for tool not defined.", |
+ "I was hoping to find a pool " + |
+ tool->pool_label_pair().label.GetUserVisibleName(false)); |
+ return false; |
+ } |
+ |
+ tool->set_pool(record->item()->AsPool()); |
+ } |
+ |
+ return true; |
+} |
+ |
std::string Builder::CheckForCircularDependencies( |
const std::vector<const BuilderRecord*>& bad_records) const { |
std::vector<const BuilderRecord*> cycle; |