OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |