diff --git a/toolsrc/include/triplet.h b/toolsrc/include/triplet.h index f9d1e9483ae..0c42f2ec795 100644 --- a/toolsrc/include/triplet.h +++ b/toolsrc/include/triplet.h @@ -4,6 +4,8 @@ namespace vcpkg { + struct vcpkg_paths; + struct triplet { static const triplet X86_WINDOWS; @@ -17,6 +19,8 @@ namespace vcpkg std::string architecture() const; std::string system() const; + + bool validate(const vcpkg_paths& paths); }; bool operator==(const triplet& left, const triplet& right); diff --git a/toolsrc/include/vcpkg_cmd_arguments.h b/toolsrc/include/vcpkg_cmd_arguments.h index 7df3d64b135..7042905894f 100644 --- a/toolsrc/include/vcpkg_cmd_arguments.h +++ b/toolsrc/include/vcpkg_cmd_arguments.h @@ -27,7 +27,7 @@ namespace vcpkg std::unordered_set check_and_get_optional_command_arguments(const std::vector& valid_options) const; void check_max_args(size_t arg_count, const char* example_text = nullptr) const; - std::vector parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text = nullptr) const; + std::vector parse_all_arguments_as_package_specs(const vcpkg_paths& paths, const triplet& default_target_triplet, const char* example_text = nullptr) const; private: std::unordered_set optional_command_arguments; diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index 73d163af8ae..8ae67b79920 100644 --- a/toolsrc/src/commands_create.cpp +++ b/toolsrc/src/commands_create.cpp @@ -7,7 +7,7 @@ namespace vcpkg void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { args.check_max_args(3); - package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); + package_spec spec = args.parse_all_arguments_as_package_specs(paths, default_target_triplet).at(0); if (args.command_arguments.size() < 2) { System::println(System::color::error, "Error: create requires the archive's URL as the second argument."); diff --git a/toolsrc/src/commands_edit.cpp b/toolsrc/src/commands_edit.cpp index 71ae8b2c857..2272c1277b4 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -7,7 +7,7 @@ namespace vcpkg { static auto example = "edit zlib"; args.check_max_args(1, example); - package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet, example).at(0); + package_spec spec = args.parse_all_arguments_as_package_specs(paths, default_target_triplet, example).at(0); // Find editor std::wstring env_EDITOR = System::wdupenv_str(L"EDITOR"); diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 0902ba525cf..35e1ba28cc0 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -60,7 +60,7 @@ namespace vcpkg { StatusParagraphs status_db = database_load_check(paths); - std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); + std::vector specs = args.parse_all_arguments_as_package_specs(paths, default_target_triplet); std::vector install_plan = Dependencies::create_dependency_ordered_install_plan(paths, specs, status_db); Checks::check_exit(!install_plan.empty(), "Install plan cannot be empty"); std::string specs_string = to_string(install_plan[0]); @@ -119,7 +119,7 @@ namespace vcpkg StatusParagraphs status_db = database_load_check(paths); - const package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); + const package_spec spec = args.parse_all_arguments_as_package_specs(paths, default_target_triplet).at(0); std::unordered_set unmet_dependencies = Dependencies::find_unmet_dependencies(paths, spec, status_db); if (!unmet_dependencies.empty()) { diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index f237d272666..f4fad669089 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -32,7 +32,7 @@ namespace vcpkg //"\n" "Options:\n" " --triplet Specify the target architecture triplet.\n" - " (default: x86-windows, see 'vcpkg help triplet')\n" + " (default: %%VCPKG_DEFAULT_TRIPLET%%, see 'vcpkg help triplet')\n" "\n" " --vcpkg-root Specify the vcpkg root directory\n" " (default: %%VCPKG_ROOT%%)\n" diff --git a/toolsrc/src/commands_remove.cpp b/toolsrc/src/commands_remove.cpp index f5315ccb19d..0b00e10f685 100644 --- a/toolsrc/src/commands_remove.cpp +++ b/toolsrc/src/commands_remove.cpp @@ -25,7 +25,7 @@ namespace vcpkg const std::unordered_set options = args.check_and_get_optional_command_arguments({OPTION_PURGE}); auto status_db = database_load_check(paths); - std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); + std::vector specs = args.parse_all_arguments_as_package_specs(paths, default_target_triplet); bool alsoRemoveFolderFromPackages = options.find(OPTION_PURGE) != options.end(); for (const package_spec& spec : specs) diff --git a/toolsrc/src/main.cpp b/toolsrc/src/main.cpp index e9ce4702cf2..a2f6fa10fad 100644 --- a/toolsrc/src/main.cpp +++ b/toolsrc/src/main.cpp @@ -69,32 +69,32 @@ static void inner(const vcpkg_cmd_arguments& args) return command_function(args, paths); } - triplet default_target_triplet = triplet::X86_WINDOWS; - - if (args.target_triplet != nullptr) + triplet default_target_triplet; + if(args.target_triplet != nullptr) { - const std::string& target_triplet = *args.target_triplet; - - auto it = fs::directory_iterator(paths.triplets); - for (; it != fs::directory_iterator(); ++it) + default_target_triplet = {*args.target_triplet}; + } + else + { + const auto vcpkg_default_triplet_env = System::wdupenv_str(L"VCPKG_DEFAULT_TRIPLET"); + if(!vcpkg_default_triplet_env.empty()) { - std::string triplet_file_name = it->path().stem().generic_u8string(); - if (target_triplet == triplet_file_name) // TODO: fuzzy compare - { - default_target_triplet = {triplet_file_name}; - break; - } + default_target_triplet = {Strings::utf16_to_utf8(vcpkg_default_triplet_env)}; } - - if (it == fs::directory_iterator()) + else { - System::println(System::color::error, "Error: invalid triplet: %s", target_triplet); - TrackProperty("error", "invalid triplet: " + target_triplet); - help_topic_valid_triplet(paths); - exit(EXIT_FAILURE); + default_target_triplet = triplet::X86_WINDOWS; } } + if(!default_target_triplet.validate(paths)) + { + System::println(System::color::error, "Error: invalid triplet: %s", default_target_triplet.value); + TrackProperty("error", "invalid triplet: " + default_target_triplet.value); + help_topic_valid_triplet(paths); + exit(EXIT_FAILURE); + } + if (auto command_function = find_command(args.command, get_available_commands_type_a())) { return command_function(args, paths, default_target_triplet); diff --git a/toolsrc/src/triplet.cpp b/toolsrc/src/triplet.cpp index 9ad3d8847d6..14f19d5cd9c 100644 --- a/toolsrc/src/triplet.cpp +++ b/toolsrc/src/triplet.cpp @@ -1,4 +1,5 @@ #include "triplet.h" +#include "vcpkg.h" #include "vcpkg_System.h" #include "vcpkg_Checks.h" @@ -56,4 +57,19 @@ namespace vcpkg Checks::exit_with_message("Unknown system: %s", value); } + + bool triplet::validate(const vcpkg_paths & paths) + { + auto it = fs::directory_iterator(paths.triplets); + for(; it != fs::directory_iterator(); ++it) + { + std::string triplet_file_name = it->path().stem().generic_u8string(); + if(value == triplet_file_name) // TODO: fuzzy compare + { + //value = triplet_file_name; // NOTE: uncomment when implementing fuzzy compare + return true; + } + } + return false; + } } diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index 3605503b03d..9181342d097 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -179,7 +179,7 @@ namespace vcpkg } } - std::vector vcpkg_cmd_arguments::parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text) const + std::vector vcpkg_cmd_arguments::parse_all_arguments_as_package_specs(const vcpkg_paths& paths, const triplet& default_target_triplet, const char* example_text) const { size_t arg_count = command_arguments.size(); if (arg_count < 1)