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 |