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

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

Issue 1342183003: Allow GN configs to have sub-configs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 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.cc ('k') | tools/gn/config.h » ('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 <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/deps_iterator.h" 13 #include "tools/gn/deps_iterator.h"
14 #include "tools/gn/filesystem_utils.h" 14 #include "tools/gn/filesystem_utils.h"
15 #include "tools/gn/item.h" 15 #include "tools/gn/item.h"
16 #include "tools/gn/label.h" 16 #include "tools/gn/label.h"
17 #include "tools/gn/runtime_deps.h" 17 #include "tools/gn/runtime_deps.h"
18 #include "tools/gn/setup.h" 18 #include "tools/gn/setup.h"
19 #include "tools/gn/standard_out.h" 19 #include "tools/gn/standard_out.h"
20 #include "tools/gn/substitution_writer.h" 20 #include "tools/gn/substitution_writer.h"
21 #include "tools/gn/target.h" 21 #include "tools/gn/target.h"
22 #include "tools/gn/variables.h" 22 #include "tools/gn/variables.h"
23 23
24 namespace commands { 24 namespace commands {
25 25
26 namespace { 26 namespace {
27 27
28 // The switch for displaying blame. 28 // Desc-specific command line switches.
29 const char kBlame[] = "blame"; 29 const char kBlame[] = "blame";
30 const char kTree[] = "tree";
30 31
31 // Prints the given directory in a nice way for the user to view. 32 // Prints the given directory in a nice way for the user to view.
32 std::string FormatSourceDir(const SourceDir& dir) { 33 std::string FormatSourceDir(const SourceDir& dir) {
33 #if defined(OS_WIN) 34 #if defined(OS_WIN)
34 // On Windows we fix up system absolute paths to look like native ones. 35 // On Windows we fix up system absolute paths to look like native ones.
35 // Internally, they'll look like "/C:\foo\bar/" 36 // Internally, they'll look like "/C:\foo\bar/"
36 if (dir.is_system_absolute()) { 37 if (dir.is_system_absolute()) {
37 std::string buf = dir.value(); 38 std::string buf = dir.value();
38 if (buf.size() > 3 && buf[2] == ':') { 39 if (buf.size() > 3 && buf[2] == ':') {
39 buf.erase(buf.begin()); // Erase beginning slash. 40 buf.erase(buf.begin()); // Erase beginning slash.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 indent_level + 1); 107 indent_level + 1);
107 } 108 }
108 } 109 }
109 } 110 }
110 111
111 void PrintDeps(const Target* target, bool display_header) { 112 void PrintDeps(const Target* target, bool display_header) {
112 const base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess(); 113 const base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
113 Label toolchain_label = target->label().GetToolchainLabel(); 114 Label toolchain_label = target->label().GetToolchainLabel();
114 115
115 // Tree mode is separate. 116 // Tree mode is separate.
116 if (cmdline->HasSwitch("tree")) { 117 if (cmdline->HasSwitch(kTree)) {
117 if (display_header) 118 if (display_header)
118 OutputString("\nDependency tree:\n"); 119 OutputString("\nDependency tree:\n");
119 120
120 if (cmdline->HasSwitch("all")) { 121 if (cmdline->HasSwitch("all")) {
121 // Show all tree deps with no eliding. 122 // Show all tree deps with no eliding.
122 RecursivePrintDeps(target, toolchain_label, nullptr, 1); 123 RecursivePrintDeps(target, toolchain_label, nullptr, 1);
123 } else { 124 } else {
124 // Don't recurse into duplicates. 125 // Don't recurse into duplicates.
125 std::set<const Target*> seen_targets; 126 std::set<const Target*> seen_targets;
126 RecursivePrintDeps(target, toolchain_label, &seen_targets, 1); 127 RecursivePrintDeps(target, toolchain_label, &seen_targets, 1);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 void PrintTestonly(const Target* target, bool display_header) { 243 void PrintTestonly(const Target* target, bool display_header) {
243 if (display_header) 244 if (display_header)
244 OutputString("\ntestonly:\n"); 245 OutputString("\ntestonly:\n");
245 246
246 if (target->testonly()) 247 if (target->testonly())
247 OutputString(" true\n"); 248 OutputString(" true\n");
248 else 249 else
249 OutputString(" false\n"); 250 OutputString(" false\n");
250 } 251 }
251 252
253 // Recursively prints subconfigs of a config.
254 void PrintSubConfigs(const Config* config, int indent_level) {
255 if (config->configs().empty())
256 return;
257
258 std::string indent(indent_level * 2, ' ');
259 Label toolchain_label = config->label().GetToolchainLabel();
260 for (const auto& pair : config->configs()) {
261 OutputString(
262 indent + pair.label.GetUserVisibleName(toolchain_label) + "\n");
263 PrintSubConfigs(pair.ptr, indent_level + 1);
264 }
265 }
266
267 // This allows configs stored as either std::vector<LabelConfigPair> or
268 // UniqueVector<LabelConfigPair> to be printed.
269 template <class VectorType>
252 void PrintConfigsVector(const Target* target, 270 void PrintConfigsVector(const Target* target,
253 const LabelConfigVector& configs, 271 const VectorType& configs,
254 const std::string& heading, 272 const std::string& heading,
255 bool display_header) { 273 bool display_header) {
256 if (configs.empty()) 274 if (configs.empty())
257 return; 275 return;
258 276
277 bool tree = base::CommandLine::ForCurrentProcess()->HasSwitch(kTree);
278
259 // Don't sort since the order determines how things are processed. 279 // Don't sort since the order determines how things are processed.
260 if (display_header) 280 if (display_header) {
261 OutputString("\n" + heading + " (in order applying):\n"); 281 if (tree)
282 OutputString("\n" + heading + " tree (in order applying):\n");
283 else
284 OutputString("\n" + heading + " (in order applying, try also --tree):\n");
285 }
262 286
263 Label toolchain_label = target->label().GetToolchainLabel(); 287 Label toolchain_label = target->label().GetToolchainLabel();
264 for (const auto& config : configs) { 288 for (const auto& config : configs) {
265 OutputString(" " + config.label.GetUserVisibleName(toolchain_label) + 289 OutputString(" " + config.label.GetUserVisibleName(toolchain_label) +
266 "\n"); 290 "\n");
291 if (tree)
292 PrintSubConfigs(config.ptr, 2); // 2 = start with double-indent.
267 } 293 }
268 } 294 }
269 295
270 void PrintConfigsVector(const Target* target,
271 const UniqueVector<LabelConfigPair>& configs,
272 const std::string& heading,
273 bool display_header) {
274 if (configs.empty())
275 return;
276
277 // Don't sort since the order determines how things are processed.
278 if (display_header)
279 OutputString("\n" + heading + " (in order applying):\n");
280
281 Label toolchain_label = target->label().GetToolchainLabel();
282 for (const auto& config : configs) {
283 OutputString(" " + config.label.GetUserVisibleName(toolchain_label) +
284 "\n");
285 }
286 }
287
288 void PrintConfigs(const Target* target, bool display_header) { 296 void PrintConfigs(const Target* target, bool display_header) {
289 PrintConfigsVector(target, target->configs().vector(), "configs", 297 PrintConfigsVector(target, target->configs().vector(), "configs",
290 display_header); 298 display_header);
291 } 299 }
292 300
293 void PrintPublicConfigs(const Target* target, bool display_header) { 301 void PrintPublicConfigs(const Target* target, bool display_header) {
294 PrintConfigsVector(target, target->public_configs(), 302 PrintConfigsVector(target, target->public_configs(),
295 "public_configs", display_header); 303 "public_configs", display_header);
296 } 304 }
297 305
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 // so always display them, even for groups and such. 767 // so always display them, even for groups and such.
760 PrintLibs(target, true); 768 PrintLibs(target, true);
761 PrintLibDirs(target, true); 769 PrintLibDirs(target, true);
762 770
763 PrintDeps(target, true); 771 PrintDeps(target, true);
764 772
765 return 0; 773 return 0;
766 } 774 }
767 775
768 } // namespace commands 776 } // namespace commands
OLDNEW
« no previous file with comments | « tools/gn/builder.cc ('k') | tools/gn/config.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698