| // Copyright (c) 2013 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. |
| |
| #ifndef TOOLS_GN_COMMANDS_H_ |
| #define TOOLS_GN_COMMANDS_H_ |
| |
| #include <map> |
| #include <set> |
| #include <string> |
| #include <string_view> |
| #include <vector> |
| |
| #include "base/values.h" |
| #include "gn/target.h" |
| #include "gn/unique_vector.h" |
| |
| class BuildSettings; |
| class Config; |
| class LabelPattern; |
| class Setup; |
| class SourceFile; |
| class Target; |
| class Toolchain; |
| |
| namespace base { |
| class CommandLine; |
| } // namespace base |
| |
| // Each "Run" command returns the value we should return from main(). |
| |
| namespace commands { |
| |
| using CommandRunner = int (*)(const std::vector<std::string>&); |
| |
| extern const char kAnalyze[]; |
| extern const char kAnalyze_HelpShort[]; |
| extern const char kAnalyze_Help[]; |
| int RunAnalyze(const std::vector<std::string>& args); |
| |
| extern const char kArgs[]; |
| extern const char kArgs_HelpShort[]; |
| extern const char kArgs_Help[]; |
| int RunArgs(const std::vector<std::string>& args); |
| |
| extern const char kCheck[]; |
| extern const char kCheck_HelpShort[]; |
| extern const char kCheck_Help[]; |
| int RunCheck(const std::vector<std::string>& args); |
| |
| extern const char kClean[]; |
| extern const char kClean_HelpShort[]; |
| extern const char kClean_Help[]; |
| int RunClean(const std::vector<std::string>& args); |
| |
| extern const char kDesc[]; |
| extern const char kDesc_HelpShort[]; |
| extern const char kDesc_Help[]; |
| int RunDesc(const std::vector<std::string>& args); |
| |
| extern const char kGen[]; |
| extern const char kGen_HelpShort[]; |
| extern const char kGen_Help[]; |
| int RunGen(const std::vector<std::string>& args); |
| |
| extern const char kFormat[]; |
| extern const char kFormat_HelpShort[]; |
| extern const char kFormat_Help[]; |
| int RunFormat(const std::vector<std::string>& args); |
| |
| extern const char kHelp[]; |
| extern const char kHelp_HelpShort[]; |
| extern const char kHelp_Help[]; |
| int RunHelp(const std::vector<std::string>& args); |
| |
| extern const char kMeta[]; |
| extern const char kMeta_HelpShort[]; |
| extern const char kMeta_Help[]; |
| int RunMeta(const std::vector<std::string>& args); |
| |
| extern const char kLs[]; |
| extern const char kLs_HelpShort[]; |
| extern const char kLs_Help[]; |
| int RunLs(const std::vector<std::string>& args); |
| |
| extern const char kOutputs[]; |
| extern const char kOutputs_HelpShort[]; |
| extern const char kOutputs_Help[]; |
| int RunOutputs(const std::vector<std::string>& args); |
| |
| extern const char kPath[]; |
| extern const char kPath_HelpShort[]; |
| extern const char kPath_Help[]; |
| int RunPath(const std::vector<std::string>& args); |
| |
| extern const char kRefs[]; |
| extern const char kRefs_HelpShort[]; |
| extern const char kRefs_Help[]; |
| int RunRefs(const std::vector<std::string>& args); |
| |
| extern const char kCleanStale[]; |
| extern const char kCleanStale_HelpShort[]; |
| extern const char kCleanStale_Help[]; |
| int RunCleanStale(const std::vector<std::string>& args); |
| |
| // ----------------------------------------------------------------------------- |
| |
| struct CommandInfo { |
| CommandInfo(); |
| CommandInfo(const char* in_help_short, |
| const char* in_help, |
| CommandRunner in_runner); |
| |
| const char* help_short; |
| const char* help; |
| CommandRunner runner; |
| }; |
| |
| using CommandInfoMap = std::map<std::string_view, CommandInfo>; |
| |
| const CommandInfoMap& GetCommands(); |
| |
| // Command switches as flags and enums ----------------------------------------- |
| |
| // A class that models a set of command-line flags and values that |
| // can affect the output of various GN commands. For example --tree |
| // can be used with `gn desc <out_dir> <label> deps --tree`. |
| // |
| // Each flag or value is checked by an accessor method which returns |
| // a boolean or an enum. |
| // |
| // Use CommandSwitches::Get() to get a reference to the current |
| // global set of switches for the process. |
| // |
| // Use CommandSwitches::Set() to update its value. This may be |
| // useful when implementing a REPL in GN, where each evaluation |
| // might need a different set of command switches. |
| class CommandSwitches { |
| public: |
| // Default constructor. |
| CommandSwitches() = default; |
| |
| // For --quiet, used by `refs`. |
| bool has_quiet() const { return has_quiet_; } |
| |
| // For --force, used by `check`. |
| bool has_force() const { return has_force_; } |
| |
| // For --all, used by `desc` and `refs`. |
| bool has_all() const { return has_all_; } |
| |
| // For --blame used by `desc`. |
| bool has_blame() const { return has_blame_; } |
| |
| // For --tree used by `desc` and `refs`. |
| bool has_tree() const { return has_tree_; } |
| |
| // For --format=json used by `desc`. |
| bool has_format_json() const { return has_format_json_; } |
| |
| // For --default-toolchain used by `desc`, `refs`. |
| bool has_default_toolchain() const { return has_default_toolchain_; } |
| |
| // For --check-generated |
| bool has_check_generated() const { return has_check_generated_; } |
| |
| // For --check-system |
| bool has_check_system() const { return has_check_system_; } |
| |
| // For --public |
| bool has_public() const { return has_public_; } |
| |
| // For --with-data |
| bool has_with_data() const { return has_with_data_; } |
| |
| // For --as=(buildtype|label|output). |
| enum TargetPrintMode { |
| TARGET_PRINT_BUILDFILE, |
| TARGET_PRINT_LABEL, |
| TARGET_PRINT_OUTPUT, |
| }; |
| TargetPrintMode target_print_mode() const { return target_print_mode_; } |
| |
| // For --type=TARGET_TYPE |
| Target::OutputType target_type() const { return target_type_; } |
| |
| enum TestonlyMode { |
| TESTONLY_NONE, // no --testonly used. |
| TESTONLY_FALSE, // --testonly=false |
| TESTONLY_TRUE, // --testonly=true |
| }; |
| TestonlyMode testonly_mode() const { return testonly_mode_; } |
| |
| // For --rebase, --walk and --data in `gn meta` |
| std::string meta_rebase_dir() const { return meta_rebase_dir_; } |
| std::string meta_data_keys() const { return meta_data_keys_; } |
| std::string meta_walk_keys() const { return meta_walk_keys_; } |
| |
| // Initialize the global set from a given command line. |
| // Must be called early from main(). On success return true, |
| // on failure return false after printing an error message. |
| static bool Init(const base::CommandLine& cmdline); |
| |
| // Retrieve a reference to the current global set of command switches. |
| static const CommandSwitches& Get(); |
| |
| // Change the current global set of command switches, and return |
| // the previous value. |
| static CommandSwitches Set(CommandSwitches new_switches); |
| |
| private: |
| bool is_initialized() const { return initialized_; } |
| |
| bool InitFrom(const base::CommandLine&); |
| |
| static CommandSwitches s_global_switches_; |
| |
| bool initialized_ = false; |
| bool has_quiet_ = false; |
| bool has_force_ = false; |
| bool has_all_ = false; |
| bool has_blame_ = false; |
| bool has_tree_ = false; |
| bool has_format_json_ = false; |
| bool has_default_toolchain_ = false; |
| bool has_check_generated_ = false; |
| bool has_check_system_ = false; |
| bool has_public_ = false; |
| bool has_with_data_ = false; |
| |
| TargetPrintMode target_print_mode_ = TARGET_PRINT_LABEL; |
| Target::OutputType target_type_ = Target::UNKNOWN; |
| TestonlyMode testonly_mode_ = TESTONLY_NONE; |
| |
| std::string meta_rebase_dir_; |
| std::string meta_data_keys_; |
| std::string meta_walk_keys_; |
| }; |
| |
| // Helper functions for some commands ------------------------------------------ |
| |
| // Modifies the existing build.ninja to only contain the commands necessary to |
| // run GN and regenerate and build.ninja.d such that build.ninja will be |
| // treated as dirty and regenerated. |
| // |
| // This is used by commands like gen and clean before they modify or delete |
| // other ninja files, and ensures that ninja can still call GN if the commands |
| // are interrupted before completion. |
| // |
| // On error, returns false. |
| bool PrepareForRegeneration(const BuildSettings* settings); |
| |
| // Given a setup that has already been run and some command-line input, |
| // resolves that input as a target label and returns the corresponding target. |
| // On failure, returns null and prints the error to the standard output. |
| const Target* ResolveTargetFromCommandLineString( |
| Setup* setup, |
| const std::string& label_string); |
| |
| // Resolves a vector of command line inputs and figures out the full set of |
| // things they resolve to. |
| // |
| // On success, returns true and populates the vectors. On failure, prints the |
| // error and returns false. |
| // |
| // Patterns with wildcards will only match targets. The file_matches aren't |
| // validated that they are real files or referenced by any targets. They're just |
| // the set of things that didn't match anything else. |
| bool ResolveFromCommandLineInput( |
| Setup* setup, |
| const std::vector<std::string>& input, |
| bool default_toolchain_only, |
| UniqueVector<const Target*>* target_matches, |
| UniqueVector<const Config*>* config_matches, |
| UniqueVector<const Toolchain*>* toolchain_matches, |
| UniqueVector<SourceFile>* file_matches); |
| |
| // Runs the header checker. All targets in the build should be given in |
| // all_targets, and the specific targets to check should be in to_check. |
| // |
| // force_check, if true, will override targets opting out of header checking |
| // with "check_includes = false" and will check them anyway. |
| // |
| // Generated files are normally not checked since they do not exist |
| // unless a build has been run, but passing true for |check_generated| |
| // will attempt to check them anyway, assuming they exist. |
| // |
| // On success, returns true. If the check fails, the error(s) will be printed |
| // to stdout and false will be returned. |
| bool CheckPublicHeaders(const BuildSettings* build_settings, |
| const std::vector<const Target*>& all_targets, |
| const std::vector<const Target*>& to_check, |
| bool force_check, |
| bool check_generated, |
| bool check_system); |
| |
| // Filters the given list of targets by the given pattern list. |
| void FilterTargetsByPatterns(const std::vector<const Target*>& input, |
| const std::vector<LabelPattern>& filter, |
| std::vector<const Target*>* output); |
| void FilterTargetsByPatterns(const std::vector<const Target*>& input, |
| const std::vector<LabelPattern>& filter, |
| UniqueVector<const Target*>* output); |
| |
| // Removes targets from the input that match the given pattern list. |
| void FilterOutTargetsByPatterns(const std::vector<const Target*>& input, |
| const std::vector<LabelPattern>& filter, |
| std::vector<const Target*>* output); |
| |
| // Builds a list of pattern from a semicolon-separated list of labels. |
| bool FilterPatternsFromString(const BuildSettings* build_settings, |
| const std::string& label_list_string, |
| std::vector<LabelPattern>* filters, |
| Err* err); |
| |
| // These are the documentation strings for the command-line flags used by |
| // FilterAndPrintTargets. Commands that call that function should incorporate |
| // these into their help. |
| #define TARGET_PRINTING_MODE_COMMAND_LINE_HELP \ |
| " --as=(buildfile|label|output)\n" \ |
| " How to print targets.\n" \ |
| "\n" \ |
| " buildfile\n" \ |
| " Prints the build files where the given target was declared as\n" \ |
| " file names.\n" \ |
| " label (default)\n" \ |
| " Prints the label of the target.\n" \ |
| " output\n" \ |
| " Prints the first output file for the target relative to the\n" \ |
| " root build directory.\n" |
| #define TARGET_TYPE_FILTER_COMMAND_LINE_HELP \ |
| " --type=(action|copy|executable|group|loadable_module|shared_library|\n" \ |
| " source_set|static_library)\n" \ |
| " Restrict outputs to targets matching the given type. If\n" \ |
| " unspecified, no filtering will be performed.\n" |
| #define TARGET_TESTONLY_FILTER_COMMAND_LINE_HELP \ |
| " --testonly=(true|false)\n" \ |
| " Restrict outputs to targets with the testonly flag set\n" \ |
| " accordingly. When unspecified, the target's testonly flags are\n" \ |
| " ignored.\n" |
| |
| // Applies any testonly and type filters specified on the command line, |
| // and prints the targets as specified by the --as command line flag. |
| // |
| // If indent is true, the results will be indented two spaces. |
| // |
| // The vector will be modified so that only the printed targets will remain. |
| void FilterAndPrintTargets(bool indent, std::vector<const Target*>* targets); |
| void FilterAndPrintTargets(std::vector<const Target*>* targets, |
| base::ListValue* out); |
| |
| void FilterAndPrintTargetSet(bool indent, const TargetSet& targets); |
| void FilterAndPrintTargetSet(const TargetSet& targets, base::ListValue* out); |
| |
| // Computes which targets reference the given file and also stores how the |
| // target references the file. |
| enum class HowTargetContainsFile { |
| kSources, |
| kPublic, |
| kInputs, |
| kData, |
| kScript, |
| kOutput, |
| }; |
| using TargetContainingFile = std::pair<const Target*, HowTargetContainsFile>; |
| void GetTargetsContainingFile(Setup* setup, |
| const std::vector<const Target*>& all_targets, |
| const SourceFile& file, |
| bool default_toolchain_only, |
| std::vector<TargetContainingFile>* matches); |
| |
| // Extra help from command_check.cc |
| extern const char kNoGnCheck_Help[]; |
| |
| } // namespace commands |
| |
| #endif // TOOLS_GN_COMMANDS_H_ |