summaryrefslogtreecommitdiffstats
path: root/tools/gn/builder.cc
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-26 18:12:30 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-26 18:12:30 +0000
commitabc283cfd456e3f3726e3ad00aedb55a0c9e2aec (patch)
tree5de1cdd1045e6137aa1eda46a2cda8cbdfe9370b /tools/gn/builder.cc
parentec03d433c706df8dbc20c7fe61315f8cca1f0ca3 (diff)
downloadchromium_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.cc31
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);