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

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

Issue 26537002: Add a UniqueVector class to GN (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: REview comments, remove npos Created 6 years, 4 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
« no previous file with comments | « tools/gn/builder.h ('k') | tools/gn/command_desc.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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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 }
OLDNEW
« no previous file with comments | « tools/gn/builder.h ('k') | tools/gn/command_desc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698