Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: tools/gn/builder.cc

Issue 350743004: Allow dependencies of toolchains in GN. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tools/gn/builder.h ('k') | tools/gn/builder_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "tools/gn/builder.h" 5 #include "tools/gn/builder.h"
6 6
7 #include "tools/gn/config.h" 7 #include "tools/gn/config.h"
8 #include "tools/gn/err.h" 8 #include "tools/gn/err.h"
9 #include "tools/gn/loader.h" 9 #include "tools/gn/loader.h"
10 #include "tools/gn/scheduler.h" 10 #include "tools/gn/scheduler.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 g_scheduler->FailWithError(err); 84 g_scheduler->FailWithError(err);
85 return; 85 return;
86 } 86 }
87 87
88 record->set_item(item.Pass()); 88 record->set_item(item.Pass());
89 89
90 // Do target-specific dependency setup. This will also schedule dependency 90 // Do target-specific dependency setup. This will also schedule dependency
91 // loads for targets that are required. 91 // loads for targets that are required.
92 switch (type) { 92 switch (type) {
93 case BuilderRecord::ITEM_TARGET: 93 case BuilderRecord::ITEM_TARGET:
94 if (!TargetDefined(record, &err)) { 94 TargetDefined(record, &err);
95 g_scheduler->FailWithError(err);
96 return;
97 }
98 break; 95 break;
99 case BuilderRecord::ITEM_TOOLCHAIN: 96 case BuilderRecord::ITEM_TOOLCHAIN:
100 loader_->ToolchainLoaded(record->item()->AsToolchain()); 97 ToolchainDefined(record, &err);
101 break; 98 break;
102 default: 99 default:
103 break; 100 break;
104 } 101 }
102 if (err.has_error()) {
103 g_scheduler->FailWithError(err);
104 return;
105 }
105 106
106 if (record->can_resolve()) { 107 if (record->can_resolve()) {
107 if (!ResolveItem(record, &err)) { 108 if (!ResolveItem(record, &err)) {
108 g_scheduler->FailWithError(err); 109 g_scheduler->FailWithError(err);
109 return; 110 return;
110 } 111 }
111 } 112 }
112 } 113 }
113 114
114 const Item* Builder::GetItem(const Label& label) const { 115 const Item* Builder::GetItem(const Label& label) const {
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 // All targets in the default toolchain get generated by default. We also 237 // All targets in the default toolchain get generated by default. We also
237 // check if this target was previously marked as "required" and force setting 238 // check if this target was previously marked as "required" and force setting
238 // the bit again so the target's dependencies (which we now know) get the 239 // the bit again so the target's dependencies (which we now know) get the
239 // required bit pushed to them. 240 // required bit pushed to them.
240 if (record->should_generate() || target->settings()->is_default()) 241 if (record->should_generate() || target->settings()->is_default())
241 RecursiveSetShouldGenerate(record, true); 242 RecursiveSetShouldGenerate(record, true);
242 243
243 return true; 244 return true;
244 } 245 }
245 246
247 bool Builder::ToolchainDefined(BuilderRecord* record, Err* err) {
248 Toolchain* toolchain = record->item()->AsToolchain();
249
250 if (!AddDeps(record, toolchain->deps(), err))
251 return false;
252
253 // The default toolchain gets generated by default. Also propogate the
254 // generate flag if it depends on items in a non-default toolchain.
255 if (record->should_generate() ||
256 toolchain->settings()->default_toolchain_label() == toolchain->label())
257 RecursiveSetShouldGenerate(record, true);
258
259 loader_->ToolchainLoaded(toolchain);
260 return true;
261 }
262
246 BuilderRecord* Builder::GetOrCreateRecordOfType(const Label& label, 263 BuilderRecord* Builder::GetOrCreateRecordOfType(const Label& label,
247 const ParseNode* request_from, 264 const ParseNode* request_from,
248 BuilderRecord::ItemType type, 265 BuilderRecord::ItemType type,
249 Err* err) { 266 Err* err) {
250 BuilderRecord* record = GetRecord(label); 267 BuilderRecord* record = GetRecord(label);
251 if (!record) { 268 if (!record) {
252 // Not seen this record yet, create a new one. 269 // Not seen this record yet, create a new one.
253 record = new BuilderRecord(type, label); 270 record = new BuilderRecord(type, label);
254 record->set_originally_referenced_from(request_from); 271 record->set_originally_referenced_from(request_from);
255 records_[label] = record; 272 records_[label] = record;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 390
374 if (record->type() == BuilderRecord::ITEM_TARGET) { 391 if (record->type() == BuilderRecord::ITEM_TARGET) {
375 Target* target = record->item()->AsTarget(); 392 Target* target = record->item()->AsTarget();
376 if (!ResolveDeps(&target->deps(), err) || 393 if (!ResolveDeps(&target->deps(), err) ||
377 !ResolveDeps(&target->datadeps(), err) || 394 !ResolveDeps(&target->datadeps(), err) ||
378 !ResolveConfigs(&target->configs(), err) || 395 !ResolveConfigs(&target->configs(), err) ||
379 !ResolveConfigs(&target->all_dependent_configs(), err) || 396 !ResolveConfigs(&target->all_dependent_configs(), err) ||
380 !ResolveConfigs(&target->direct_dependent_configs(), err) || 397 !ResolveConfigs(&target->direct_dependent_configs(), err) ||
381 !ResolveForwardDependentConfigs(target, err)) 398 !ResolveForwardDependentConfigs(target, err))
382 return false; 399 return false;
400 } else if (record->type() == BuilderRecord::ITEM_TOOLCHAIN) {
401 Toolchain* toolchain = record->item()->AsToolchain();
402 if (!ResolveDeps(&toolchain->deps(), err))
403 return false;
383 } 404 }
384 405
385 record->set_resolved(true); 406 record->set_resolved(true);
386 record->item()->OnResolved(); 407 record->item()->OnResolved();
387 if (!resolved_callback_.is_null()) 408 if (!resolved_callback_.is_null())
388 resolved_callback_.Run(record); 409 resolved_callback_.Run(record);
389 410
390 // Recursively update everybody waiting on this item to be resolved. 411 // Recursively update everybody waiting on this item to be resolved.
391 BuilderRecordSet& waiting_set = record->waiting_on_resolution(); 412 BuilderRecordSet& waiting_set = record->waiting_on_resolution();
392 for (BuilderRecordSet::iterator i = waiting_set.begin(); 413 for (BuilderRecordSet::iterator i = waiting_set.begin();
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 // Walk backwards since the dependency arrows point in the reverse direction. 491 // Walk backwards since the dependency arrows point in the reverse direction.
471 std::string ret; 492 std::string ret;
472 for (int i = static_cast<int>(cycle.size()) - 1; i >= 0; i--) { 493 for (int i = static_cast<int>(cycle.size()) - 1; i >= 0; i--) {
473 ret += " " + cycle[i]->label().GetUserVisibleName(false); 494 ret += " " + cycle[i]->label().GetUserVisibleName(false);
474 if (i != 0) 495 if (i != 0)
475 ret += " ->\n"; 496 ret += " ->\n";
476 } 497 }
477 498
478 return ret; 499 return ret;
479 } 500 }
OLDNEW
« no previous file with comments | « tools/gn/builder.h ('k') | tools/gn/builder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698