diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/my-triplets/fancy-config-embedded-triplet.cmake b/azure-pipelines/e2e_projects/overlays-project-config-embedded/my-triplets/fancy-config-embedded-triplet.cmake new file mode 100644 index 0000000000..91a235b525 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-config-embedded/my-triplets/fancy-config-embedded-triplet.cmake @@ -0,0 +1,18 @@ +if(CMAKE_HOST_WIN32) +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE static) +set(VCPKG_LIBRARY_LINKAGE dynamic) +elseif(CMAKE_HOST_APPLE) +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Darwin) +set(VCPKG_OSX_ARCHITECTURES x86_64) +else() +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Linux) +endif() diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/my-triplets/x64-windows-static.cmake b/azure-pipelines/e2e_projects/overlays-project-config-embedded/my-triplets/x64-windows-static.cmake deleted file mode 100644 index b227169ed5..0000000000 --- a/azure-pipelines/e2e_projects/overlays-project-config-embedded/my-triplets/x64-windows-static.cmake +++ /dev/null @@ -1,4 +0,0 @@ -set(VCPKG_TARGET_ARCHITECTURE x64) -set(VCPKG_CRT_LINKAGE static) -set(VCPKG_LIBRARY_LINKAGE dynamic) - diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/my-triplets/fancy-triplet.cmake b/azure-pipelines/e2e_projects/overlays-project-with-config/my-triplets/fancy-triplet.cmake new file mode 100644 index 0000000000..91a235b525 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-with-config/my-triplets/fancy-triplet.cmake @@ -0,0 +1,18 @@ +if(CMAKE_HOST_WIN32) +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE static) +set(VCPKG_LIBRARY_LINKAGE dynamic) +elseif(CMAKE_HOST_APPLE) +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Darwin) +set(VCPKG_OSX_ARCHITECTURES x86_64) +else() +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Linux) +endif() diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/my-triplets/x64-windows-static.cmake b/azure-pipelines/e2e_projects/overlays-project-with-config/my-triplets/x64-windows-static.cmake deleted file mode 100644 index b227169ed5..0000000000 --- a/azure-pipelines/e2e_projects/overlays-project-with-config/my-triplets/x64-windows-static.cmake +++ /dev/null @@ -1,4 +0,0 @@ -set(VCPKG_TARGET_ARCHITECTURE x64) -set(VCPKG_CRT_LINKAGE static) -set(VCPKG_LIBRARY_LINKAGE dynamic) - diff --git a/azure-pipelines/end-to-end-tests-dir/overlays.ps1 b/azure-pipelines/end-to-end-tests-dir/overlays.ps1 index 9d5bf445c1..ff7b3b8d78 100644 --- a/azure-pipelines/end-to-end-tests-dir/overlays.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/overlays.ps1 @@ -13,7 +13,8 @@ $env:VCPKG_OVERLAY_PORTS = "$manifestRoot/env-overlays" Run-Vcpkg install --x-manifest-root=$manifestRoot ` --overlay-ports=$manifestRoot/cli-overlays ` --overlay-triplets=$manifestRoot/my-triplets ` - --x-install-root=$installRoot + --x-install-root=$installRoot ` + --triplet fancy-triplet Throw-IfFailed # Tests overlays configured in env and cli on a project with configuration embedded on the manifest file @@ -22,7 +23,8 @@ $env:VCPKG_OVERLAY_PORTS = "$manifestRoot/env-overlays" Run-Vcpkg install --x-manifest-root=$manifestRoot ` --overlay-ports=$manifestRoot/cli-overlays ` --overlay-triplets=$manifestRoot/my-triplets ` - --x-install-root=$installRoot + --x-install-root=$installRoot ` + --triplet fancy-config-embedded-triplet Throw-IfFailed # Config with bad paths @@ -47,3 +49,36 @@ $notEqual = @(Compare-Object $overlaysBefore $overlaysAfter -SyncWindow 0).Lengt if ($notEqual) { Throw "Overlay triplets paths changed after x-update-baseline" } + +# Test that removals can happen without the overlay triplets +Remove-Item env:VCPKG_OVERLAY_PORTS +Refresh-TestRoot +Run-Vcpkg install another-vcpkg-empty-port:fancy-triplet ` + --overlay-ports=$PSScriptRoot/../e2e_projects/overlays-project-with-config/cli-overlays ` + --overlay-triplets=$PSScriptRoot/../e2e_projects/overlays-project-with-config/my-triplets +Throw-IfFailed + +Run-Vcpkg remove another-vcpkg-empty-port:fancy-triplet ` + --overlay-ports=$PSScriptRoot/../e2e_projects/overlays-project-with-config/cli-overlays +Throw-IfFailed + +# ... or ports +Refresh-TestRoot +Run-Vcpkg install another-vcpkg-empty-port:fancy-triplet ` + --overlay-ports=$PSScriptRoot/../e2e_projects/overlays-project-with-config/cli-overlays ` + --overlay-triplets=$PSScriptRoot/../e2e_projects/overlays-project-with-config/my-triplets +Throw-IfFailed + +Run-Vcpkg remove another-vcpkg-empty-port:fancy-triplet ` + --overlay-triplets=$PSScriptRoot/../e2e_projects/overlays-project-with-config/my-triplets +Throw-IfFailed + +# ... or either +Refresh-TestRoot +Run-Vcpkg install another-vcpkg-empty-port:fancy-triplet ` + --overlay-ports=$PSScriptRoot/../e2e_projects/overlays-project-with-config/cli-overlays ` + --overlay-triplets=$PSScriptRoot/../e2e_projects/overlays-project-with-config/my-triplets +Throw-IfFailed + +Run-Vcpkg remove another-vcpkg-empty-port:fancy-triplet +Throw-IfFailed diff --git a/azure-pipelines/end-to-end-tests-dir/vcpkg-root.ps1 b/azure-pipelines/end-to-end-tests-dir/vcpkg-root.ps1 index 03cd889ac4..192a666825 100644 --- a/azure-pipelines/end-to-end-tests-dir/vcpkg-root.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/vcpkg-root.ps1 @@ -23,13 +23,13 @@ try { } $env:VCPKG_ROOT = Join-Path $actualVcpkgRoot 'ports' # any existing directory that isn't the detected root - $differentPathOutput = Run-VcpkgAndCaptureOutput -TestArgs ($commonArgs + @('--debug')) + $differentPathOutput = Run-VcpkgAndCaptureOutput $commonArgs Throw-IfFailed if (-not ($differentPathOutput.Contains($targetMessage))) { throw 'Expected a warning about VCPKG_ROOT differing when the detected path differs from the configured path.' } - $setWithArgOutput = Run-VcpkgAndCaptureOutput -TestArgs ($commonArgs + @('--vcpkg-root', $actualVcpkgRoot, '--debug')) + $setWithArgOutput = Run-VcpkgAndCaptureOutput -TestArgs ($commonArgs + @('--vcpkg-root', $actualVcpkgRoot)) Throw-IfFailed if ($setWithArgOutput.Contains($targetMessage)) { throw 'Expected no warning about VCPKG_ROOT when the path is configured with a command line argument.' diff --git a/azure-pipelines/end-to-end-tests-dir/versions.ps1 b/azure-pipelines/end-to-end-tests-dir/versions.ps1 index 8e20d2ff33..6854f96717 100644 --- a/azure-pipelines/end-to-end-tests-dir/versions.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/versions.ps1 @@ -6,7 +6,7 @@ $versionFilesPath = "$PSScriptRoot/../e2e_ports/version-files" $CurrentTest = "transitive constraints without baseline" Run-Vcpkg install @commonArgs --dry-run ` "--x-builtin-ports-root=$versionFilesPath/transitive-constraints/ports" ` - "--x-manifest-root=$versionFilesPath/transitive-constraints" --debug + "--x-manifest-root=$versionFilesPath/transitive-constraints" Throw-IfFailed Refresh-TestRoot @@ -25,7 +25,7 @@ $portsRedirectArgsIncomplete = @( ) $CurrentTest = "x-verify-ci-versions (All files OK)" Write-Host $CurrentTest -Run-Vcpkg @portsRedirectArgsOK x-ci-verify-versions --verbose --debug +Run-Vcpkg @portsRedirectArgsOK x-ci-verify-versions --verbose Throw-IfFailed $CurrentTest = "x-verify-ci-versions (Incomplete)" diff --git a/include/vcpkg/base/strings.h b/include/vcpkg/base/strings.h index 495df4985e..5e1329945b 100644 --- a/include/vcpkg/base/strings.h +++ b/include/vcpkg/base/strings.h @@ -92,8 +92,8 @@ namespace vcpkg::Strings void inplace_ascii_to_lowercase(char* first, char* last); void inplace_ascii_to_lowercase(std::string& s); - [[nodiscard]] std::string ascii_to_lowercase(std::string s); - [[nodiscard]] std::string ascii_to_uppercase(std::string s); + [[nodiscard]] std::string ascii_to_lowercase(StringView s); + [[nodiscard]] std::string ascii_to_uppercase(StringView s); bool case_insensitive_ascii_starts_with(StringView s, StringView pattern); bool case_insensitive_ascii_ends_with(StringView s, StringView pattern); diff --git a/include/vcpkg/commands.help.h b/include/vcpkg/commands.help.h index 750a9f6d29..e3a79065bf 100644 --- a/include/vcpkg/commands.help.h +++ b/include/vcpkg/commands.help.h @@ -2,6 +2,7 @@ #include +#include #include #include @@ -11,5 +12,5 @@ namespace vcpkg::Help void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - void help_topic_valid_triplet(const VcpkgPaths& paths); + void help_topic_valid_triplet(const TripletDatabase& database); } diff --git a/include/vcpkg/fwd/triplet.h b/include/vcpkg/fwd/triplet.h index ebc99ff1b0..d09b754a10 100644 --- a/include/vcpkg/fwd/triplet.h +++ b/include/vcpkg/fwd/triplet.h @@ -4,4 +4,6 @@ namespace vcpkg { struct TripletInstance; struct Triplet; + struct TripletFile; + struct TripletDatabase; } diff --git a/include/vcpkg/fwd/vcpkgpaths.h b/include/vcpkg/fwd/vcpkgpaths.h index 4a2e712cbe..84b2223031 100644 --- a/include/vcpkg/fwd/vcpkgpaths.h +++ b/include/vcpkg/fwd/vcpkgpaths.h @@ -5,7 +5,6 @@ namespace vcpkg struct ToolsetArchOption; struct Toolset; struct ManifestAndPath; - struct TripletFile; struct VcpkgPaths; struct VcpkgPathsImpl; diff --git a/include/vcpkg/input.h b/include/vcpkg/input.h index 4902eb9e4b..310acd29eb 100644 --- a/include/vcpkg/input.h +++ b/include/vcpkg/input.h @@ -6,17 +6,33 @@ namespace vcpkg { - PackageSpec check_and_get_package_spec(std::string&& spec_string, + // Parse a package spec without features; typically used by commands which + // refer to already installed packages which make features irrelevant. + // + // Does not assert that the package spec has a valid triplet. This allows + // such commands to refer to entities that were installed with an overlay + // triplet or similar which is no longer active. + PackageSpec parse_package_spec(StringView spec_string, + Triplet default_triplet, + bool& default_triplet_used, + const LocalizedString& example_text); + + // Same as the above but checks the validity of the triplet. + PackageSpec check_and_get_package_spec(StringView spec_string, Triplet default_triplet, bool& default_triplet_used, const LocalizedString& example_text, - const VcpkgPaths& paths); + const TripletDatabase& database); - FullPackageSpec check_and_get_full_package_spec(std::string spec_string, + // Parse a package spec with features, typically used by commands which will + // install or modify a port. + // + // Asserts that the package spec has a valid triplet. + FullPackageSpec check_and_get_full_package_spec(StringView spec_string, Triplet default_triplet, bool& default_triplet_used, const LocalizedString& example_text, - const VcpkgPaths& paths); + const TripletDatabase& database); - void check_triplet(Triplet t, const VcpkgPaths& paths); + void check_triplet(StringView name, const TripletDatabase& database); } diff --git a/include/vcpkg/triplet.h b/include/vcpkg/triplet.h index 14a2ff581f..3c2328f0ec 100644 --- a/include/vcpkg/triplet.h +++ b/include/vcpkg/triplet.h @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -41,9 +42,6 @@ namespace vcpkg inline bool operator!=(Triplet left, Triplet right) { return !(left == right); } - Triplet default_triplet(const VcpkgCmdArguments& args); - Triplet default_host_triplet(const VcpkgCmdArguments& args); - void print_default_triplet_warning(const VcpkgCmdArguments& arg); } VCPKG_FORMAT_AS(vcpkg::Triplet, vcpkg::StringView); @@ -56,3 +54,31 @@ namespace std size_t operator()(vcpkg::Triplet t) const { return t.hash_code(); } }; } + +namespace vcpkg +{ + Triplet default_triplet(const VcpkgCmdArguments& args, const TripletDatabase& database); + Triplet default_host_triplet(const VcpkgCmdArguments& args, const TripletDatabase& database); + void print_default_triplet_warning(const VcpkgCmdArguments& arg, const TripletDatabase& database); + + struct TripletFile + { + std::string name; + Path location; + + TripletFile(StringView name, StringView location); + + Path get_full_path() const; + }; + + struct TripletDatabase + { + Path default_triplet_directory; + Path community_triplet_directory; + std::vector available_triplets; + + Path get_triplet_file_path(Triplet triplet) const; + bool is_valid_triplet_name(StringView name) const; + bool is_valid_triplet_canonical_name(StringView name) const; + }; +} diff --git a/include/vcpkg/vcpkgpaths.h b/include/vcpkg/vcpkgpaths.h index 584d95234c..5f2d528b39 100644 --- a/include/vcpkg/vcpkgpaths.h +++ b/include/vcpkg/vcpkgpaths.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -45,14 +46,6 @@ namespace vcpkg std::vector supported_architectures; }; - struct TripletFile - { - std::string name; - Path location; - - TripletFile(StringView name, StringView location) : name(name.data(), name.size()), location(location) { } - }; - struct VcpkgPaths { VcpkgPaths(const Filesystem& filesystem, const VcpkgCmdArguments& args, const BundleSettings& bundle); @@ -65,12 +58,9 @@ namespace vcpkg Path build_dir(StringView package_name) const; Path build_info_file_path(const PackageSpec& spec) const; - bool is_valid_triplet(Triplet t) const; - const std::vector get_available_triplets_names() const; - const std::vector& get_available_triplets() const; + const TripletDatabase& get_triplet_db() const; const std::map& get_cmake_script_hashes() const; StringView get_ports_cmake_hash() const; - const Path& get_triplet_file_path(Triplet triplet) const; LockFile& get_installed_lockfile() const; void flush_lockfile() const; @@ -104,11 +94,14 @@ namespace vcpkg const Path buildsystems_msbuild_targets; const Path buildsystems_msbuild_props; const Path ports_cmake; + + private: const Path triplets; const Path community_triplets; + std::vector overlay_triplets; + public: std::vector overlay_ports; - std::vector overlay_triplets; std::string get_toolver_diagnostics() const; diff --git a/src/vcpkg.cpp b/src/vcpkg.cpp index c67afa67f7..e6e1f6d329 100644 --- a/src/vcpkg.cpp +++ b/src/vcpkg.cpp @@ -136,11 +136,8 @@ namespace return command_function->function(args, paths); } - Triplet default_triplet = vcpkg::default_triplet(args); - check_triplet(default_triplet, paths); - Triplet host_triplet = vcpkg::default_host_triplet(args); - check_triplet(host_triplet, paths); - + Triplet default_triplet = vcpkg::default_triplet(args, paths.get_triplet_db()); + Triplet host_triplet = vcpkg::default_host_triplet(args, paths.get_triplet_db()); if (const auto command_function = find_command(Commands::triplet_commands)) { get_global_metrics_collector().track_string(StringMetric::CommandName, command_function->name); diff --git a/src/vcpkg/base/strings.cpp b/src/vcpkg/base/strings.cpp index 5b9e3af9c2..cf7e2e2f9d 100644 --- a/src/vcpkg/base/strings.cpp +++ b/src/vcpkg/base/strings.cpp @@ -183,16 +183,18 @@ void Strings::inplace_ascii_to_lowercase(std::string& s) Strings::inplace_ascii_to_lowercase(s.data(), s.data() + s.size()); } -std::string Strings::ascii_to_lowercase(std::string s) +std::string Strings::ascii_to_lowercase(StringView s) { - Strings::inplace_ascii_to_lowercase(s); - return std::move(s); + std::string result; + std::transform(s.begin(), s.end(), std::back_inserter(result), tolower_char); + return result; } -std::string Strings::ascii_to_uppercase(std::string s) +std::string Strings::ascii_to_uppercase(StringView s) { - std::transform(s.begin(), s.end(), s.begin(), to_upper_char); - return std::move(s); + std::string result; + std::transform(s.begin(), s.end(), std::back_inserter(result), to_upper_char); + return result; } bool Strings::case_insensitive_ascii_starts_with(StringView s, StringView pattern) diff --git a/src/vcpkg/base/system.mac.cpp b/src/vcpkg/base/system.mac.cpp index ed07326522..438275ade0 100644 --- a/src/vcpkg/base/system.mac.cpp +++ b/src/vcpkg/base/system.mac.cpp @@ -109,7 +109,7 @@ namespace vcpkg // get "physical address" if (parser.require_character('"')) return false; - auto mac_address = parser.match_until(is_quote).to_string(); + out = parser.match_until(is_quote).to_string(); if (parser.require_character('"')) return false; if (parser.require_character(',')) return false; @@ -121,12 +121,13 @@ namespace vcpkg parser.skip_whitespace(); if (!parser.at_eof()) { + out.clear(); return false; } // output line was properly formatted - std::replace(mac_address.begin(), mac_address.end(), '-', ':'); - out = Strings::ascii_to_lowercase(std::move(mac_address)); + std::replace(out.begin(), out.end(), '-', ':'); + Strings::inplace_ascii_to_lowercase(out); return true; } diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index d1fa63c448..5d1c199b5e 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -83,7 +83,7 @@ namespace vcpkg::CMakeVars for (auto&& p : emitted_triplets) { - auto path_to_triplet = paths.get_triplet_file_path(p.first); + auto path_to_triplet = paths.get_triplet_db().get_triplet_file_path(p.first); fmt::format_to(std::back_inserter(extraction_file), "if(VCPKG_TRIPLET_ID EQUAL {})\n" "set(CMAKE_CURRENT_LIST_FILE \"{}\")\n" diff --git a/src/vcpkg/commands.autocomplete.cpp b/src/vcpkg/commands.autocomplete.cpp index ec326eac61..ae6904b7f6 100644 --- a/src/vcpkg/commands.autocomplete.cpp +++ b/src/vcpkg/commands.autocomplete.cpp @@ -29,10 +29,10 @@ namespace vcpkg::Commands::Autocomplete Checks::exit_success(line_info); } - static std::vector combine_port_with_triplets(StringView port, - const std::vector& triplets) + static std::vector combine_port_with_triplets(StringView port, View triplets) { - return Util::fmap(triplets, [&](const std::string& triplet) { return fmt::format("{}:{}", port, triplet); }); + return Util::fmap(triplets, + [&](const TripletFile& triplet) { return fmt::format("{}:{}", port, triplet.name); }); } void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) @@ -113,9 +113,9 @@ namespace vcpkg::Commands::Autocomplete Checks::exit_success(VCPKG_LINE_INFO); } - std::vector triplets = paths.get_available_triplets_names(); - Util::erase_remove_if(triplets, [&](const std::string& s) { - return !Strings::case_insensitive_ascii_starts_with(s, triplet_prefix); + auto triplets = paths.get_triplet_db().available_triplets; + Util::erase_remove_if(triplets, [&](const TripletFile& tf) { + return !Strings::case_insensitive_ascii_starts_with(tf.name, triplet_prefix); }); auto result = combine_port_with_triplets(port_name, triplets); @@ -176,7 +176,7 @@ namespace vcpkg::Commands::Autocomplete if (command.name == "install" && results.size() == 1 && !is_option) { const auto port_at_each_triplet = - combine_port_with_triplets(results[0], paths.get_available_triplets_names()); + combine_port_with_triplets(results[0], paths.get_triplet_db().available_triplets); Util::Vectors::append(&results, port_at_each_triplet); } diff --git a/src/vcpkg/commands.build-external.cpp b/src/vcpkg/commands.build-external.cpp index cf8819adbb..9a7a010a7f 100644 --- a/src/vcpkg/commands.build-external.cpp +++ b/src/vcpkg/commands.build-external.cpp @@ -30,10 +30,10 @@ namespace vcpkg::Commands::BuildExternal default_triplet, default_triplet_used, COMMAND_STRUCTURE.get_example_text(), - paths); + paths.get_triplet_db()); if (default_triplet_used) { - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); } auto overlays = paths.overlay_ports; diff --git a/src/vcpkg/commands.build.cpp b/src/vcpkg/commands.build.cpp index 72f81e9178..3471ffff9b 100644 --- a/src/vcpkg/commands.build.cpp +++ b/src/vcpkg/commands.build.cpp @@ -184,10 +184,10 @@ namespace vcpkg::Build default_triplet, default_triplet_used, COMMAND_STRUCTURE.get_example_text(), - paths); + paths.get_triplet_db()); if (default_triplet_used) { - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); } auto& fs = paths.get_filesystem(); @@ -431,7 +431,7 @@ namespace vcpkg * connection request will fail. */ - protocol = Strings::concat(Strings::ascii_to_uppercase(protocol.c_str()), "_PROXY"); + protocol = Strings::concat(Strings::ascii_to_uppercase(protocol), "_PROXY"); env.emplace(protocol, address); msg::println(msgSettingEnvVar, msg::env_var = protocol, msg::url = address); } @@ -509,7 +509,7 @@ namespace vcpkg const auto& fs = paths.get_filesystem(); - const auto& triplet_file_path = paths.get_triplet_file_path(abi_info.pre_build_info->triplet); + const auto& triplet_file_path = paths.get_triplet_db().get_triplet_file_path(abi_info.pre_build_info->triplet); auto&& toolchain_hash = get_toolchain_cache(m_toolchain_cache, abi_info.pre_build_info->toolchain_file(), fs); @@ -531,7 +531,7 @@ namespace vcpkg { const auto& fs = paths.get_filesystem(); Checks::check_exit(VCPKG_LINE_INFO, abi_info.pre_build_info != nullptr); - const auto& triplet_file_path = paths.get_triplet_file_path(abi_info.pre_build_info->triplet); + const auto& triplet_file_path = paths.get_triplet_db().get_triplet_file_path(abi_info.pre_build_info->triplet); auto&& toolchain_hash = get_toolchain_cache(m_toolchain_cache, abi_info.pre_build_info->toolchain_file(), fs); @@ -645,7 +645,7 @@ namespace vcpkg {"CMD", "BUILD"}, {"DOWNLOADS", paths.downloads}, {"TARGET_TRIPLET", triplet.canonical_name()}, - {"TARGET_TRIPLET_FILE", paths.get_triplet_file_path(triplet)}, + {"TARGET_TRIPLET_FILE", paths.get_triplet_db().get_triplet_file_path(triplet)}, {"VCPKG_BASE_VERSION", VCPKG_BASE_VERSION_AS_STRING}, {"VCPKG_CONCURRENCY", std::to_string(get_concurrency())}, {"VCPKG_PLATFORM_TOOLSET", toolset.version.c_str()}, @@ -904,14 +904,15 @@ namespace vcpkg auto&& scfl = action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO); Triplet triplet = action.spec.triplet(); - const auto& triplet_file_path = paths.get_triplet_file_path(triplet); + const auto& triplet_db = paths.get_triplet_db(); + const auto& triplet_file_path = triplet_db.get_triplet_file_path(triplet); - if (Strings::starts_with(triplet_file_path, paths.community_triplets)) + if (Strings::starts_with(triplet_file_path, triplet_db.community_triplet_directory)) { msg::println_warning(msgUsingCommunityTriplet, msg::triplet = triplet.canonical_name()); msg::println(msgLoadingCommunityTriplet, msg::path = triplet_file_path); } - else if (!Strings::starts_with(triplet_file_path, paths.triplets)) + else if (!Strings::starts_with(triplet_file_path, triplet_db.default_triplet_directory)) { msg::println(msgLoadingOverlayTriplet, msg::path = triplet_file_path); } diff --git a/src/vcpkg/commands.check-support.cpp b/src/vcpkg/commands.check-support.cpp index 9b25392fdc..061b6e9886 100644 --- a/src/vcpkg/commands.check-support.cpp +++ b/src/vcpkg/commands.check-support.cpp @@ -115,13 +115,16 @@ namespace vcpkg::Commands bool default_triplet_used = false; const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_full_package_spec( - arg, default_triplet, default_triplet_used, COMMAND_STRUCTURE.get_example_text(), paths); + return check_and_get_full_package_spec(arg, + default_triplet, + default_triplet_used, + COMMAND_STRUCTURE.get_example_text(), + paths.get_triplet_db()); }); if (default_triplet_used) { - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); } auto& fs = paths.get_filesystem(); diff --git a/src/vcpkg/commands.ci.cpp b/src/vcpkg/commands.ci.cpp index 952b3df8e1..9d3db45394 100644 --- a/src/vcpkg/commands.ci.cpp +++ b/src/vcpkg/commands.ci.cpp @@ -347,7 +347,7 @@ namespace vcpkg::Commands::CI { msg::println_warning(msgInternalCICommand); - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); const auto& settings = options.settings; diff --git a/src/vcpkg/commands.dependinfo.cpp b/src/vcpkg/commands.dependinfo.cpp index 93448b6f29..70f076e476 100644 --- a/src/vcpkg/commands.dependinfo.cpp +++ b/src/vcpkg/commands.dependinfo.cpp @@ -391,13 +391,16 @@ namespace vcpkg::Commands::DependInfo bool default_triplet_used = false; const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_full_package_spec( - arg, default_triplet, default_triplet_used, COMMAND_STRUCTURE.get_example_text(), paths); + return check_and_get_full_package_spec(arg, + default_triplet, + default_triplet_used, + COMMAND_STRUCTURE.get_example_text(), + paths.get_triplet_db()); }); if (default_triplet_used) { - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); } auto& fs = paths.get_filesystem(); diff --git a/src/vcpkg/commands.export.cpp b/src/vcpkg/commands.export.cpp index d357b07f4b..d983355907 100644 --- a/src/vcpkg/commands.export.cpp +++ b/src/vcpkg/commands.export.cpp @@ -407,16 +407,13 @@ namespace vcpkg::Export // input sanitization bool default_triplet_used = false; ret.specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_package_spec(std::string(arg), - default_triplet, - default_triplet_used, - COMMAND_STRUCTURE.get_example_text(), - paths); + return parse_package_spec( + arg, default_triplet, default_triplet_used, COMMAND_STRUCTURE.get_example_text()); }); if (default_triplet_used) { - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); } } diff --git a/src/vcpkg/commands.help.cpp b/src/vcpkg/commands.help.cpp index 53c0080324..8856a48834 100644 --- a/src/vcpkg/commands.help.cpp +++ b/src/vcpkg/commands.help.cpp @@ -109,7 +109,7 @@ namespace vcpkg::Help {"remove", command_topic_fn}, {"search", command_topic_fn}, {"topics", help_topics}, - {"triplet", help_topic_valid_triplet}, + {"triplet", [](const VcpkgPaths& paths) { help_topic_valid_triplet(paths.get_triplet_db()); }}, {"versioning", help_topic_versioning}, }}; @@ -123,28 +123,28 @@ namespace vcpkg::Help msg::println(msg); } - void help_topic_valid_triplet(const VcpkgPaths& paths) + void help_topic_valid_triplet(const TripletDatabase& database) { std::map> triplets_per_location; - vcpkg::Util::group_by(paths.get_available_triplets(), + vcpkg::Util::group_by(database.available_triplets, &triplets_per_location, [](const TripletFile& triplet_file) -> StringView { return triplet_file.location; }); msg::println(msgAvailableArchitectureTriplets); msg::println(msgBuiltInTriplets); - for (auto* triplet : triplets_per_location[paths.triplets]) + for (auto* triplet : triplets_per_location[database.default_triplet_directory]) { msg::write_unlocalized_text_to_stdout(Color::none, fmt::format(" {}\n", triplet->name)); } - triplets_per_location.erase(paths.triplets); + triplets_per_location.erase(database.default_triplet_directory); msg::println(msgCommunityTriplets); - for (auto* triplet : triplets_per_location[paths.community_triplets]) + for (auto* triplet : triplets_per_location[database.community_triplet_directory]) { msg::write_unlocalized_text_to_stdout(Color::none, fmt::format(" {}\n", triplet->name)); } - triplets_per_location.erase(paths.community_triplets); + triplets_per_location.erase(database.community_triplet_directory); for (auto&& kv_pair : triplets_per_location) { msg::println(msgOverlayTriplets, msg::path = kv_pair.first); @@ -167,7 +167,7 @@ namespace vcpkg::Help const auto& topic = parsed.command_arguments[0]; if (topic == "triplets" || topic == "triple") { - help_topic_valid_triplet(paths); + help_topic_valid_triplet(paths.get_triplet_db()); get_global_metrics_collector().track_string(StringMetric::CommandContext, topic); Checks::exit_success(VCPKG_LINE_INFO); } diff --git a/src/vcpkg/commands.install.cpp b/src/vcpkg/commands.install.cpp index 7f8434f134..3a286f0208 100644 --- a/src/vcpkg/commands.install.cpp +++ b/src/vcpkg/commands.install.cpp @@ -945,8 +945,9 @@ namespace vcpkg } else if (ret.header_only) { - static auto cmakeify = [](std::string name) { - auto n = Strings::ascii_to_uppercase(Strings::replace_all(std::move(name), "-", "_")); + static auto cmakeify = [](StringView name) { + auto n = Strings::ascii_to_uppercase(name); + Strings::inplace_replace_all(n, "-", "_"); if (n.empty() || ParserBase::is_ascii_digit(n[0])) { n.insert(n.begin(), '_'); @@ -1029,7 +1030,7 @@ namespace vcpkg Checks::exit_fail(VCPKG_LINE_INFO); } - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); } else { @@ -1217,13 +1218,16 @@ namespace vcpkg bool default_triplet_used = false; const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_full_package_spec( - arg, default_triplet, default_triplet_used, COMMAND_STRUCTURE.get_example_text(), paths); + return check_and_get_full_package_spec(arg, + default_triplet, + default_triplet_used, + COMMAND_STRUCTURE.get_example_text(), + paths.get_triplet_db()); }); if (default_triplet_used) { - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); } // create the plan diff --git a/src/vcpkg/commands.package-info.cpp b/src/vcpkg/commands.package-info.cpp index 1d67b6ef85..1d4a224ba9 100644 --- a/src/vcpkg/commands.package-info.cpp +++ b/src/vcpkg/commands.package-info.cpp @@ -87,10 +87,10 @@ namespace vcpkg::Commands::PackageInfo } auto& qpkg = *maybe_qpkg.get(); - auto t = Triplet::from_canonical_name(std::string(*qpkg.triplet.get())); - check_triplet(t, paths); - specs_to_write.emplace_back(qpkg.name, t); + // intentionally no triplet name check + specs_to_write.emplace_back(qpkg.name, Triplet::from_canonical_name(*qpkg.triplet.get())); } + Json::Object response; Json::Object results; while (!specs_to_write.empty()) diff --git a/src/vcpkg/commands.remove.cpp b/src/vcpkg/commands.remove.cpp index 82ced08097..edbab10771 100644 --- a/src/vcpkg/commands.remove.cpp +++ b/src/vcpkg/commands.remove.cpp @@ -215,16 +215,13 @@ namespace vcpkg::Remove bool default_triplet_used = false; specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_package_spec(std::string(arg), - default_triplet, - default_triplet_used, - COMMAND_STRUCTURE.get_example_text(), - paths); + return parse_package_spec( + arg, default_triplet, default_triplet_used, COMMAND_STRUCTURE.get_example_text()); }); if (default_triplet_used) { - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); } } diff --git a/src/vcpkg/commands.set-installed.cpp b/src/vcpkg/commands.set-installed.cpp index e76f79092f..436acd1a53 100644 --- a/src/vcpkg/commands.set-installed.cpp +++ b/src/vcpkg/commands.set-installed.cpp @@ -270,13 +270,16 @@ namespace vcpkg::Commands::SetInstalled const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); bool default_triplet_used = false; const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_full_package_spec( - arg, default_triplet, default_triplet_used, COMMAND_STRUCTURE.get_example_text(), paths); + return check_and_get_full_package_spec(arg, + default_triplet, + default_triplet_used, + COMMAND_STRUCTURE.get_example_text(), + paths.get_triplet_db()); }); if (default_triplet_used) { - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); } const bool dry_run = Util::Sets::contains(options.switches, OPTION_DRY_RUN); diff --git a/src/vcpkg/commands.upgrade.cpp b/src/vcpkg/commands.upgrade.cpp index 9c3a7a55b8..63c37d2694 100644 --- a/src/vcpkg/commands.upgrade.cpp +++ b/src/vcpkg/commands.upgrade.cpp @@ -92,16 +92,16 @@ namespace vcpkg::Commands::Upgrade // input sanitization bool default_triplet_used = false; const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_package_spec(std::string(arg), + return check_and_get_package_spec(arg, default_triplet, default_triplet_used, COMMAND_STRUCTURE.get_example_text(), - paths); + paths.get_triplet_db()); }); if (default_triplet_used) { - print_default_triplet_warning(args); + print_default_triplet_warning(args, paths.get_triplet_db()); } std::vector not_installed; diff --git a/src/vcpkg/export.prefab.cpp b/src/vcpkg/export.prefab.cpp index a6f249b4ab..c7c4842b8d 100644 --- a/src/vcpkg/export.prefab.cpp +++ b/src/vcpkg/export.prefab.cpp @@ -261,7 +261,7 @@ namespace vcpkg::Export::Prefab VCPKG_LINE_INFO, is_supported(*build_info), msgExportPrefabRequiresAndroidTriplet); } - std::vector available_triplets = paths.get_available_triplets(); + const auto triplet_db = paths.get_triplet_db(); std::unordered_map required_archs = {{CPUArchitecture::ARM, "armeabi-v7a"}, {CPUArchitecture::ARM64, "arm64-v8a"}, @@ -277,7 +277,7 @@ namespace vcpkg::Export::Prefab std::unordered_map triplet_abi_map; std::unordered_map triplet_api_map; - for (auto& triplet_file : available_triplets) + for (auto& triplet_file : triplet_db.available_triplets) { if (triplet_file.name.size() > 0) { diff --git a/src/vcpkg/input.cpp b/src/vcpkg/input.cpp index f7b57e8cb3..ee2dc75055 100644 --- a/src/vcpkg/input.cpp +++ b/src/vcpkg/input.cpp @@ -1,66 +1,114 @@ + +#include +#include #include +#include -#include #include #include -#include #include -#include + +#include +#include namespace vcpkg { - PackageSpec check_and_get_package_spec(std::string&& spec_string, - Triplet default_triplet, - bool& default_triplet_used, - const LocalizedString& example_text, - const VcpkgPaths& paths) + PackageSpec parse_package_spec(StringView spec_string, + Triplet default_triplet, + bool& default_triplet_used, + const LocalizedString& example_text) { - const std::string as_lowercase = Strings::ascii_to_lowercase(std::move(spec_string)); + auto maybe_qualified_specifier = parse_qualified_specifier(Strings::ascii_to_lowercase(spec_string)); + if (auto qualified_specifier = maybe_qualified_specifier.get()) + { + auto expected_spec = qualified_specifier->to_package_spec(default_triplet, default_triplet_used); + if (auto spec = expected_spec.get()) + { + return std::move(*spec); + } - auto expected_spec = - parse_qualified_specifier(as_lowercase) - .then(&ParsedQualifiedSpecifier::to_package_spec, default_triplet, default_triplet_used); - if (auto spec = expected_spec.get()) + msg::println(Color::error, expected_spec.error()); + } + else { - check_triplet(spec->triplet(), paths); - return std::move(*spec); + msg::println(Color::error, maybe_qualified_specifier.error()); } - // Intentionally show the lowercased string - msg::println(Color::error, expected_spec.error()); msg::println(Color::none, example_text); Checks::exit_fail(VCPKG_LINE_INFO); } - void check_triplet(Triplet t, const VcpkgPaths& paths) + void check_triplet(StringView name, const TripletDatabase& database) { - if (!paths.is_valid_triplet(t)) + // Intentionally show the lowercased string + auto as_lower = Strings::ascii_to_lowercase(name); + if (!database.is_valid_triplet_canonical_name(as_lower)) { - msg::println_error(msgInvalidTriplet, msg::triplet = t); - Help::help_topic_valid_triplet(paths); + msg::println_error(msgInvalidTriplet, msg::triplet = as_lower); + Help::help_topic_valid_triplet(database); Checks::exit_fail(VCPKG_LINE_INFO); } } - FullPackageSpec check_and_get_full_package_spec(std::string full_package_spec_as_string, + PackageSpec check_and_get_package_spec(StringView spec_string, + Triplet default_triplet, + bool& default_triplet_used, + const LocalizedString& example_text, + const TripletDatabase& database) + { + auto maybe_qualified_specifier = parse_qualified_specifier(Strings::ascii_to_lowercase(spec_string)); + if (auto qualified_specifier = maybe_qualified_specifier.get()) + { + if (auto specified_triplet = qualified_specifier->triplet.get()) + { + check_triplet(*specified_triplet, database); + } + + auto expected_spec = qualified_specifier->to_package_spec(default_triplet, default_triplet_used); + if (auto spec = expected_spec.get()) + { + return std::move(*spec); + } + + msg::println(Color::error, expected_spec.error()); + } + else + { + msg::println(Color::error, maybe_qualified_specifier.error()); + } + + msg::println(Color::none, example_text); + Checks::exit_fail(VCPKG_LINE_INFO); + } + + FullPackageSpec check_and_get_full_package_spec(StringView spec_string, Triplet default_triplet, bool& default_triplet_used, const LocalizedString& example_text, - const VcpkgPaths& paths) + const TripletDatabase& database) { - auto expected_spec = parse_qualified_specifier(full_package_spec_as_string) - .then(&ParsedQualifiedSpecifier::to_full_spec, - default_triplet, - default_triplet_used, - ImplicitDefault::YES); - if (const auto spec = expected_spec.get()) + auto maybe_qualified_specifier = parse_qualified_specifier(Strings::ascii_to_lowercase(spec_string)); + if (auto qualified_specifier = maybe_qualified_specifier.get()) { - check_triplet(spec->package_spec.triplet(), paths); - return *spec; + if (auto specified_triplet = qualified_specifier->triplet.get()) + { + check_triplet(*specified_triplet, database); + } + + auto expected_spec = + qualified_specifier->to_full_spec(default_triplet, default_triplet_used, ImplicitDefault::YES); + if (auto spec = expected_spec.get()) + { + return std::move(*spec); + } + + msg::println(Color::error, expected_spec.error()); + } + else + { + msg::println(Color::error, maybe_qualified_specifier.error()); } - // Intentionally show the lowercased string - msg::println(Color::error, expected_spec.error()); msg::println(Color::none, example_text); Checks::exit_fail(VCPKG_LINE_INFO); } diff --git a/src/vcpkg/spdx.cpp b/src/vcpkg/spdx.cpp index a6259c274a..59a18d1a84 100644 --- a/src/vcpkg/spdx.cpp +++ b/src/vcpkg/spdx.cpp @@ -71,7 +71,7 @@ static Json::Object make_resource( auto& chk = obj.insert("checksums", Json::Array()); auto& chk512 = chk.push_back(Json::Object()); chk512.insert("algorithm", "SHA512"); - chk512.insert("checksumValue", Strings::ascii_to_lowercase(sha512.to_string())); + chk512.insert("checksumValue", Strings::ascii_to_lowercase(sha512)); } return obj; } diff --git a/src/vcpkg/triplet.cpp b/src/vcpkg/triplet.cpp index d138052b4e..3e3a0431fc 100644 --- a/src/vcpkg/triplet.cpp +++ b/src/vcpkg/triplet.cpp @@ -1,6 +1,8 @@ #include #include +#include +#include #include #include #include @@ -86,44 +88,70 @@ namespace vcpkg return nullopt; } - static Triplet system_triplet() + static std::string system_triplet_canonical_name() { auto host_proc = get_host_processor(); - auto canonical_name = fmt::format("{}-{}", to_zstring_view(host_proc), get_host_os_name()); - return Triplet::from_canonical_name(std::move(canonical_name)); + return fmt::format("{}-{}", to_zstring_view(host_proc), get_host_os_name()); } - Triplet default_triplet(const VcpkgCmdArguments& args) + Triplet default_triplet(const VcpkgCmdArguments& args, const TripletDatabase& database) { - if (auto triplet = args.triplet.get()) - { - return Triplet::from_canonical_name(*triplet); - } #if defined(_WIN32) - return Triplet::from_canonical_name("x86-windows"); + auto triplet_name = args.triplet.value_or("x86-windows"); #else - return system_triplet(); + auto triplet_name = args.triplet.value_or(system_triplet_canonical_name()); #endif + check_triplet(triplet_name, database); + return Triplet::from_canonical_name(triplet_name); } - Triplet default_host_triplet(const VcpkgCmdArguments& args) + Triplet default_host_triplet(const VcpkgCmdArguments& args, const TripletDatabase& database) { - if (auto host_triplet = args.host_triplet.get()) - { - return Triplet::from_canonical_name(*host_triplet); - } - return system_triplet(); + auto host_triplet_name = args.host_triplet.value_or(system_triplet_canonical_name()); + check_triplet(host_triplet_name, database); + return Triplet::from_canonical_name(host_triplet_name); } - void print_default_triplet_warning(const VcpkgCmdArguments& args) + void print_default_triplet_warning(const VcpkgCmdArguments& args, const TripletDatabase& database) { (void)args; + (void)database; // The triplet is not set by --triplet or VCPKG_DEFAULT_TRIPLET #if defined(_WIN32) if (!args.triplet.has_value()) { - msg::println_warning(msgDefaultTriplet, msg::triplet = default_host_triplet(args)); + msg::println_warning(msgDefaultTriplet, msg::triplet = default_host_triplet(args, database)); } #endif // ^^^ _WIN32 } + + TripletFile::TripletFile(StringView name, StringView location) : name(name.data(), name.size()), location(location) + { + } + + Path TripletFile::get_full_path() const { return location / (name + ".cmake"); } + + Path TripletDatabase::get_triplet_file_path(Triplet triplet) const + { + auto it = Util::find_if(available_triplets, + [&](const TripletFile& tf) { return tf.name == triplet.canonical_name(); }); + + if (it == available_triplets.end()) + { + Checks::msg_exit_with_message( + VCPKG_LINE_INFO, msgTripletFileNotFound, msg::triplet = triplet.canonical_name()); + } + + return it->get_full_path(); + } + + bool TripletDatabase::is_valid_triplet_name(StringView name) const + { + return is_valid_triplet_canonical_name(Strings::ascii_to_lowercase(name)); + } + + bool TripletDatabase ::is_valid_triplet_canonical_name(StringView name) const + { + return Util::any_of(available_triplets, [=](const TripletFile& tf) { return tf.name == name; }); + } } diff --git a/src/vcpkg/vcpkgpaths.cpp b/src/vcpkg/vcpkgpaths.cpp index 7f69d214f9..4db8e423d8 100644 --- a/src/vcpkg/vcpkgpaths.cpp +++ b/src/vcpkg/vcpkgpaths.cpp @@ -256,11 +256,10 @@ namespace // This structure holds members for VcpkgPathsImpl that don't require explicit initialization/destruction struct VcpkgPathsImplStage0 { - Lazy> available_triplets; + Lazy triplets_db; Lazy toolsets; Lazy> cmake_script_hashes; Lazy ports_cmake_hash; - Cache m_triplets_cache; Optional m_installed_lock; }; @@ -704,24 +703,10 @@ namespace vcpkg return this->package_dir(spec) / "BUILD_INFO"; } - bool VcpkgPaths::is_valid_triplet(Triplet t) const + const TripletDatabase& VcpkgPaths::get_triplet_db() const { - const auto it = Util::find_if(this->get_available_triplets(), [&](auto&& available_triplet) { - return t.canonical_name() == available_triplet.name; - }); - return it != this->get_available_triplets().cend(); - } - - const std::vector VcpkgPaths::get_available_triplets_names() const - { - return vcpkg::Util::fmap(this->get_available_triplets(), - [](auto&& triplet_file) -> std::string { return triplet_file.name; }); - } - - const std::vector& VcpkgPaths::get_available_triplets() const - { - return m_pimpl->available_triplets.get_lazy([this]() -> std::vector { - std::vector output; + return m_pimpl->triplets_db.get_lazy([this]() -> TripletDatabase { + std::vector available_triplets; const Filesystem& fs = this->get_filesystem(); for (auto&& triplets_dir : m_pimpl->triplets_dirs) { @@ -729,12 +714,12 @@ namespace vcpkg { if (Strings::case_insensitive_ascii_equals(path.extension(), ".cmake")) { - output.emplace_back(path.stem(), triplets_dir); + available_triplets.emplace_back(path.stem(), triplets_dir); } } } - return output; + return TripletDatabase{triplets, community_triplets, std::move(available_triplets)}; }); } @@ -765,24 +750,6 @@ namespace vcpkg }); } - const Path& VcpkgPaths::get_triplet_file_path(Triplet triplet) const - { - return m_pimpl->m_triplets_cache.get_lazy( - triplet, [&]() -> auto{ - for (const auto& triplet_dir : m_pimpl->triplets_dirs) - { - auto path = triplet_dir / (triplet.canonical_name() + ".cmake"); - if (this->get_filesystem().exists(path, IgnoreErrors{})) - { - return path; - } - } - - Checks::msg_exit_with_message( - VCPKG_LINE_INFO, msgTripletFileNotFound, msg::triplet = triplet.canonical_name()); - }); - } - LockFile& VcpkgPaths::get_installed_lockfile() const { if (!m_pimpl->m_installed_lock.has_value())