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/file_template.h" | |
14 #include "tools/gn/filesystem_utils.h" | 13 #include "tools/gn/filesystem_utils.h" |
15 #include "tools/gn/item.h" | 14 #include "tools/gn/item.h" |
16 #include "tools/gn/label.h" | 15 #include "tools/gn/label.h" |
17 #include "tools/gn/setup.h" | 16 #include "tools/gn/setup.h" |
18 #include "tools/gn/standard_out.h" | 17 #include "tools/gn/standard_out.h" |
| 18 #include "tools/gn/substitution_writer.h" |
19 #include "tools/gn/target.h" | 19 #include "tools/gn/target.h" |
20 | 20 |
21 namespace commands { | 21 namespace commands { |
22 | 22 |
23 namespace { | 23 namespace { |
24 | 24 |
25 // Prints the given directory in a nice way for the user to view. | 25 // Prints the given directory in a nice way for the user to view. |
26 std::string FormatSourceDir(const SourceDir& dir) { | 26 std::string FormatSourceDir(const SourceDir& dir) { |
27 #if defined(OS_WIN) | 27 #if defined(OS_WIN) |
28 // On Windows we fix up system absolute paths to look like native ones. | 28 // On Windows we fix up system absolute paths to look like native ones. |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 OutputString("\n" + header + ":\n"); | 275 OutputString("\n" + header + ":\n"); |
276 | 276 |
277 std::string indent = indent_extra ? " " : " "; | 277 std::string indent = indent_extra ? " " : " "; |
278 | 278 |
279 Target::FileList sorted = files; | 279 Target::FileList sorted = files; |
280 std::sort(sorted.begin(), sorted.end()); | 280 std::sort(sorted.begin(), sorted.end()); |
281 for (size_t i = 0; i < sorted.size(); i++) | 281 for (size_t i = 0; i < sorted.size(); i++) |
282 OutputString(indent + sorted[i].value() + "\n"); | 282 OutputString(indent + sorted[i].value() + "\n"); |
283 } | 283 } |
284 | 284 |
285 // This sorts the list. | |
286 void PrintStringList(const std::vector<std::string>& strings, | |
287 const std::string& header, | |
288 bool indent_extra, | |
289 bool display_header) { | |
290 if (strings.empty()) | |
291 return; | |
292 | |
293 if (display_header) | |
294 OutputString("\n" + header + ":\n"); | |
295 | |
296 std::string indent = indent_extra ? " " : " "; | |
297 | |
298 std::vector<std::string> sorted = strings; | |
299 std::sort(sorted.begin(), sorted.end()); | |
300 for (size_t i = 0; i < sorted.size(); i++) | |
301 OutputString(indent + sorted[i] + "\n"); | |
302 } | |
303 | |
304 void PrintSources(const Target* target, bool display_header) { | 285 void PrintSources(const Target* target, bool display_header) { |
305 PrintFileList(target->sources(), "sources", false, display_header); | 286 PrintFileList(target->sources(), "sources", false, display_header); |
306 } | 287 } |
307 | 288 |
308 void PrintInputs(const Target* target, bool display_header) { | 289 void PrintInputs(const Target* target, bool display_header) { |
309 PrintFileList(target->inputs(), "inputs", false, display_header); | 290 PrintFileList(target->inputs(), "inputs", false, display_header); |
310 } | 291 } |
311 | 292 |
312 void PrintOutputs(const Target* target, bool display_header) { | 293 void PrintOutputs(const Target* target, bool display_header) { |
| 294 if (display_header) |
| 295 OutputString("\noutputs:\n"); |
| 296 |
313 if (target->output_type() == Target::ACTION) { | 297 if (target->output_type() == Target::ACTION) { |
314 // Just display the outputs directly. | 298 // Action, print out outputs, don't apply sources to it. |
315 PrintStringList(target->action_values().outputs(), "outputs", false, | 299 for (size_t i = 0; i < target->action_values().outputs().list().size(); |
316 display_header); | 300 i++) { |
317 } else if (target->output_type() == Target::ACTION_FOREACH || | 301 OutputString(" " + |
318 target->output_type() == Target::COPY_FILES) { | 302 target->action_values().outputs().list()[i].AsString() + |
319 // Display both the output pattern and resolved list. | 303 "\n"); |
320 if (display_header) | 304 } |
321 OutputString("\noutputs:\n"); | 305 } else { |
| 306 const SubstitutionList& outputs = target->action_values().outputs(); |
| 307 if (!outputs.required_types().empty()) { |
| 308 // Display the pattern and resolved pattern separately, since there are |
| 309 // subtitutions used. |
| 310 OutputString(" Output pattern:\n"); |
| 311 for (size_t i = 0; i < outputs.list().size(); i++) |
| 312 OutputString(" " + outputs.list()[i].AsString() + "\n"); |
322 | 313 |
323 // Display the pattern. | 314 // Now display what that resolves to given the sources. |
324 OutputString(" Output pattern:\n"); | 315 OutputString("\n Resolved output file list:\n"); |
325 PrintStringList(target->action_values().outputs(), "", true, false); | 316 } |
326 | 317 |
327 // Now display what that resolves to given the sources. | 318 // Resolved output list. |
328 OutputString("\n Resolved output file list:\n"); | 319 std::vector<SourceFile> output_files; |
329 | 320 SubstitutionWriter::ApplyListToSources(target->settings(), outputs, |
330 std::vector<std::string> output_strings; | 321 target->sources(), &output_files); |
331 FileTemplate file_template = FileTemplate::GetForTargetOutputs(target); | 322 PrintFileList(output_files, "", true, false); |
332 for (size_t i = 0; i < target->sources().size(); i++) | |
333 file_template.Apply(target->sources()[i], &output_strings); | |
334 PrintStringList(output_strings, "", true, false); | |
335 } | 323 } |
336 } | 324 } |
337 | 325 |
338 void PrintScript(const Target* target, bool display_header) { | 326 void PrintScript(const Target* target, bool display_header) { |
339 if (display_header) | 327 if (display_header) |
340 OutputString("\nscript:\n"); | 328 OutputString("\nscript:\n"); |
341 OutputString(" " + target->action_values().script().value() + "\n"); | 329 OutputString(" " + target->action_values().script().value() + "\n"); |
342 } | 330 } |
343 | 331 |
344 void PrintArgs(const Target* target, bool display_header) { | 332 void PrintArgs(const Target* target, bool display_header) { |
345 if (display_header) | 333 if (display_header) |
346 OutputString("\nargs:\n"); | 334 OutputString("\nargs:\n"); |
347 for (size_t i = 0; i < target->action_values().args().size(); i++) | 335 for (size_t i = 0; i < target->action_values().args().list().size(); i++) { |
348 OutputString(" " + target->action_values().args()[i] + "\n"); | 336 OutputString(" " + |
| 337 target->action_values().args().list()[i].AsString() + "\n"); |
| 338 } |
349 } | 339 } |
350 | 340 |
351 void PrintDepfile(const Target* target, bool display_header) { | 341 void PrintDepfile(const Target* target, bool display_header) { |
352 if (target->action_values().depfile().value().empty()) | 342 if (target->action_values().depfile().empty()) |
353 return; | 343 return; |
354 if (display_header) | 344 if (display_header) |
355 OutputString("\ndepfile:\n"); | 345 OutputString("\ndepfile:\n"); |
356 OutputString(" " + target->action_values().depfile().value() + "\n"); | 346 OutputString(" " + target->action_values().depfile().AsString() + "\n"); |
357 } | 347 } |
358 | 348 |
359 // Attribute the origin for attributing from where a target came from. Does | 349 // Attribute the origin for attributing from where a target came from. Does |
360 // nothing if the input is null or it does not have a location. | 350 // nothing if the input is null or it does not have a location. |
361 void OutputSourceOfDep(const ParseNode* origin, std::ostream& out) { | 351 void OutputSourceOfDep(const ParseNode* origin, std::ostream& out) { |
362 if (!origin) | 352 if (!origin) |
363 return; | 353 return; |
364 Location location = origin->GetRange().begin(); | 354 Location location = origin->GetRange().begin(); |
365 out << " (Added by " + location.file()->name().value() << ":" | 355 out << " (Added by " + location.file()->name().value() << ":" |
366 << location.line_number() << ")\n"; | 356 << location.line_number() << ")\n"; |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 // so always display them, even for groups and such. | 635 // so always display them, even for groups and such. |
646 PrintLibs(target, true); | 636 PrintLibs(target, true); |
647 PrintLibDirs(target, true); | 637 PrintLibDirs(target, true); |
648 | 638 |
649 PrintDeps(target, true); | 639 PrintDeps(target, true); |
650 | 640 |
651 return 0; | 641 return 0; |
652 } | 642 } |
653 | 643 |
654 } // namespace commands | 644 } // namespace commands |
OLD | NEW |