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