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" |
11 #include "tools/gn/config.h" | 11 #include "tools/gn/config.h" |
12 #include "tools/gn/config_values_extractors.h" | 12 #include "tools/gn/config_values_extractors.h" |
13 #include "tools/gn/item.h" | 13 #include "tools/gn/item.h" |
14 #include "tools/gn/item_node.h" | 14 #include "tools/gn/item_node.h" |
15 #include "tools/gn/label.h" | 15 #include "tools/gn/label.h" |
16 #include "tools/gn/setup.h" | 16 #include "tools/gn/setup.h" |
17 #include "tools/gn/standard_out.h" | 17 #include "tools/gn/standard_out.h" |
18 #include "tools/gn/target.h" | 18 #include "tools/gn/target.h" |
19 | 19 |
20 namespace commands { | 20 namespace commands { |
21 | 21 |
22 namespace { | 22 namespace { |
23 | 23 |
24 const char kIncludeDataDeps[] = "include-datadeps"; | |
25 | |
24 struct CompareTargetLabel { | 26 struct CompareTargetLabel { |
25 bool operator()(const Target* a, const Target* b) const { | 27 bool operator()(const Target* a, const Target* b) const { |
26 return a->label() < b->label(); | 28 return a->label() < b->label(); |
27 } | 29 } |
28 }; | 30 }; |
29 | 31 |
30 void RecursiveCollectDeps(const Target* target, std::set<Label>* result) { | 32 void RecursiveCollectDeps(const Target* target, std::set<Label>* result) { |
31 if (result->find(target->label()) != result->end()) | 33 if (result->find(target->label()) != result->end()) |
32 return; // Already did this target. | 34 return; // Already did this target. |
33 result->insert(target->label()); | 35 result->insert(target->label()); |
34 | 36 |
35 const std::vector<const Target*>& deps = target->deps(); | 37 const std::vector<const Target*>& deps = target->deps(); |
36 for (size_t i = 0; i < deps.size(); i++) | 38 for (size_t i = 0; i < deps.size(); i++) |
37 RecursiveCollectDeps(deps[i], result); | 39 RecursiveCollectDeps(deps[i], result); |
40 | |
41 if (CommandLine::ForCurrentProcess()->HasSwitch(kIncludeDataDeps)) { | |
42 const std::vector<const Target*>& datadeps = target->datadeps(); | |
43 for (size_t i = 0; i < datadeps.size(); i++) | |
44 RecursiveCollectDeps(datadeps[i], result); | |
45 } | |
38 } | 46 } |
39 | 47 |
40 // Prints dependencies of the given target (not the target itself). | 48 // Prints dependencies of the given target (not the target itself). |
41 void RecursivePrintDeps(const Target* target, | 49 void RecursivePrintDeps(const Target* target, |
42 const Label& default_toolchain, | 50 const Label& default_toolchain, |
43 int indent_level) { | 51 int indent_level) { |
44 std::vector<const Target*> sorted_deps = target->deps(); | 52 std::vector<const Target*> sorted_deps = target->deps(); |
53 if (CommandLine::ForCurrentProcess()->HasSwitch(kIncludeDataDeps)) { | |
54 const std::vector<const Target*> datadeps = target->datadeps(); | |
55 for (size_t i = 0; i < datadeps.size(); i++) | |
56 sorted_deps.push_back(datadeps[i]); | |
57 } | |
58 | |
45 std::sort(sorted_deps.begin(), sorted_deps.end(), CompareTargetLabel()); | 59 std::sort(sorted_deps.begin(), sorted_deps.end(), CompareTargetLabel()); |
46 | 60 |
47 std::string indent(indent_level * 2, ' '); | 61 std::string indent(indent_level * 2, ' '); |
48 for (size_t i = 0; i < sorted_deps.size(); i++) { | 62 for (size_t i = 0; i < sorted_deps.size(); i++) { |
49 OutputString(indent + | 63 OutputString(indent + |
50 sorted_deps[i]->label().GetUserVisibleName(default_toolchain) + "\n"); | 64 sorted_deps[i]->label().GetUserVisibleName(default_toolchain) + "\n"); |
51 RecursivePrintDeps(sorted_deps[i], default_toolchain, indent_level + 1); | 65 RecursivePrintDeps(sorted_deps[i], default_toolchain, indent_level + 1); |
52 } | 66 } |
53 } | 67 } |
54 | 68 |
55 void PrintDeps(const Target* target, bool display_header) { | 69 void PrintDeps(const Target* target, bool display_header) { |
70 const CommandLine* cmdline = CommandLine::ForCurrentProcess(); | |
56 Label toolchain_label = target->label().GetToolchainLabel(); | 71 Label toolchain_label = target->label().GetToolchainLabel(); |
57 | 72 |
58 // Tree mode is separate. | 73 // Tree mode is separate. |
59 if (CommandLine::ForCurrentProcess()->HasSwitch("tree")) { | 74 if (cmdline->HasSwitch("tree")) { |
60 if (display_header) | 75 if (display_header) |
61 OutputString("\nDependency tree:\n"); | 76 OutputString("\nDependency tree:\n"); |
62 RecursivePrintDeps(target, toolchain_label, 1); | 77 RecursivePrintDeps(target, toolchain_label, 1); |
63 return; | 78 return; |
64 } | 79 } |
65 | 80 |
66 // Collect the deps to display. | 81 // Collect the deps to display. |
67 std::vector<Label> deps; | 82 std::vector<Label> deps; |
68 if (CommandLine::ForCurrentProcess()->HasSwitch("all")) { | 83 if (cmdline->HasSwitch("all")) { |
69 if (display_header) | 84 if (display_header) |
70 OutputString("\nAll recursive dependencies:\n"); | 85 OutputString("\nAll recursive dependencies:\n"); |
71 | 86 |
72 std::set<Label> all_deps; | 87 std::set<Label> all_deps; |
73 RecursiveCollectDeps(target, &all_deps); | 88 RecursiveCollectDeps(target, &all_deps); |
74 for (std::set<Label>::iterator i = all_deps.begin(); | 89 for (std::set<Label>::iterator i = all_deps.begin(); |
75 i != all_deps.end(); ++i) | 90 i != all_deps.end(); ++i) |
76 deps.push_back(*i); | 91 deps.push_back(*i); |
77 } else { | 92 } else { |
78 if (display_header) { | 93 if (display_header) { |
79 OutputString("\nDirect dependencies " | 94 OutputString("\nDirect dependencies " |
80 "(try also \"--all\" and \"--tree\"):\n"); | 95 "(try also \"--all\" and \"--tree\"):\n"); |
81 } | 96 } |
82 | 97 |
83 const std::vector<const Target*>& target_deps = target->deps(); | 98 const std::vector<const Target*>& target_deps = target->deps(); |
84 for (size_t i = 0; i < target_deps.size(); i++) | 99 for (size_t i = 0; i < target_deps.size(); i++) |
85 deps.push_back(target_deps[i]->label()); | 100 deps.push_back(target_deps[i]->label()); |
101 | |
102 // Optionally include data deps. | |
103 if (cmdline->HasSwitch(kIncludeDataDeps)) { | |
scottmg
2013/08/06 20:27:58
i feel like you probably always want to see these,
brettw
2013/08/06 21:10:22
Okay, I removed this and included them all the tim
| |
104 const std::vector<const Target*>& target_datadeps = target->datadeps(); | |
105 for (size_t i = 0; i < target_datadeps.size(); i++) | |
106 deps.push_back(target_datadeps[i]->label()); | |
107 } | |
86 } | 108 } |
87 | 109 |
88 std::sort(deps.begin(), deps.end()); | 110 std::sort(deps.begin(), deps.end()); |
89 for (size_t i = 0; i < deps.size(); i++) | 111 for (size_t i = 0; i < deps.size(); i++) |
90 OutputString(" " + deps[i].GetUserVisibleName(toolchain_label) + "\n"); | 112 OutputString(" " + deps[i].GetUserVisibleName(toolchain_label) + "\n"); |
91 } | 113 } |
92 | 114 |
93 void PrintConfigs(const Target* target, bool display_header) { | 115 void PrintConfigs(const Target* target, bool display_header) { |
94 // Configs (don't sort since the order determines how things are processed). | 116 // Configs (don't sort since the order determines how things are processed). |
95 if (display_header) | 117 if (display_header) |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
216 " sources\n" | 238 " sources\n" |
217 " Source files.\n" | 239 " Source files.\n" |
218 "\n" | 240 "\n" |
219 " configs\n" | 241 " configs\n" |
220 " Shows configs applied to the given target, sorted in the order\n" | 242 " Shows configs applied to the given target, sorted in the order\n" |
221 " they're specified. This includes both configs specified in the\n" | 243 " they're specified. This includes both configs specified in the\n" |
222 " \"configs\" variable, as well as configs pushed onto this target\n" | 244 " \"configs\" variable, as well as configs pushed onto this target\n" |
223 " via dependencies specifying \"all\" or \"direct\" dependent\n" | 245 " via dependencies specifying \"all\" or \"direct\" dependent\n" |
224 " configs.\n" | 246 " configs.\n" |
225 "\n" | 247 "\n" |
226 " deps [--all | --tree]\n" | 248 " deps [--all | --tree] [--include-datadeps]\n" |
227 " Show immediate (or, when \"--all\" or \"--tree\" is specified,\n" | 249 " Show immediate (or, when \"--all\" or \"--tree\" is specified,\n" |
228 " recursive) dependencies of the given target. \"--tree\" shows them\n" | 250 " recursive) dependencies of the given target. \"--tree\" shows them\n" |
229 " in a tree format. Otherwise, they will be sorted alphabetically.\n" | 251 " in a tree format. Otherwise, they will be sorted alphabetically.\n" |
230 "\n" | 252 "\n" |
253 " If \"--include-datadeps\" is specified, the datadeps will be shown\n" | |
254 " mixed in with the regular dependendencies.\n" | |
255 "\n" | |
231 " defines [--blame]\n" | 256 " defines [--blame]\n" |
232 " includes [--blame]\n" | 257 " includes [--blame]\n" |
233 " cflags [--blame]\n" | 258 " cflags [--blame]\n" |
234 " cflags_cc [--blame]\n" | 259 " cflags_cc [--blame]\n" |
235 " cflags_cxx [--blame]\n" | 260 " cflags_cxx [--blame]\n" |
236 " ldflags [--blame]\n" | 261 " ldflags [--blame]\n" |
237 " Shows the given values taken from the target and all configs\n" | 262 " Shows the given values taken from the target and all configs\n" |
238 " applying. See \"--blame\" below.\n" | 263 " applying. See \"--blame\" below.\n" |
239 "\n" | 264 "\n" |
240 " --blame\n" | 265 " --blame\n" |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
322 PrintConfigs(target, true); | 347 PrintConfigs(target, true); |
323 OutputString("\n (Use \"gn desc <label> <thing you want to see>\" to show " | 348 OutputString("\n (Use \"gn desc <label> <thing you want to see>\" to show " |
324 "the actual values\n applied by the different configs. " | 349 "the actual values\n applied by the different configs. " |
325 "See \"gn help desc\" for more.)\n"); | 350 "See \"gn help desc\" for more.)\n"); |
326 PrintDeps(target, true); | 351 PrintDeps(target, true); |
327 | 352 |
328 return 0; | 353 return 0; |
329 } | 354 } |
330 | 355 |
331 } // namespace commands | 356 } // namespace commands |
OLD | NEW |