#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 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();
class CommandSwitches {
public:
CommandSwitches() = default;
bool has_quiet() const { return has_quiet_; }
bool has_force() const { return has_force_; }
bool has_all() const { return has_all_; }
bool has_blame() const { return has_blame_; }
bool has_tree() const { return has_tree_; }
bool has_format_json() const { return has_format_json_; }
bool has_default_toolchain() const { return has_default_toolchain_; }
bool has_check_generated() const { return has_check_generated_; }
bool has_check_system() const { return has_check_system_; }
bool has_public() const { return has_public_; }
bool has_with_data() const { return has_with_data_; }
enum TargetPrintMode {
TARGET_PRINT_BUILDFILE,
TARGET_PRINT_LABEL,
TARGET_PRINT_OUTPUT,
};
TargetPrintMode target_print_mode() const { return target_print_mode_; }
Target::OutputType target_type() const { return target_type_; }
enum TestonlyMode {
TESTONLY_NONE,
TESTONLY_FALSE,
TESTONLY_TRUE,
};
TestonlyMode testonly_mode() const { return testonly_mode_; }
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_; }
static bool Init(const base::CommandLine& cmdline);
static const CommandSwitches& Get();
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_;
};
bool PrepareForRegeneration(const BuildSettings* settings);
const Target* ResolveTargetFromCommandLineString(
Setup* setup,
const std::string& label_string);
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);
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);
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);
void FilterOutTargetsByPatterns(const std::vector<const Target*>& input,
const std::vector<LabelPattern>& filter,
std::vector<const Target*>* output);
bool FilterPatternsFromString(const BuildSettings* build_settings,
const std::string& label_list_string,
std::vector<LabelPattern>* filters,
Err* err);
#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"
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);
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);
extern const char kNoGnCheck_Help[];
}
#endif