diff options
author | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-26 18:12:30 +0000 |
---|---|---|
committer | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-26 18:12:30 +0000 |
commit | abc283cfd456e3f3726e3ad00aedb55a0c9e2aec (patch) | |
tree | 5de1cdd1045e6137aa1eda46a2cda8cbdfe9370b /tools/gn/builder.cc | |
parent | ec03d433c706df8dbc20c7fe61315f8cca1f0ca3 (diff) | |
download | chromium_src-abc283cfd456e3f3726e3ad00aedb55a0c9e2aec.zip chromium_src-abc283cfd456e3f3726e3ad00aedb55a0c9e2aec.tar.gz chromium_src-abc283cfd456e3f3726e3ad00aedb55a0c9e2aec.tar.bz2 |
Allow dependencies of toolchains in GN.
A toolchain definition can now specify "deps" which will be resolved before any target in that toolchain is compiled. This is useful for toolchain setup operations.
R=noelallen@chromium.org
Review URL: https://codereview.chromium.org/350743004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@280052 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/gn/builder.cc')
-rw-r--r-- | tools/gn/builder.cc | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/tools/gn/builder.cc b/tools/gn/builder.cc index 132f4e0..50a027b 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); |