| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <algorithm> |
| #include <set> |
| |
| #include "base/command_line.h" |
| #include "tools/gn/commands.h" |
| #include "tools/gn/label_pattern.h" |
| #include "tools/gn/setup.h" |
| #include "tools/gn/standard_out.h" |
| #include "tools/gn/switches.h" |
| #include "tools/gn/target.h" |
| |
| namespace commands { |
| |
| const char kLs[] = "ls"; |
| const char kLs_HelpShort[] = "ls: List matching targets."; |
| const char kLs_Help[] = |
| R"(gn ls <out_dir> [<label_pattern>] [--all-toolchains] [--as=...] |
| [--type=...] [--testonly=...] |
| |
| Lists all targets matching the given pattern for the given build directory. |
| By default, only targets in the default toolchain will be matched unless a |
| toolchain is explicitly supplied. |
| |
| If the label pattern is unspecified, list all targets. The label pattern is |
| not a general regular expression (see "gn help label_pattern"). If you need |
| more complex expressions, pipe the result through grep. |
| |
| Options |
| |
| )" TARGET_PRINTING_MODE_COMMAND_LINE_HELP "\n" ALL_TOOLCHAINS_SWITCH_HELP |
| "\n" TARGET_TESTONLY_FILTER_COMMAND_LINE_HELP |
| "\n" TARGET_TYPE_FILTER_COMMAND_LINE_HELP |
| R"( |
| Examples |
| |
| gn ls out/Debug |
| Lists all targets in the default toolchain. |
| |
| gn ls out/Debug "//base/*" |
| Lists all targets in the directory base and all subdirectories. |
| |
| gn ls out/Debug "//base:*" |
| Lists all targets defined in //base/BUILD.gn. |
| |
| gn ls out/Debug //base --as=output |
| Lists the build output file for //base:base |
| |
| gn ls out/Debug --type=executable |
| Lists all executables produced by the build. |
| |
| gn ls out/Debug "//base/*" --as=output | xargs ninja -C out/Debug |
| Builds all targets in //base and all subdirectories. |
| |
| gn ls out/Debug //base --all-toolchains |
| Lists all variants of the target //base:base (it may be referenced |
| in multiple toolchains). |
| )"; |
| |
| int RunLs(const std::vector<std::string>& args) { |
| if (args.size() == 0) { |
| Err(Location(), "You're holding it wrong.", |
| "Usage: \"gn ls <build dir> [<label_pattern>]*\"") |
| .PrintToStdout(); |
| return 1; |
| } |
| |
| // Deliberately leaked to avoid expensive process teardown. |
| Setup* setup = new Setup; |
| if (!setup->DoSetup(args[0], false) || !setup->Run()) |
| return 1; |
| |
| const base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess(); |
| bool all_toolchains = cmdline->HasSwitch(switches::kAllToolchains); |
| |
| std::vector<const Target*> matches; |
| if (args.size() > 1) { |
| // Some patterns or explicit labels were specified. |
| std::vector<std::string> inputs(args.begin() + 1, args.end()); |
| |
| UniqueVector<const Target*> target_matches; |
| UniqueVector<const Config*> config_matches; |
| UniqueVector<const Toolchain*> toolchain_matches; |
| UniqueVector<SourceFile> file_matches; |
| if (!ResolveFromCommandLineInput(setup, inputs, all_toolchains, |
| &target_matches, &config_matches, |
| &toolchain_matches, &file_matches)) |
| return 1; |
| matches.insert(matches.begin(), target_matches.begin(), |
| target_matches.end()); |
| } else if (all_toolchains) { |
| // List all resolved targets. |
| matches = setup->builder().GetAllResolvedTargets(); |
| } else { |
| // List all resolved targets in the default toolchain. |
| for (auto* target : setup->builder().GetAllResolvedTargets()) { |
| if (target->settings()->is_default()) |
| matches.push_back(target); |
| } |
| } |
| FilterAndPrintTargets(false, &matches); |
| return 0; |
| } |
| |
| } // namespace commands |