| 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;
|
|
|