Index: tools/gn/builder.cc |
diff --git a/tools/gn/builder.cc b/tools/gn/builder.cc |
index 22b4c478c9bd347ded71d84ad6b14469df99cf22..036d3902c707ff2e183059d94bd223553d8866b8 100644 |
--- a/tools/gn/builder.cc |
+++ b/tools/gn/builder.cc |
@@ -11,6 +11,7 @@ |
#include "tools/gn/deps_iterator.h" |
#include "tools/gn/err.h" |
#include "tools/gn/loader.h" |
+#include "tools/gn/pool.h" |
#include "tools/gn/scheduler.h" |
#include "tools/gn/settings.h" |
#include "tools/gn/target.h" |
@@ -263,6 +264,19 @@ 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.is_null()) |
+ continue; |
+ |
+ BuilderRecord* dep_record = GetOrCreateRecordOfType( |
+ tool->pool().label, tool->pool().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,29 @@ 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.is_null()) |
+ continue; |
+ |
+ BuilderRecord* record = |
+ GetResolvedRecordOfType(tool->pool().label, toolchain->defined_from(), |
+ BuilderRecord::ITEM_POOL, err); |
+ if (!record) { |
+ *err = Err(tool->pool().origin, "Pool for tool not defined.", |
+ "I was hoping to find a pool " + |
+ tool->pool().label.GetUserVisibleName(false)); |
+ return false; |
+ } |
+ |
+ tool->set_pool(LabelPtrPair<Pool>(record->item()->AsPool())); |
+ } |
+ |
+ return true; |
+} |
+ |
std::string Builder::CheckForCircularDependencies( |
const std::vector<const BuilderRecord*>& bad_records) const { |
std::vector<const BuilderRecord*> cycle; |