| 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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 } | 221 } |
| 222 | 222 |
| 223 return true; | 223 return true; |
| 224 } | 224 } |
| 225 | 225 |
| 226 bool Builder::TargetDefined(BuilderRecord* record, Err* err) { | 226 bool Builder::TargetDefined(BuilderRecord* record, Err* err) { |
| 227 Target* target = record->item()->AsTarget(); | 227 Target* target = record->item()->AsTarget(); |
| 228 | 228 |
| 229 if (!AddDeps(record, target->deps(), err) || | 229 if (!AddDeps(record, target->deps(), err) || |
| 230 !AddDeps(record, target->datadeps(), err) || | 230 !AddDeps(record, target->datadeps(), err) || |
| 231 !AddDeps(record, target->configs(), err) || | 231 !AddDeps(record, target->configs().vector(), err) || |
| 232 !AddDeps(record, target->all_dependent_configs(), err) || | 232 !AddDeps(record, target->all_dependent_configs(), err) || |
| 233 !AddDeps(record, target->direct_dependent_configs(), err) || | 233 !AddDeps(record, target->direct_dependent_configs(), err) || |
| 234 !AddToolchainDep(record, target, err)) | 234 !AddToolchainDep(record, target, err)) |
| 235 return false; | 235 return false; |
| 236 | 236 |
| 237 // 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 |
| 238 // 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 |
| 239 // 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 |
| 240 // required bit pushed to them. | 240 // required bit pushed to them. |
| 241 if (record->should_generate() || target->settings()->is_default()) | 241 if (record->should_generate() || target->settings()->is_default()) |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 BuilderRecord* dep_record = GetOrCreateRecordOfType( | 330 BuilderRecord* dep_record = GetOrCreateRecordOfType( |
| 331 configs[i].label, configs[i].origin, BuilderRecord::ITEM_CONFIG, err); | 331 configs[i].label, configs[i].origin, BuilderRecord::ITEM_CONFIG, err); |
| 332 if (!dep_record) | 332 if (!dep_record) |
| 333 return false; | 333 return false; |
| 334 record->AddDep(dep_record); | 334 record->AddDep(dep_record); |
| 335 } | 335 } |
| 336 return true; | 336 return true; |
| 337 } | 337 } |
| 338 | 338 |
| 339 bool Builder::AddDeps(BuilderRecord* record, | 339 bool Builder::AddDeps(BuilderRecord* record, |
| 340 const UniqueVector<LabelConfigPair>& configs, |
| 341 Err* err) { |
| 342 for (size_t i = 0; i < configs.size(); i++) { |
| 343 BuilderRecord* dep_record = GetOrCreateRecordOfType( |
| 344 configs[i].label, configs[i].origin, BuilderRecord::ITEM_CONFIG, err); |
| 345 if (!dep_record) |
| 346 return false; |
| 347 record->AddDep(dep_record); |
| 348 } |
| 349 return true; |
| 350 } |
| 351 |
| 352 bool Builder::AddDeps(BuilderRecord* record, |
| 340 const LabelTargetVector& targets, | 353 const LabelTargetVector& targets, |
| 341 Err* err) { | 354 Err* err) { |
| 342 for (size_t i = 0; i < targets.size(); i++) { | 355 for (size_t i = 0; i < targets.size(); i++) { |
| 343 BuilderRecord* dep_record = GetOrCreateRecordOfType( | 356 BuilderRecord* dep_record = GetOrCreateRecordOfType( |
| 344 targets[i].label, targets[i].origin, BuilderRecord::ITEM_TARGET, err); | 357 targets[i].label, targets[i].origin, BuilderRecord::ITEM_TARGET, err); |
| 345 if (!dep_record) | 358 if (!dep_record) |
| 346 return false; | 359 return false; |
| 347 record->AddDep(dep_record); | 360 record->AddDep(dep_record); |
| 348 } | 361 } |
| 349 return true; | 362 return true; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 | 446 |
| 434 BuilderRecord* record = GetResolvedRecordOfType( | 447 BuilderRecord* record = GetResolvedRecordOfType( |
| 435 cur.label, cur.origin, BuilderRecord::ITEM_TARGET, err); | 448 cur.label, cur.origin, BuilderRecord::ITEM_TARGET, err); |
| 436 if (!record) | 449 if (!record) |
| 437 return false; | 450 return false; |
| 438 cur.ptr = record->item()->AsTarget(); | 451 cur.ptr = record->item()->AsTarget(); |
| 439 } | 452 } |
| 440 return true; | 453 return true; |
| 441 } | 454 } |
| 442 | 455 |
| 443 bool Builder::ResolveConfigs(LabelConfigVector* configs, Err* err) { | 456 bool Builder::ResolveConfigs(UniqueVector<LabelConfigPair>* configs, Err* err) { |
| 444 for (size_t i = 0; i < configs->size(); i++) { | 457 for (size_t i = 0; i < configs->size(); i++) { |
| 445 LabelConfigPair& cur = (*configs)[i]; | 458 const LabelConfigPair& cur = (*configs)[i]; |
| 446 DCHECK(!cur.ptr); | 459 DCHECK(!cur.ptr); |
| 447 | 460 |
| 448 BuilderRecord* record = GetResolvedRecordOfType( | 461 BuilderRecord* record = GetResolvedRecordOfType( |
| 449 cur.label, cur.origin, BuilderRecord::ITEM_CONFIG, err); | 462 cur.label, cur.origin, BuilderRecord::ITEM_CONFIG, err); |
| 450 if (!record) | 463 if (!record) |
| 451 return false; | 464 return false; |
| 452 cur.ptr = record->item()->AsConfig(); | 465 const_cast<LabelConfigPair&>(cur).ptr = record->item()->AsConfig(); |
| 453 } | 466 } |
| 454 return true; | 467 return true; |
| 455 } | 468 } |
| 456 | 469 |
| 457 // "Forward dependent configs" should refer to targets in the deps that should | 470 // "Forward dependent configs" should refer to targets in the deps that should |
| 458 // have their configs forwarded. | 471 // have their configs forwarded. |
| 459 bool Builder::ResolveForwardDependentConfigs(Target* target, Err* err) { | 472 bool Builder::ResolveForwardDependentConfigs(Target* target, Err* err) { |
| 460 const LabelTargetVector& deps = target->deps(); | 473 const LabelTargetVector& deps = target->deps(); |
| 461 LabelTargetVector& configs = target->forward_dependent_configs(); | 474 const UniqueVector<LabelTargetPair>& configs = |
| 475 target->forward_dependent_configs(); |
| 462 | 476 |
| 463 // Assume that the lists are small so that brute-force n^2 is appropriate. | 477 // Assume that the lists are small so that brute-force n^2 is appropriate. |
| 464 for (size_t config_i = 0; config_i < configs.size(); config_i++) { | 478 for (size_t config_i = 0; config_i < configs.size(); config_i++) { |
| 465 for (size_t dep_i = 0; dep_i < deps.size(); dep_i++) { | 479 for (size_t dep_i = 0; dep_i < deps.size(); dep_i++) { |
| 466 if (configs[config_i].label == deps[dep_i].label) { | 480 if (configs[config_i].label == deps[dep_i].label) { |
| 467 DCHECK(deps[dep_i].ptr); // Should already be resolved. | 481 DCHECK(deps[dep_i].ptr); // Should already be resolved. |
| 468 configs[config_i].ptr = deps[dep_i].ptr; | 482 // UniqueVector's contents are constant so uniqueness is preserved, but |
| 483 // we want to update this pointer which doesn't change uniqueness |
| 484 // (uniqueness in this vector is determined by the label only). |
| 485 const_cast<LabelTargetPair&>(configs[config_i]).ptr = deps[dep_i].ptr; |
| 469 break; | 486 break; |
| 470 } | 487 } |
| 471 } | 488 } |
| 472 if (!configs[config_i].ptr) { | 489 if (!configs[config_i].ptr) { |
| 473 *err = Err(target->defined_from(), | 490 *err = Err(target->defined_from(), |
| 474 "Target in forward_dependent_configs_from was not listed in the deps", | 491 "Target in forward_dependent_configs_from was not listed in the deps", |
| 475 "This target has a forward_dependent_configs_from entry that was " | 492 "This target has a forward_dependent_configs_from entry that was " |
| 476 "not present in\nthe deps. A target can only forward things it " | 493 "not present in\nthe deps. A target can only forward things it " |
| 477 "depends on. It was forwarding:\n " + | 494 "depends on. It was forwarding:\n " + |
| 478 configs[config_i].label.GetUserVisibleName(false)); | 495 configs[config_i].label.GetUserVisibleName(false)); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 491 // Walk backwards since the dependency arrows point in the reverse direction. | 508 // Walk backwards since the dependency arrows point in the reverse direction. |
| 492 std::string ret; | 509 std::string ret; |
| 493 for (int i = static_cast<int>(cycle.size()) - 1; i >= 0; i--) { | 510 for (int i = static_cast<int>(cycle.size()) - 1; i >= 0; i--) { |
| 494 ret += " " + cycle[i]->label().GetUserVisibleName(false); | 511 ret += " " + cycle[i]->label().GetUserVisibleName(false); |
| 495 if (i != 0) | 512 if (i != 0) |
| 496 ret += " ->\n"; | 513 ret += " ->\n"; |
| 497 } | 514 } |
| 498 | 515 |
| 499 return ret; | 516 return ret; |
| 500 } | 517 } |
| OLD | NEW |