#pragma once #include #include #include #include #include #include #include #include namespace vcpkg { struct ParsedArguments { std::unordered_set switches; std::unordered_map settings; std::unordered_map> multisettings; }; struct VcpkgPaths; struct CommandSwitch { constexpr CommandSwitch(const StringLiteral& name, const StringLiteral& short_help_text) : name(name), short_help_text(short_help_text) { } StringLiteral name; StringLiteral short_help_text; }; struct CommandSetting { constexpr CommandSetting(const StringLiteral& name, const StringLiteral& short_help_text) : name(name), short_help_text(short_help_text) { } StringLiteral name; StringLiteral short_help_text; }; struct CommandMultiSetting { constexpr CommandMultiSetting(const StringLiteral& name, const StringLiteral& short_help_text) : name(name), short_help_text(short_help_text) { } StringLiteral name; StringLiteral short_help_text; }; struct CommandOptionsStructure { Span switches; Span settings; Span multisettings; }; struct CommandStructure { std::string example_text; size_t minimum_arity; size_t maximum_arity; CommandOptionsStructure options; std::vector (*valid_arguments)(const VcpkgPaths& paths); }; void print_usage(); void print_usage(const CommandStructure& command_structure); #if defined(_WIN32) using CommandLineCharType = wchar_t; #else using CommandLineCharType = char; #endif std::string create_example_string(const std::string& command_and_arguments); std::string format_environment_variable(StringLiteral lit); struct HelpTableFormatter { void format(StringView col1, StringView col2); void example(StringView example_text); void header(StringView name); void blank(); void text(StringView text, int indent = 0); std::string m_str; }; struct VcpkgCmdArguments { static VcpkgCmdArguments create_from_command_line(const Files::Filesystem& fs, const int argc, const CommandLineCharType* const* const argv); static VcpkgCmdArguments create_from_arg_sequence(const std::string* arg_begin, const std::string* arg_end); static void append_common_options(HelpTableFormatter& target); constexpr static StringLiteral VCPKG_ROOT_DIR_ENV = "VCPKG_ROOT"; constexpr static StringLiteral VCPKG_ROOT_DIR_ARG = "vcpkg-root"; std::unique_ptr vcpkg_root_dir; constexpr static StringLiteral MANIFEST_ROOT_DIR_ARG = "x-manifest-root"; std::unique_ptr manifest_root_dir; constexpr static StringLiteral BUILDTREES_ROOT_DIR_ARG = "x-buildtrees-root"; std::unique_ptr buildtrees_root_dir; constexpr static StringLiteral DOWNLOADS_ROOT_DIR_ENV = "VCPKG_DOWNLOADS"; constexpr static StringLiteral DOWNLOADS_ROOT_DIR_ARG = "downloads-root"; std::unique_ptr downloads_root_dir; constexpr static StringLiteral INSTALL_ROOT_DIR_ARG = "x-install-root"; std::unique_ptr install_root_dir; constexpr static StringLiteral PACKAGES_ROOT_DIR_ARG = "x-packages-root"; std::unique_ptr packages_root_dir; constexpr static StringLiteral SCRIPTS_ROOT_DIR_ARG = "x-scripts-root"; std::unique_ptr scripts_root_dir; constexpr static StringLiteral DEFAULT_VISUAL_STUDIO_PATH_ENV = "VCPKG_VISUAL_STUDIO_PATH"; std::unique_ptr default_visual_studio_path; constexpr static StringLiteral TRIPLET_ENV = "VCPKG_DEFAULT_TRIPLET"; constexpr static StringLiteral TRIPLET_ARG = "triplet"; std::unique_ptr triplet; constexpr static StringLiteral OVERLAY_PORTS_ARG = "overlay-ports"; std::vector overlay_ports; constexpr static StringLiteral OVERLAY_TRIPLETS_ARG = "overlay-triplets"; std::vector overlay_triplets; constexpr static StringLiteral BINARY_SOURCES_ARG = "x-binarysource"; std::vector binary_sources; constexpr static StringLiteral DEBUG_SWITCH = "debug"; Optional debug = nullopt; constexpr static StringLiteral SEND_METRICS_SWITCH = "sendmetrics"; Optional send_metrics = nullopt; // fully disable metrics -- both printing and sending constexpr static StringLiteral DISABLE_METRICS_ENV = "VCPKG_DISABLE_METRICS"; constexpr static StringLiteral DISABLE_METRICS_SWITCH = "disable-metrics"; Optional disable_metrics = nullopt; constexpr static StringLiteral PRINT_METRICS_SWITCH = "printmetrics"; Optional print_metrics = nullopt; // feature flags constexpr static StringLiteral FEATURE_FLAGS_ENV = "VCPKG_FEATURE_FLAGS"; constexpr static StringLiteral FEATURE_FLAGS_ARG = "feature-flags"; constexpr static StringLiteral FEATURE_PACKAGES_SWITCH = "featurepackages"; Optional feature_packages = nullopt; constexpr static StringLiteral BINARY_CACHING_FEATURE = "binarycaching"; constexpr static StringLiteral BINARY_CACHING_SWITCH = "binarycaching"; Optional binary_caching = nullopt; constexpr static StringLiteral COMPILER_TRACKING_FEATURE = "compilertracking"; Optional compiler_tracking = nullopt; constexpr static StringLiteral MANIFEST_MODE_FEATURE = "manifests"; Optional manifest_mode = nullopt; bool binary_caching_enabled() const { return binary_caching.value_or(false); } bool compiler_tracking_enabled() const { return compiler_tracking.value_or(false); } std::string command; std::vector command_arguments; ParsedArguments parse_arguments(const CommandStructure& command_structure) const; void imbue_from_environment(); void check_feature_flag_consistency() const; void track_feature_flag_metrics() const; private: std::unordered_map>> optional_command_arguments; }; }