| 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 <algorithm> | 5 #include <algorithm> |
| 6 #include <set> | 6 #include <set> |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "tools/gn/commands.h" | 10 #include "tools/gn/commands.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 | 43 |
| 44 void RecursiveCollectDeps(const Target* target, std::set<Label>* result) { | 44 void RecursiveCollectDeps(const Target* target, std::set<Label>* result) { |
| 45 if (result->find(target->label()) != result->end()) | 45 if (result->find(target->label()) != result->end()) |
| 46 return; // Already did this target. | 46 return; // Already did this target. |
| 47 result->insert(target->label()); | 47 result->insert(target->label()); |
| 48 | 48 |
| 49 RecursiveCollectChildDeps(target, result); | 49 RecursiveCollectChildDeps(target, result); |
| 50 } | 50 } |
| 51 | 51 |
| 52 void RecursiveCollectChildDeps(const Target* target, std::set<Label>* result) { | 52 void RecursiveCollectChildDeps(const Target* target, std::set<Label>* result) { |
| 53 const LabelTargetVector& deps = target->deps(); | 53 for (DepsIterator iter(target); !iter.done(); iter.Advance()) |
| 54 for (size_t i = 0; i < deps.size(); i++) | 54 RecursiveCollectDeps(iter.target(), result); |
| 55 RecursiveCollectDeps(deps[i].ptr, result); | |
| 56 | |
| 57 const LabelTargetVector& datadeps = target->datadeps(); | |
| 58 for (size_t i = 0; i < datadeps.size(); i++) | |
| 59 RecursiveCollectDeps(datadeps[i].ptr, result); | |
| 60 } | 55 } |
| 61 | 56 |
| 62 // Prints dependencies of the given target (not the target itself). If the | 57 // Prints dependencies of the given target (not the target itself). If the |
| 63 // set is non-null, new targets encountered will be added to the set, and if | 58 // set is non-null, new targets encountered will be added to the set, and if |
| 64 // a dependency is in the set already, it will not be recused into. When the | 59 // a dependency is in the set already, it will not be recused into. When the |
| 65 // set is null, all dependencies will be printed. | 60 // set is null, all dependencies will be printed. |
| 66 void RecursivePrintDeps(const Target* target, | 61 void RecursivePrintDeps(const Target* target, |
| 67 const Label& default_toolchain, | 62 const Label& default_toolchain, |
| 68 std::set<const Target*>* seen_targets, | 63 std::set<const Target*>* seen_targets, |
| 69 int indent_level) { | 64 int indent_level) { |
| 70 LabelTargetVector sorted_deps = target->deps(); | 65 // Combine all deps into one sorted list. |
| 71 const LabelTargetVector& datadeps = target->datadeps(); | 66 std::vector<LabelTargetPair> sorted_deps; |
| 72 sorted_deps.insert(sorted_deps.end(), datadeps.begin(), datadeps.end()); | 67 for (DepsIterator iter(target); !iter.done(); iter.Advance()) |
| 68 sorted_deps.push_back(iter.pair()); |
| 73 std::sort(sorted_deps.begin(), sorted_deps.end(), | 69 std::sort(sorted_deps.begin(), sorted_deps.end(), |
| 74 LabelPtrLabelLess<Target>()); | 70 LabelPtrLabelLess<Target>()); |
| 75 | 71 |
| 76 std::string indent(indent_level * 2, ' '); | 72 std::string indent(indent_level * 2, ' '); |
| 77 for (size_t i = 0; i < sorted_deps.size(); i++) { | 73 for (size_t i = 0; i < sorted_deps.size(); i++) { |
| 78 const Target* cur_dep = sorted_deps[i].ptr; | 74 const Target* cur_dep = sorted_deps[i].ptr; |
| 79 | 75 |
| 80 // Don't print groups. Groups are flattened such that the deps of the | |
| 81 // group are added directly to the target that depended on the group. | |
| 82 // Printing and recursing into groups here will cause such targets to be | |
| 83 // duplicated. | |
| 84 // | |
| 85 // It would be much more intuitive to do the opposite and not display the | |
| 86 // deps that were copied from the group to the target and instead display | |
| 87 // the group, but the source of those dependencies is not tracked. | |
| 88 if (cur_dep->output_type() == Target::GROUP) | |
| 89 continue; | |
| 90 | |
| 91 OutputString(indent + | 76 OutputString(indent + |
| 92 cur_dep->label().GetUserVisibleName(default_toolchain)); | 77 cur_dep->label().GetUserVisibleName(default_toolchain)); |
| 93 bool print_children = true; | 78 bool print_children = true; |
| 94 if (seen_targets) { | 79 if (seen_targets) { |
| 95 if (seen_targets->find(cur_dep) == seen_targets->end()) { | 80 if (seen_targets->find(cur_dep) == seen_targets->end()) { |
| 96 // New target, mark it visited. | 81 // New target, mark it visited. |
| 97 seen_targets->insert(cur_dep); | 82 seen_targets->insert(cur_dep); |
| 98 } else { | 83 } else { |
| 99 // Already seen. | 84 // Already seen. |
| 100 print_children = false; | 85 print_children = false; |
| 101 // Only print "..." if something is actually elided, which means that | 86 // Only print "..." if something is actually elided, which means that |
| 102 // the current target has children. | 87 // the current target has children. |
| 103 if (!cur_dep->deps().empty() || !cur_dep->datadeps().empty()) | 88 if (!cur_dep->public_deps().empty() || |
| 89 !cur_dep->private_deps().empty() || |
| 90 !cur_dep->data_deps().empty()) |
| 104 OutputString("..."); | 91 OutputString("..."); |
| 105 } | 92 } |
| 106 } | 93 } |
| 107 | 94 |
| 108 OutputString("\n"); | 95 OutputString("\n"); |
| 109 if (print_children) { | 96 if (print_children) { |
| 110 RecursivePrintDeps(cur_dep, default_toolchain, seen_targets, | 97 RecursivePrintDeps(cur_dep, default_toolchain, seen_targets, |
| 111 indent_level + 1); | 98 indent_level + 1); |
| 112 } | 99 } |
| 113 } | 100 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 129 // Don't recurse into duplicates. | 116 // Don't recurse into duplicates. |
| 130 std::set<const Target*> seen_targets; | 117 std::set<const Target*> seen_targets; |
| 131 RecursivePrintDeps(target, toolchain_label, &seen_targets, 1); | 118 RecursivePrintDeps(target, toolchain_label, &seen_targets, 1); |
| 132 } | 119 } |
| 133 return; | 120 return; |
| 134 } | 121 } |
| 135 | 122 |
| 136 // Collect the deps to display. | 123 // Collect the deps to display. |
| 137 std::vector<Label> deps; | 124 std::vector<Label> deps; |
| 138 if (cmdline->HasSwitch("all")) { | 125 if (cmdline->HasSwitch("all")) { |
| 126 // Show all dependencies. |
| 139 if (display_header) | 127 if (display_header) |
| 140 OutputString("\nAll recursive dependencies:\n"); | 128 OutputString("\nAll recursive dependencies:\n"); |
| 141 | 129 |
| 142 std::set<Label> all_deps; | 130 std::set<Label> all_deps; |
| 143 RecursiveCollectChildDeps(target, &all_deps); | 131 RecursiveCollectChildDeps(target, &all_deps); |
| 144 for (std::set<Label>::iterator i = all_deps.begin(); | 132 for (std::set<Label>::iterator i = all_deps.begin(); |
| 145 i != all_deps.end(); ++i) | 133 i != all_deps.end(); ++i) |
| 146 deps.push_back(*i); | 134 deps.push_back(*i); |
| 147 } else { | 135 } else { |
| 136 // Show direct dependencies only. |
| 148 if (display_header) { | 137 if (display_header) { |
| 149 OutputString( | 138 OutputString( |
| 150 "\nDirect dependencies " | 139 "\nDirect dependencies " |
| 151 "(try also \"--all\", \"--tree\", or even \"--all --tree\"):\n"); | 140 "(try also \"--all\", \"--tree\", or even \"--all --tree\"):\n"); |
| 152 } | 141 } |
| 153 | 142 for (DepsIterator iter(target); !iter.done(); iter.Advance()) |
| 154 const LabelTargetVector& target_deps = target->deps(); | 143 deps.push_back(iter.label()); |
| 155 for (size_t i = 0; i < target_deps.size(); i++) | |
| 156 deps.push_back(target_deps[i].label); | |
| 157 | |
| 158 const LabelTargetVector& target_datadeps = target->datadeps(); | |
| 159 for (size_t i = 0; i < target_datadeps.size(); i++) | |
| 160 deps.push_back(target_datadeps[i].label); | |
| 161 } | 144 } |
| 162 | 145 |
| 163 std::sort(deps.begin(), deps.end()); | 146 std::sort(deps.begin(), deps.end()); |
| 164 for (size_t i = 0; i < deps.size(); i++) | 147 for (size_t i = 0; i < deps.size(); i++) |
| 165 OutputString(" " + deps[i].GetUserVisibleName(toolchain_label) + "\n"); | 148 OutputString(" " + deps[i].GetUserVisibleName(toolchain_label) + "\n"); |
| 166 } | 149 } |
| 167 | 150 |
| 168 void PrintForwardDependentConfigsFrom(const Target* target, | 151 void PrintForwardDependentConfigsFrom(const Target* target, |
| 169 bool display_header) { | 152 bool display_header) { |
| 170 if (target->forward_dependent_configs().empty()) | 153 if (target->forward_dependent_configs().empty()) |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 OutputString(" " + | 281 OutputString(" " + |
| 299 configs[i].label.GetUserVisibleName(toolchain_label) + "\n"); | 282 configs[i].label.GetUserVisibleName(toolchain_label) + "\n"); |
| 300 } | 283 } |
| 301 } | 284 } |
| 302 | 285 |
| 303 void PrintConfigs(const Target* target, bool display_header) { | 286 void PrintConfigs(const Target* target, bool display_header) { |
| 304 PrintConfigsVector(target, target->configs().vector(), "configs", | 287 PrintConfigsVector(target, target->configs().vector(), "configs", |
| 305 display_header); | 288 display_header); |
| 306 } | 289 } |
| 307 | 290 |
| 308 void PrintDirectDependentConfigs(const Target* target, bool display_header) { | 291 void PrintPublicConfigs(const Target* target, bool display_header) { |
| 309 PrintConfigsVector(target, target->direct_dependent_configs(), | 292 PrintConfigsVector(target, target->public_configs(), |
| 310 "direct_dependent_configs", display_header); | 293 "public_configs", display_header); |
| 311 } | 294 } |
| 312 | 295 |
| 313 void PrintAllDependentConfigs(const Target* target, bool display_header) { | 296 void PrintAllDependentConfigs(const Target* target, bool display_header) { |
| 314 PrintConfigsVector(target, target->all_dependent_configs(), | 297 PrintConfigsVector(target, target->all_dependent_configs(), |
| 315 "all_dependent_configs", display_header); | 298 "all_dependent_configs", display_header); |
| 316 } | 299 } |
| 317 | 300 |
| 318 void PrintFileList(const Target::FileList& files, | 301 void PrintFileList(const Target::FileList& files, |
| 319 const std::string& header, | 302 const std::string& header, |
| 320 bool indent_extra, | 303 bool indent_extra, |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 " they're specified. This includes both configs specified in the\n" | 486 " they're specified. This includes both configs specified in the\n" |
| 504 " \"configs\" variable, as well as configs pushed onto this target\n" | 487 " \"configs\" variable, as well as configs pushed onto this target\n" |
| 505 " via dependencies specifying \"all\" or \"direct\" dependent\n" | 488 " via dependencies specifying \"all\" or \"direct\" dependent\n" |
| 506 " configs.\n" | 489 " configs.\n" |
| 507 "\n" | 490 "\n" |
| 508 " deps [--all | --tree]\n" | 491 " deps [--all | --tree]\n" |
| 509 " Show immediate (or, when \"--all\" or \"--tree\" is specified,\n" | 492 " Show immediate (or, when \"--all\" or \"--tree\" is specified,\n" |
| 510 " recursive) dependencies of the given target. \"--tree\" shows them\n" | 493 " recursive) dependencies of the given target. \"--tree\" shows them\n" |
| 511 " in a tree format with duplicates elided (noted by \"...\").\n" | 494 " in a tree format with duplicates elided (noted by \"...\").\n" |
| 512 " \"--all\" shows them sorted alphabetically. Using both flags will\n" | 495 " \"--all\" shows them sorted alphabetically. Using both flags will\n" |
| 513 " print a tree with no omissions. Both \"deps\" and \"datadeps\"\n" | 496 " print a tree with no omissions. The \"deps\", \"public_deps\", and\n" |
| 514 " will be included.\n" | 497 " \"data_deps\" will all be included.\n" |
| 515 "\n" | 498 "\n" |
| 516 " direct_dependent_configs\n" | 499 " public_configs\n" |
| 517 " all_dependent_configs\n" | 500 " all_dependent_configs\n" |
| 518 " Shows the labels of configs applied to targets that depend on this\n" | 501 " Shows the labels of configs applied to targets that depend on this\n" |
| 519 " one (either directly or all of them).\n" | 502 " one (either directly or all of them).\n" |
| 520 "\n" | 503 "\n" |
| 521 " forward_dependent_configs_from\n" | 504 " forward_dependent_configs_from\n" |
| 522 " Shows the labels of dependencies for which dependent configs will\n" | 505 " Shows the labels of dependencies for which dependent configs will\n" |
| 523 " be pushed to targets depending on the current one.\n" | 506 " be pushed to targets depending on the current one.\n" |
| 524 "\n" | 507 "\n" |
| 525 " script\n" | 508 " script\n" |
| 526 " args\n" | 509 " args\n" |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 589 return 1; | 572 return 1; |
| 590 | 573 |
| 591 #define CONFIG_VALUE_HANDLER(name, type) \ | 574 #define CONFIG_VALUE_HANDLER(name, type) \ |
| 592 } else if (what == #name) { OUTPUT_CONFIG_VALUE(name, type) | 575 } else if (what == #name) { OUTPUT_CONFIG_VALUE(name, type) |
| 593 | 576 |
| 594 if (args.size() == 3) { | 577 if (args.size() == 3) { |
| 595 // User specified one thing to display. | 578 // User specified one thing to display. |
| 596 const std::string& what = args[2]; | 579 const std::string& what = args[2]; |
| 597 if (what == variables::kConfigs) { | 580 if (what == variables::kConfigs) { |
| 598 PrintConfigs(target, false); | 581 PrintConfigs(target, false); |
| 599 } else if (what == variables::kDirectDependentConfigs) { | 582 } else if (what == variables::kPublicConfigs) { |
| 600 PrintDirectDependentConfigs(target, false); | 583 PrintPublicConfigs(target, false); |
| 601 } else if (what == variables::kAllDependentConfigs) { | 584 } else if (what == variables::kAllDependentConfigs) { |
| 602 PrintAllDependentConfigs(target, false); | 585 PrintAllDependentConfigs(target, false); |
| 603 } else if (what == variables::kForwardDependentConfigsFrom) { | 586 } else if (what == variables::kForwardDependentConfigsFrom) { |
| 604 PrintForwardDependentConfigsFrom(target, false); | 587 PrintForwardDependentConfigsFrom(target, false); |
| 605 } else if (what == variables::kSources) { | 588 } else if (what == variables::kSources) { |
| 606 PrintSources(target, false); | 589 PrintSources(target, false); |
| 607 } else if (what == variables::kPublic) { | 590 } else if (what == variables::kPublic) { |
| 608 PrintPublic(target, false); | 591 PrintPublic(target, false); |
| 609 } else if (what == variables::kCheckIncludes) { | 592 } else if (what == variables::kCheckIncludes) { |
| 610 PrintCheckIncludes(target, false); | 593 PrintCheckIncludes(target, false); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 677 PrintPublic(target, true); | 660 PrintPublic(target, true); |
| 678 PrintCheckIncludes(target, true); | 661 PrintCheckIncludes(target, true); |
| 679 PrintAllowCircularIncludesFrom(target, true); | 662 PrintAllowCircularIncludesFrom(target, true); |
| 680 } | 663 } |
| 681 PrintVisibility(target, true); | 664 PrintVisibility(target, true); |
| 682 if (is_binary_output) { | 665 if (is_binary_output) { |
| 683 PrintTestonly(target, true); | 666 PrintTestonly(target, true); |
| 684 PrintConfigs(target, true); | 667 PrintConfigs(target, true); |
| 685 } | 668 } |
| 686 | 669 |
| 687 PrintDirectDependentConfigs(target, true); | 670 PrintPublicConfigs(target, true); |
| 688 PrintAllDependentConfigs(target, true); | 671 PrintAllDependentConfigs(target, true); |
| 689 PrintForwardDependentConfigsFrom(target, true); | 672 PrintForwardDependentConfigsFrom(target, true); |
| 690 | 673 |
| 691 PrintInputs(target, true); | 674 PrintInputs(target, true); |
| 692 | 675 |
| 693 if (is_binary_output) { | 676 if (is_binary_output) { |
| 694 OUTPUT_CONFIG_VALUE(defines, std::string) | 677 OUTPUT_CONFIG_VALUE(defines, std::string) |
| 695 OUTPUT_CONFIG_VALUE(include_dirs, SourceDir) | 678 OUTPUT_CONFIG_VALUE(include_dirs, SourceDir) |
| 696 OUTPUT_CONFIG_VALUE(cflags, std::string) | 679 OUTPUT_CONFIG_VALUE(cflags, std::string) |
| 697 OUTPUT_CONFIG_VALUE(cflags_c, std::string) | 680 OUTPUT_CONFIG_VALUE(cflags_c, std::string) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 718 // so always display them, even for groups and such. | 701 // so always display them, even for groups and such. |
| 719 PrintLibs(target, true); | 702 PrintLibs(target, true); |
| 720 PrintLibDirs(target, true); | 703 PrintLibDirs(target, true); |
| 721 | 704 |
| 722 PrintDeps(target, true); | 705 PrintDeps(target, true); |
| 723 | 706 |
| 724 return 0; | 707 return 0; |
| 725 } | 708 } |
| 726 | 709 |
| 727 } // namespace commands | 710 } // namespace commands |
| OLD | NEW |