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 <stddef.h> | 7 #include <stddef.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "tools/gn/config.h" | 10 #include "tools/gn/config.h" |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 | 256 |
257 return true; | 257 return true; |
258 } | 258 } |
259 | 259 |
260 bool Builder::ToolchainDefined(BuilderRecord* record, Err* err) { | 260 bool Builder::ToolchainDefined(BuilderRecord* record, Err* err) { |
261 Toolchain* toolchain = record->item()->AsToolchain(); | 261 Toolchain* toolchain = record->item()->AsToolchain(); |
262 | 262 |
263 if (!AddDeps(record, toolchain->deps(), err)) | 263 if (!AddDeps(record, toolchain->deps(), err)) |
264 return false; | 264 return false; |
265 | 265 |
| 266 for (int i = Toolchain::TYPE_NONE + 1; i < Toolchain::TYPE_NUMTYPES; i++) { |
| 267 Toolchain::ToolType tool_type = static_cast<Toolchain::ToolType>(i); |
| 268 Tool* tool = toolchain->GetTool(tool_type); |
| 269 if (!tool || tool->pool_label_pair().label.is_null()) |
| 270 continue; |
| 271 |
| 272 BuilderRecord* dep_record = GetOrCreateRecordOfType( |
| 273 tool->pool_label_pair().label, tool->pool_label_pair().origin, |
| 274 BuilderRecord::ITEM_POOL, err); |
| 275 if (!dep_record) |
| 276 return false; |
| 277 record->AddDep(dep_record); |
| 278 } |
| 279 |
266 // The default toolchain gets generated by default. Also propogate the | 280 // The default toolchain gets generated by default. Also propogate the |
267 // generate flag if it depends on items in a non-default toolchain. | 281 // generate flag if it depends on items in a non-default toolchain. |
268 if (record->should_generate() || | 282 if (record->should_generate() || |
269 toolchain->settings()->default_toolchain_label() == toolchain->label()) | 283 toolchain->settings()->default_toolchain_label() == toolchain->label()) |
270 RecursiveSetShouldGenerate(record, true); | 284 RecursiveSetShouldGenerate(record, true); |
271 | 285 |
272 loader_->ToolchainLoaded(toolchain); | 286 loader_->ToolchainLoaded(toolchain); |
273 return true; | 287 return true; |
274 } | 288 } |
275 | 289 |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 !ResolveToolchain(target, err)) | 436 !ResolveToolchain(target, err)) |
423 return false; | 437 return false; |
424 } else if (record->type() == BuilderRecord::ITEM_CONFIG) { | 438 } else if (record->type() == BuilderRecord::ITEM_CONFIG) { |
425 Config* config = record->item()->AsConfig(); | 439 Config* config = record->item()->AsConfig(); |
426 if (!ResolveConfigs(&config->configs(), err)) | 440 if (!ResolveConfigs(&config->configs(), err)) |
427 return false; | 441 return false; |
428 } else if (record->type() == BuilderRecord::ITEM_TOOLCHAIN) { | 442 } else if (record->type() == BuilderRecord::ITEM_TOOLCHAIN) { |
429 Toolchain* toolchain = record->item()->AsToolchain(); | 443 Toolchain* toolchain = record->item()->AsToolchain(); |
430 if (!ResolveDeps(&toolchain->deps(), err)) | 444 if (!ResolveDeps(&toolchain->deps(), err)) |
431 return false; | 445 return false; |
| 446 if (!ResolvePools(toolchain, err)) |
| 447 return false; |
432 } | 448 } |
433 | 449 |
434 record->set_resolved(true); | 450 record->set_resolved(true); |
435 | 451 |
436 if (!record->item()->OnResolved(err)) | 452 if (!record->item()->OnResolved(err)) |
437 return false; | 453 return false; |
438 if (!resolved_callback_.is_null()) | 454 if (!resolved_callback_.is_null()) |
439 resolved_callback_.Run(record); | 455 resolved_callback_.Run(record); |
440 | 456 |
441 // Recursively update everybody waiting on this item to be resolved. | 457 // Recursively update everybody waiting on this item to be resolved. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 target->settings()->toolchain_label().GetUserVisibleName(false)); | 506 target->settings()->toolchain_label().GetUserVisibleName(false)); |
491 return false; | 507 return false; |
492 } | 508 } |
493 | 509 |
494 if (!target->SetToolchain(record->item()->AsToolchain(), err)) | 510 if (!target->SetToolchain(record->item()->AsToolchain(), err)) |
495 return false; | 511 return false; |
496 | 512 |
497 return true; | 513 return true; |
498 } | 514 } |
499 | 515 |
| 516 bool Builder::ResolvePools(Toolchain* toolchain, Err* err) { |
| 517 for (int i = Toolchain::TYPE_NONE + 1; i < Toolchain::TYPE_NUMTYPES; i++) { |
| 518 Toolchain::ToolType tool_type = static_cast<Toolchain::ToolType>(i); |
| 519 Tool* tool = toolchain->GetTool(tool_type); |
| 520 if (!tool || tool->pool_label_pair().label.is_null()) |
| 521 continue; |
| 522 |
| 523 BuilderRecord* record = GetResolvedRecordOfType( |
| 524 tool->pool_label_pair().label, toolchain->defined_from(), |
| 525 BuilderRecord::ITEM_POOL, err); |
| 526 if (!record) { |
| 527 * err = Err(tool->pool_label_pair().origin, |
| 528 "Pool for tool not defined.", |
| 529 "I was hoping to find a pool " + |
| 530 tool->pool_label_pair().label.GetUserVisibleName(false)); |
| 531 return false; |
| 532 } |
| 533 |
| 534 tool->set_pool(record->item()->AsPool()); |
| 535 } |
| 536 |
| 537 return true; |
| 538 } |
| 539 |
500 std::string Builder::CheckForCircularDependencies( | 540 std::string Builder::CheckForCircularDependencies( |
501 const std::vector<const BuilderRecord*>& bad_records) const { | 541 const std::vector<const BuilderRecord*>& bad_records) const { |
502 std::vector<const BuilderRecord*> cycle; | 542 std::vector<const BuilderRecord*> cycle; |
503 if (!RecursiveFindCycle(bad_records[0], &cycle)) | 543 if (!RecursiveFindCycle(bad_records[0], &cycle)) |
504 return std::string(); // Didn't find a cycle, something else is wrong. | 544 return std::string(); // Didn't find a cycle, something else is wrong. |
505 | 545 |
506 std::string ret; | 546 std::string ret; |
507 for (size_t i = 0; i < cycle.size(); i++) { | 547 for (size_t i = 0; i < cycle.size(); i++) { |
508 ret += " " + cycle[i]->label().GetUserVisibleName(false); | 548 ret += " " + cycle[i]->label().GetUserVisibleName(false); |
509 if (i != cycle.size() - 1) | 549 if (i != cycle.size() - 1) |
510 ret += " ->"; | 550 ret += " ->"; |
511 ret += "\n"; | 551 ret += "\n"; |
512 } | 552 } |
513 | 553 |
514 return ret; | 554 return ret; |
515 } | 555 } |
OLD | NEW |