diff --git a/.gitignore b/.gitignore index edafc23ef8..ef5c56f3ea 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,4 @@ node_modules/ /ce/test/vcpkg-ce.test.build.log /ce/common/temp /vcpkg-root -/CMakePresets.json +/CMakePresets.json \ No newline at end of file diff --git a/azure-pipelines/e2e_projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/portfile.cmake b/azure-pipelines/e2e_projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/azure-pipelines/e2e_projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e_projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/vcpkg.json new file mode 100644 index 0000000000..1f42aa9278 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/vcpkg.json @@ -0,0 +1,4 @@ +{ + "name": "vcpkg-empty-port", + "version": "0" +} diff --git a/azure-pipelines/e2e_projects/overlays-bad-paths/my-triplets/x64-windows-static.cmake b/azure-pipelines/e2e_projects/overlays-bad-paths/my-triplets/x64-windows-static.cmake new file mode 100644 index 0000000000..b227169ed5 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-bad-paths/my-triplets/x64-windows-static.cmake @@ -0,0 +1,4 @@ +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE static) +set(VCPKG_LIBRARY_LINKAGE dynamic) + diff --git a/azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg-configuration.json b/azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg-configuration.json new file mode 100644 index 0000000000..ca49482b31 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg-configuration.json @@ -0,0 +1,4 @@ +{ + "overlay-ports": [ "./azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays" ], + "overlay-triplets": [ 123 ] +} diff --git a/azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg.json b/azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg.json new file mode 100644 index 0000000000..6b2860f121 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg.json @@ -0,0 +1,5 @@ +{ + "dependencies": [ + "vcpkg-empty-port" + ] +} \ No newline at end of file diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/portfile.cmake b/azure-pipelines/e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/vcpkg.json new file mode 100644 index 0000000000..baf6dd9a57 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/vcpkg.json @@ -0,0 +1,4 @@ +{ + "name": "another-vcpkg-empty-port", + "version": "0" +} diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/config-overlays/beicode/portfile.cmake b/azure-pipelines/e2e_projects/overlays-project-config-embedded/config-overlays/beicode/portfile.cmake new file mode 100644 index 0000000000..2ea339ff3d --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-config-embedded/config-overlays/beicode/portfile.cmake @@ -0,0 +1,21 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO northwindtraders/beicode + REF 19a1f95c2f56a27ced90227b5e2754a602a08e69 + SHA512 7b2bb7acb2a8ff07bff59cfa27247a7b2cced03828919cd65cc0c8cf1f724f5f1e947ed6992dcdbc913fb470694a52613d1861eaaadbf8903e94eb9cdfe4d000 + HEAD_REF main +) + +vcpkg_configure_cmake( + SOURCE_PATH "${SOURCE_PATH}" + PREFER_NINJA +) +vcpkg_install_cmake() +vcpkg_fixup_cmake_targets() + +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") + +file( + INSTALL "${SOURCE_PATH}/LICENSE" + DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" + RENAME copyright) \ No newline at end of file diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/config-overlays/beicode/vcpkg.json b/azure-pipelines/e2e_projects/overlays-project-config-embedded/config-overlays/beicode/vcpkg.json new file mode 100644 index 0000000000..aad67c0e82 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-config-embedded/config-overlays/beicode/vcpkg.json @@ -0,0 +1,6 @@ +{ + "name": "beicode", + "version": "1.0.0", + "description": "A simple utf-8 based unicode decoding and encoding library", + "homepage": "https://github.com/northwindtraders/beicode" +} \ No newline at end of file diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/portfile.cmake b/azure-pipelines/e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/vcpkg.json new file mode 100644 index 0000000000..1f42aa9278 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/vcpkg.json @@ -0,0 +1,4 @@ +{ + "name": "vcpkg-empty-port", + "version": "0" +} 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 new file mode 100644 index 0000000000..b227169ed5 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-config-embedded/my-triplets/x64-windows-static.cmake @@ -0,0 +1,4 @@ +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE static) +set(VCPKG_LIBRARY_LINKAGE dynamic) + diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/vcpkg.json b/azure-pipelines/e2e_projects/overlays-project-config-embedded/vcpkg.json new file mode 100644 index 0000000000..2ab1841e93 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-config-embedded/vcpkg.json @@ -0,0 +1,12 @@ +{ + "dependencies": [ + "fmt", + "vcpkg-empty-port", + "another-vcpkg-empty-port", + "beicode" + ], + "vcpkg-configuration": { + "overlay-ports": [ "./config-overlays" ], + "overlay-triplets": [ "./my-triplets" ] + } +} \ No newline at end of file diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/portfile.cmake b/azure-pipelines/e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/vcpkg.json new file mode 100644 index 0000000000..baf6dd9a57 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/vcpkg.json @@ -0,0 +1,4 @@ +{ + "name": "another-vcpkg-empty-port", + "version": "0" +} diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/beicode/portfile.cmake b/azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/beicode/portfile.cmake new file mode 100644 index 0000000000..2ea339ff3d --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/beicode/portfile.cmake @@ -0,0 +1,21 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO northwindtraders/beicode + REF 19a1f95c2f56a27ced90227b5e2754a602a08e69 + SHA512 7b2bb7acb2a8ff07bff59cfa27247a7b2cced03828919cd65cc0c8cf1f724f5f1e947ed6992dcdbc913fb470694a52613d1861eaaadbf8903e94eb9cdfe4d000 + HEAD_REF main +) + +vcpkg_configure_cmake( + SOURCE_PATH "${SOURCE_PATH}" + PREFER_NINJA +) +vcpkg_install_cmake() +vcpkg_fixup_cmake_targets() + +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") + +file( + INSTALL "${SOURCE_PATH}/LICENSE" + DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" + RENAME copyright) \ No newline at end of file diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/beicode/vcpkg.json b/azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/beicode/vcpkg.json new file mode 100644 index 0000000000..aad67c0e82 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/beicode/vcpkg.json @@ -0,0 +1,6 @@ +{ + "name": "beicode", + "version": "1.0.0", + "description": "A simple utf-8 based unicode decoding and encoding library", + "homepage": "https://github.com/northwindtraders/beicode" +} \ No newline at end of file diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/portfile.cmake b/azure-pipelines/e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/vcpkg.json new file mode 100644 index 0000000000..1f42aa9278 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/vcpkg.json @@ -0,0 +1,4 @@ +{ + "name": "vcpkg-empty-port", + "version": "0" +} 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 new file mode 100644 index 0000000000..b227169ed5 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-with-config/my-triplets/x64-windows-static.cmake @@ -0,0 +1,4 @@ +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/vcpkg-configuration.json b/azure-pipelines/e2e_projects/overlays-project-with-config/vcpkg-configuration.json new file mode 100644 index 0000000000..cd046b1629 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-with-config/vcpkg-configuration.json @@ -0,0 +1,4 @@ +{ + "overlay-ports": [ "./config-overlays" ], + "overlay-triplets": [ "./my-triplets" ] +} diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/vcpkg.json b/azure-pipelines/e2e_projects/overlays-project-with-config/vcpkg.json new file mode 100644 index 0000000000..63575270b2 --- /dev/null +++ b/azure-pipelines/e2e_projects/overlays-project-with-config/vcpkg.json @@ -0,0 +1,8 @@ +{ + "dependencies": [ + "fmt", + "vcpkg-empty-port", + "another-vcpkg-empty-port", + "beicode" + ] +} \ No newline at end of file diff --git a/azure-pipelines/end-to-end-tests-dir/overlays.ps1 b/azure-pipelines/end-to-end-tests-dir/overlays.ps1 new file mode 100644 index 0000000000..b0382c2c82 --- /dev/null +++ b/azure-pipelines/end-to-end-tests-dir/overlays.ps1 @@ -0,0 +1,30 @@ +. $PSScriptRoot/../end-to-end-tests-prelude.ps1 + +# Tests a simple project with overlay ports and triplets configured on a vcpkg-configuration.json file +$e2eProjects = "$PSScriptRoot/../e2e_projects" + +$manifestRoot = "$e2eProjects/overlays-project-with-config" +$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 +Throw-IfFailed + +# Tests overlays configured in env and cli on a project with configuration embedded on the manifest file +$manifestRoot = "$e2eProjects/overlays-project-config-embedded" +$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 +Throw-IfFailed + +# Config with bad paths +$manifestRoot = "$e2eProjects/overlays-bad-paths" +$env:VCPKG_OVERLAY_PORTS = "$manifestRoot/env_overlays" +Run-Vcpkg install --x-manifest-root=$manifestRoot ` + --overlay-triplets=$manifestRoot/my-triplets ` + --x-install-root=$installRoot +Throw-IfNotFailed diff --git a/include/vcpkg/configuration.h b/include/vcpkg/configuration.h index bd87bdd8e4..5aa0831640 100644 --- a/include/vcpkg/configuration.h +++ b/include/vcpkg/configuration.h @@ -34,6 +34,8 @@ namespace vcpkg std::vector registries; Json::Object ce_metadata; Json::Object extra_info; + std::vector overlay_ports; + std::vector overlay_triplets; Json::Object serialize() const; void validate_as_active(); diff --git a/include/vcpkg/vcpkgcmdarguments.h b/include/vcpkg/vcpkgcmdarguments.h index 89920cdeac..2e12714d5b 100644 --- a/include/vcpkg/vcpkgcmdarguments.h +++ b/include/vcpkg/vcpkgcmdarguments.h @@ -158,10 +158,12 @@ namespace vcpkg Optional host_triplet; constexpr static StringLiteral OVERLAY_PORTS_ENV = "VCPKG_OVERLAY_PORTS"; constexpr static StringLiteral OVERLAY_PORTS_ARG = "overlay-ports"; - std::vector overlay_ports; + std::vector cli_overlay_ports; + std::vector env_overlay_ports; constexpr static StringLiteral OVERLAY_TRIPLETS_ENV = "VCPKG_OVERLAY_TRIPLETS"; constexpr static StringLiteral OVERLAY_TRIPLETS_ARG = "overlay-triplets"; - std::vector overlay_triplets; + std::vector cli_overlay_triplets; + std::vector env_overlay_triplets; constexpr static StringLiteral BINARY_SOURCES_ARG = "binarysource"; std::vector binary_sources; diff --git a/include/vcpkg/vcpkgpaths.h b/include/vcpkg/vcpkgpaths.h index 9a005a470d..6de5d5e0a4 100644 --- a/include/vcpkg/vcpkgpaths.h +++ b/include/vcpkg/vcpkgpaths.h @@ -122,6 +122,9 @@ namespace vcpkg const Path triplets; const Path community_triplets; + std::vector overlay_ports; + std::vector overlay_triplets; + std::string get_toolver_diagnostics() const; const ToolCache& get_tool_cache() const; diff --git a/src/vcpkg-test/arguments.cpp b/src/vcpkg-test/arguments.cpp index 2f87ac0033..3439af0625 100644 --- a/src/vcpkg-test/arguments.cpp +++ b/src/vcpkg-test/arguments.cpp @@ -38,13 +38,13 @@ TEST_CASE ("VcpkgCmdArguments from lowercase argument sequence", "[arguments]") REQUIRE(v.print_metrics); REQUIRE(*v.print_metrics.get()); - REQUIRE(v.overlay_ports.size() == 2); - REQUIRE(v.overlay_ports.at(0) == "C:\\ports1"); - REQUIRE(v.overlay_ports.at(1) == "C:\\ports2"); + REQUIRE(v.cli_overlay_ports.size() == 2); + REQUIRE(v.cli_overlay_ports.at(0) == "C:\\ports1"); + REQUIRE(v.cli_overlay_ports.at(1) == "C:\\ports2"); - REQUIRE(v.overlay_triplets.size() == 2); - REQUIRE(v.overlay_triplets.at(0) == "C:\\tripletsA"); - REQUIRE(v.overlay_triplets.at(1) == "C:\\tripletsB"); + REQUIRE(v.cli_overlay_triplets.size() == 2); + REQUIRE(v.cli_overlay_triplets.at(0) == "C:\\tripletsA"); + REQUIRE(v.cli_overlay_triplets.at(1) == "C:\\tripletsB"); } TEST_CASE ("VcpkgCmdArguments from uppercase argument sequence", "[arguments]") @@ -75,13 +75,13 @@ TEST_CASE ("VcpkgCmdArguments from uppercase argument sequence", "[arguments]") REQUIRE(v.print_metrics); REQUIRE(*v.print_metrics.get()); - REQUIRE(v.overlay_ports.size() == 2); - REQUIRE(v.overlay_ports.at(0) == "C:\\ports1"); - REQUIRE(v.overlay_ports.at(1) == "C:\\ports2"); + REQUIRE(v.cli_overlay_ports.size() == 2); + REQUIRE(v.cli_overlay_ports.at(0) == "C:\\ports1"); + REQUIRE(v.cli_overlay_ports.at(1) == "C:\\ports2"); - REQUIRE(v.overlay_triplets.size() == 2); - REQUIRE(v.overlay_triplets.at(0) == "C:\\tripletsA"); - REQUIRE(v.overlay_triplets.at(1) == "C:\\tripletsB"); + REQUIRE(v.cli_overlay_triplets.size() == 2); + REQUIRE(v.cli_overlay_triplets.at(0) == "C:\\tripletsA"); + REQUIRE(v.cli_overlay_triplets.at(1) == "C:\\tripletsB"); } TEST_CASE ("VcpkgCmdArguments from argument sequence with valued options", "[arguments]") diff --git a/src/vcpkg-test/configmetadata.cpp b/src/vcpkg-test/configmetadata.cpp index e79a33a2c0..4d21d904e3 100644 --- a/src/vcpkg-test/configmetadata.cpp +++ b/src/vcpkg-test/configmetadata.cpp @@ -466,6 +466,105 @@ TEST_CASE ("metadata demands", "[ce-metadata]") TEST_CASE ("serialize configuration", "[ce-metadata]") { + SECTION ("only overlay ports") + { + std::string raw = R"json({ + "overlay-ports": [ + "./my-ports/fmt", + "/custom-ports", + "../share/team-ports", + "my-ports/fmt" + ] +})json"; + // parsing of configuration is tested elsewhere + auto config = parse_test_configuration(raw); + Test::check_json_eq(Json::parse_object(raw).value_or_exit(VCPKG_LINE_INFO), config.serialize()); + } + + SECTION ("invalid overlay ports") + { + std::string raw = R"json({ + "overlay-ports": [ + "./my-ports/fmt" , + "/custom-ports", + 123 + ] +})json"; + check_errors(raw, R"( +$.overlay-ports[2]: mismatched type: expected an overlay path +)"); + } + + SECTION ("only overlay triplets") + { + std::string raw = R"json({ + "overlay-triplets": [ + "./team-triplets" + ] +})json"; + // parsing of configuration is tested elsewhere + auto config = parse_test_configuration(raw); + Test::check_json_eq(Json::parse_object(raw).value_or_exit(VCPKG_LINE_INFO), config.serialize()); + } + + SECTION ("invalid overlay triplets") + { + std::string raw = R"json({ + "overlay-triplets": [ + 123 + ] +})json"; + check_errors(raw, R"( +$.overlay-triplets[0]: mismatched type: expected a triplet path +)"); + } + + SECTION ("both overlay ports and overlay triplets") + { + std::string raw = R"json({ + "overlay-ports": [ + "./my-ports/fmt" , + "/custom-ports", + "../share/team-ports" + ], + "overlay-triplets": [ + "./team-triplets" + ] +})json"; + // parsing of configuration is tested elsewhere + auto config = parse_test_configuration(raw); + Test::check_json_eq(Json::parse_object(raw).value_or_exit(VCPKG_LINE_INFO), config.serialize()); + } + + SECTION ("overriden default registry, registries and overlays") + { + std::string raw = R"json({ + "default-registry": { + "kind": "builtin", + "baseline": "843e0ba0d8f9c9c572e45564263eedfc7745e74f" + }, + "registries": [ + { + "kind": "git", + "repository": "https://github.com/microsoft/vcpkg", + "baseline": "843e0ba0d8f9c9c572e45564263eedfc7745e74f", + "packages": [ "zlib" ] + } + ], + "overlay-ports": [ + "./my-ports/fmt" , + "/custom-ports", + "../share/team-ports" + ], + "overlay-triplets": [ + "./team-triplets" + ] +})json"; + // parsing of configuration is tested elsewhere + auto config = parse_test_configuration(raw); + Test::check_json_eq(Json::parse_object(raw).value_or_exit(VCPKG_LINE_INFO), config.serialize()); + } + SECTION ("null default registry") { std::string raw = R"json({ diff --git a/src/vcpkg.cpp b/src/vcpkg.cpp index 021d77eddd..6ee5411347 100644 --- a/src/vcpkg.cpp +++ b/src/vcpkg.cpp @@ -118,8 +118,6 @@ static void inner(vcpkg::Filesystem& fs, const VcpkgCmdArguments& args) } } - LockGuardPtr(g_metrics)->track_bool_property(BoolMetric::OptionOverlayPorts, !args.overlay_ports.empty()); - if (const auto command_function = find_command(Commands::get_available_basic_commands())) { LockGuardPtr(g_metrics)->track_string_property(StringMetric::CommandName, command_function->name); @@ -129,6 +127,8 @@ static void inner(vcpkg::Filesystem& fs, const VcpkgCmdArguments& args) const VcpkgPaths paths(fs, args); paths.track_feature_flag_metrics(); + LockGuardPtr(g_metrics)->track_bool_property(BoolMetric::OptionOverlayPorts, !paths.overlay_ports.empty()); + fs.current_path(paths.root, VCPKG_LINE_INFO); if (const auto command_function = find_command(Commands::get_available_paths_commands())) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index fc4cf02cfa..eef675a82b 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -189,7 +189,7 @@ namespace vcpkg::Build const FullPackageSpec spec = check_and_get_full_package_spec( std::move(first_arg), default_triplet, COMMAND_STRUCTURE.example_text, paths); - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); return perform_ex(args, spec, host_triplet, provider, binary_cache, null_build_logs_recorder(), paths); } } // namespace vcpkg::Build diff --git a/src/vcpkg/commands.buildexternal.cpp b/src/vcpkg/commands.buildexternal.cpp index d7438648f0..58253c3867 100644 --- a/src/vcpkg/commands.buildexternal.cpp +++ b/src/vcpkg/commands.buildexternal.cpp @@ -29,7 +29,7 @@ namespace vcpkg::Commands::BuildExternal const FullPackageSpec spec = check_and_get_full_package_spec( std::string(args.command_arguments.at(0)), default_triplet, COMMAND_STRUCTURE.example_text, paths); - auto overlays = args.overlay_ports; + auto overlays = paths.overlay_ports; overlays.insert(overlays.begin(), args.command_arguments.at(1)); PathsPortFileProvider provider(paths, make_overlay_provider(paths, overlays)); diff --git a/src/vcpkg/commands.check-support.cpp b/src/vcpkg/commands.check-support.cpp index 810c7836cc..48ac240828 100644 --- a/src/vcpkg/commands.check-support.cpp +++ b/src/vcpkg/commands.check-support.cpp @@ -114,7 +114,7 @@ namespace vcpkg::Commands std::string(arg), default_triplet, COMMAND_STRUCTURE.example_text, paths); }); - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); auto cmake_vars = CMakeVars::make_triplet_cmake_var_provider(paths); // for each spec in the user-requested specs, check all dependencies diff --git a/src/vcpkg/commands.ci.cpp b/src/vcpkg/commands.ci.cpp index ea50bb3c3d..b8fc8e2d05 100644 --- a/src/vcpkg/commands.ci.cpp +++ b/src/vcpkg/commands.ci.cpp @@ -385,7 +385,7 @@ namespace vcpkg::Commands::CI const IBuildLogsRecorder& build_logs_recorder = build_logs_recorder_storage ? *(build_logs_recorder_storage.get()) : null_build_logs_recorder(); - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths); auto& var_provider = *var_provider_storage; diff --git a/src/vcpkg/commands.dependinfo.cpp b/src/vcpkg/commands.dependinfo.cpp index 4ee99b0b89..711b9ab633 100644 --- a/src/vcpkg/commands.dependinfo.cpp +++ b/src/vcpkg/commands.dependinfo.cpp @@ -309,7 +309,7 @@ namespace vcpkg::Commands::DependInfo std::string{arg}, default_triplet, COMMAND_STRUCTURE.example_text, paths); }); - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths); auto& var_provider = *var_provider_storage; diff --git a/src/vcpkg/commands.env.cpp b/src/vcpkg/commands.env.cpp index 040732c334..535334fb22 100644 --- a/src/vcpkg/commands.env.cpp +++ b/src/vcpkg/commands.env.cpp @@ -44,7 +44,7 @@ namespace vcpkg::Commands::Env const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths); auto& var_provider = *var_provider_storage; diff --git a/src/vcpkg/commands.find.cpp b/src/vcpkg/commands.find.cpp index 8b249b69be..920e2f4b2a 100644 --- a/src/vcpkg/commands.find.cpp +++ b/src/vcpkg/commands.find.cpp @@ -259,7 +259,7 @@ namespace vcpkg::Commands } } // unlock metrics - perform_find_port_and_exit(paths, full_description, enable_json, filter, args.overlay_ports); + perform_find_port_and_exit(paths, full_description, enable_json, filter, paths.overlay_ports); } Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgAddCommandFirstArg); diff --git a/src/vcpkg/commands.info.cpp b/src/vcpkg/commands.info.cpp index e179b8b26c..0e5ea7d082 100644 --- a/src/vcpkg/commands.info.cpp +++ b/src/vcpkg/commands.info.cpp @@ -115,7 +115,7 @@ namespace vcpkg::Commands::Info { Json::Object response; Json::Object results; - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); for (auto&& arg : args.command_arguments) { diff --git a/src/vcpkg/commands.search.cpp b/src/vcpkg/commands.search.cpp index a080fc782b..3634ab758b 100644 --- a/src/vcpkg/commands.search.cpp +++ b/src/vcpkg/commands.search.cpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace vcpkg::Commands { @@ -32,6 +33,6 @@ namespace vcpkg::Commands filter = StringView{args.command_arguments[0]}; } - perform_find_port_and_exit(paths, full_description, args.json.value_or(false), filter, args.overlay_ports); + perform_find_port_and_exit(paths, full_description, args.json.value_or(false), filter, paths.overlay_ports); } } diff --git a/src/vcpkg/commands.setinstalled.cpp b/src/vcpkg/commands.setinstalled.cpp index 1d9d34b388..d26c5d7404 100644 --- a/src/vcpkg/commands.setinstalled.cpp +++ b/src/vcpkg/commands.setinstalled.cpp @@ -175,7 +175,7 @@ namespace vcpkg::Commands::SetInstalled const PrintUsage print_cmake_usage = Util::Sets::contains(options.switches, OPTION_NO_PRINT_USAGE) ? PrintUsage::NO : PrintUsage::YES; - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); auto cmake_vars = CMakeVars::make_triplet_cmake_var_provider(paths); Optional pkgsconfig; diff --git a/src/vcpkg/commands.upgrade.cpp b/src/vcpkg/commands.upgrade.cpp index 5a88f42a9c..6bf9d471db 100644 --- a/src/vcpkg/commands.upgrade.cpp +++ b/src/vcpkg/commands.upgrade.cpp @@ -86,7 +86,7 @@ namespace vcpkg::Commands::Upgrade StatusParagraphs status_db = database_load_check(paths.get_filesystem(), paths.installed()); // Load ports from ports dirs - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths); auto& var_provider = *var_provider_storage; diff --git a/src/vcpkg/configuration.cpp b/src/vcpkg/configuration.cpp index 8d05052c8d..5b3b16f20d 100644 --- a/src/vcpkg/configuration.cpp +++ b/src/vcpkg/configuration.cpp @@ -260,6 +260,8 @@ namespace constexpr static StringLiteral DEFAULT_REGISTRY = "default-registry"; constexpr static StringLiteral REGISTRIES = "registries"; + constexpr static StringLiteral OVERLAY_PORTS = "overlay-ports"; + constexpr static StringLiteral OVERLAY_TRIPLETS = "overlay-triplets"; virtual Optional visit_object(Json::Reader& r, const Json::Object& obj) override; @@ -268,6 +270,8 @@ namespace ConfigurationDeserializer ConfigurationDeserializer::instance; constexpr StringLiteral ConfigurationDeserializer::DEFAULT_REGISTRY; constexpr StringLiteral ConfigurationDeserializer::REGISTRIES; + constexpr StringLiteral ConfigurationDeserializer::OVERLAY_PORTS; + constexpr StringLiteral ConfigurationDeserializer::OVERLAY_TRIPLETS; Optional DictionaryDeserializer::visit_object(Json::Reader& r, const Json::Object& obj) { @@ -391,6 +395,14 @@ namespace } } + static Json::ArrayDeserializer op_des("an array of overlay ports paths", + Json::StringDeserializer{"an overlay path"}); + r.optional_object_field(obj, OVERLAY_PORTS, ret.overlay_ports, op_des); + + static Json::ArrayDeserializer ot_des("an array of overlay triplets paths", + Json::StringDeserializer{"a triplet path"}); + r.optional_object_field(obj, OVERLAY_TRIPLETS, ret.overlay_triplets, ot_des); + RegistryConfig default_registry; if (r.optional_object_field(obj, DEFAULT_REGISTRY, default_registry, RegistryConfigDeserializer::instance)) { @@ -607,6 +619,8 @@ namespace vcpkg static constexpr StringView known_fields[]{ ConfigurationDeserializer::DEFAULT_REGISTRY, ConfigurationDeserializer::REGISTRIES, + ConfigurationDeserializer::OVERLAY_PORTS, + ConfigurationDeserializer::OVERLAY_TRIPLETS, CeMetadataDeserializer::CE_MESSAGE, CeMetadataDeserializer::CE_WARNING, CeMetadataDeserializer::CE_ERROR, @@ -739,6 +753,24 @@ namespace vcpkg } } + if (!overlay_ports.empty()) + { + auto& op_arr = obj.insert(ConfigurationDeserializer::OVERLAY_PORTS, Json::Array()); + for (const auto& port : overlay_ports) + { + op_arr.push_back(port); + } + } + + if (!overlay_triplets.empty()) + { + auto& ot_arr = obj.insert(ConfigurationDeserializer::OVERLAY_TRIPLETS, Json::Array()); + for (const auto& triplet : overlay_triplets) + { + ot_arr.push_back(triplet); + } + } + if (!ce_metadata.is_empty()) { serialize_ce_metadata(ce_metadata, obj); diff --git a/src/vcpkg/export.cpp b/src/vcpkg/export.cpp index e54c09fbbc..2c1a8b91e0 100644 --- a/src/vcpkg/export.cpp +++ b/src/vcpkg/export.cpp @@ -592,7 +592,7 @@ namespace vcpkg::Export const auto opts = handle_export_command_arguments(paths, args, default_triplet, status_db); // Load ports from ports dirs - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); // create the plan std::vector export_plan = create_export_plan(opts.specs, status_db); diff --git a/src/vcpkg/install.cpp b/src/vcpkg/install.cpp index 16504a87f9..57f8eba886 100644 --- a/src/vcpkg/install.cpp +++ b/src/vcpkg/install.cpp @@ -1063,8 +1063,8 @@ namespace vcpkg std::vector extended_overlay_ports; const bool add_builtin_ports_directory_as_overlay = paths.get_registry_set().is_default_builtin_registry() && !paths.use_git_default_registry(); - extended_overlay_ports.reserve(args.overlay_ports.size() + add_builtin_ports_directory_as_overlay); - extended_overlay_ports = args.overlay_ports; + extended_overlay_ports.reserve(paths.overlay_ports.size() + add_builtin_ports_directory_as_overlay); + extended_overlay_ports = paths.overlay_ports; if (add_builtin_ports_directory_as_overlay) { extended_overlay_ports.emplace_back(paths.builtin_ports_directory().native()); @@ -1114,7 +1114,7 @@ namespace vcpkg print_cmake_usage); } - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); const std::vector specs = Util::fmap(args.command_arguments, [&](auto&& arg) { return check_and_get_full_package_spec( diff --git a/src/vcpkg/remove.cpp b/src/vcpkg/remove.cpp index c245c3f740..08db75408f 100644 --- a/src/vcpkg/remove.cpp +++ b/src/vcpkg/remove.cpp @@ -205,7 +205,7 @@ namespace vcpkg::Remove } // Load ports from ports dirs - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); specs = Util::fmap(Update::find_outdated_packages(provider, status_db), [](auto&& outdated) { return outdated.spec; }); diff --git a/src/vcpkg/update.cpp b/src/vcpkg/update.cpp index a1f8c3b225..3ba05eb1f9 100644 --- a/src/vcpkg/update.cpp +++ b/src/vcpkg/update.cpp @@ -68,7 +68,7 @@ namespace vcpkg::Update const StatusParagraphs status_db = database_load_check(paths.get_filesystem(), paths.installed()); - PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); + PathsPortFileProvider provider(paths, make_overlay_provider(paths, paths.overlay_ports)); const auto outdated_packages = SortedVector( find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); diff --git a/src/vcpkg/vcpkgcmdarguments.cpp b/src/vcpkg/vcpkgcmdarguments.cpp index f6acb07867..88b03bd1c0 100644 --- a/src/vcpkg/vcpkgcmdarguments.cpp +++ b/src/vcpkg/vcpkgcmdarguments.cpp @@ -351,8 +351,8 @@ namespace vcpkg constexpr static std::pair VcpkgCmdArguments::*> cojoined_multivalues[] = { - {OVERLAY_PORTS_ARG, &VcpkgCmdArguments::overlay_ports}, - {OVERLAY_TRIPLETS_ARG, &VcpkgCmdArguments::overlay_triplets}, + {OVERLAY_PORTS_ARG, &VcpkgCmdArguments::cli_overlay_ports}, + {OVERLAY_TRIPLETS_ARG, &VcpkgCmdArguments::cli_overlay_triplets}, {BINARY_SOURCES_ARG, &VcpkgCmdArguments::binary_sources}, {CMAKE_SCRIPT_ARG, &VcpkgCmdArguments::cmake_args}, }; @@ -774,16 +774,14 @@ namespace vcpkg const auto vcpkg_overlay_ports_env = get_env(OVERLAY_PORTS_ENV); if (const auto unpacked = vcpkg_overlay_ports_env.get()) { - auto overlays = Strings::split_paths(*unpacked); - overlay_ports.insert(std::end(overlay_ports), std::begin(overlays), std::end(overlays)); + env_overlay_ports = Strings::split_paths(*unpacked); } } { const auto vcpkg_overlay_triplets_env = get_env(OVERLAY_TRIPLETS_ENV); if (const auto unpacked = vcpkg_overlay_triplets_env.get()) { - auto triplets = Strings::split_paths(*unpacked); - overlay_triplets.insert(std::end(overlay_triplets), std::begin(triplets), std::end(triplets)); + env_overlay_triplets = Strings::split_paths(*unpacked); } } { diff --git a/src/vcpkg/vcpkgpaths.cpp b/src/vcpkg/vcpkgpaths.cpp index ffd35b231e..40c9f29476 100644 --- a/src/vcpkg/vcpkgpaths.cpp +++ b/src/vcpkg/vcpkgpaths.cpp @@ -134,6 +134,18 @@ namespace vcpkg return parsed_config_opt; } + static std::vector merge_overlays(const std::vector& cli_overlays, + const std::vector& manifest_overlays, + const std::vector& env_overlays) + { + std::vector ret = cli_overlays; + + ret.insert(std::end(ret), std::begin(manifest_overlays), std::end(manifest_overlays)); + ret.insert(std::end(ret), std::begin(env_overlays), std::end(env_overlays)); + + return ret; + } + static ConfigurationAndSource merge_validate_configs(Optional&& manifest_data, const Path& manifest_dir, Optional&& config_data, @@ -483,9 +495,7 @@ namespace vcpkg args.exact_abi_tools_versions.value_or(false) ? RequireExactVersions::YES : RequireExactVersions::NO)) , m_env_cache(m_ff_settings.compiler_tracking) - , triplets_dirs( - Util::fmap(args.overlay_triplets, - [&fs](const std::string& p) { return fs.almost_canonical(p, VCPKG_LINE_INFO); })) + , triplets_dirs() , m_artifacts_dir(downloads / "artifacts") { if (auto i = m_installed.get()) @@ -659,9 +669,6 @@ namespace vcpkg Debug::print("Using builtin-registry: ", builtin_registry_versions, '\n'); Debug::print("Using downloads-root: ", downloads, '\n'); - m_pimpl->triplets_dirs.emplace_back(triplets); - m_pimpl->triplets_dirs.emplace_back(community_triplets); - { auto maybe_manifest_config = config_from_manifest(m_pimpl->m_manifest_path, m_pimpl->m_manifest_doc); auto maybe_config_json = config_from_json(m_pimpl->m_config_dir / "vcpkg-configuration.json", filesystem); @@ -672,9 +679,32 @@ namespace vcpkg m_pimpl->m_config_dir, *this); + auto resolve_relative_to_config = [&](const std::string& overlay_path) { + return (m_pimpl->m_config.directory / overlay_path).native(); + }; + + if (!m_pimpl->m_config.directory.empty()) + { + auto& config = m_pimpl->m_config.config; + Util::transform(config.overlay_ports, resolve_relative_to_config); + Util::transform(config.overlay_triplets, resolve_relative_to_config); + } + + overlay_ports = merge_overlays( + args.cli_overlay_ports, get_configuration().config.overlay_ports, args.env_overlay_ports); + overlay_triplets = merge_overlays( + args.cli_overlay_triplets, get_configuration().config.overlay_triplets, args.env_overlay_triplets); + m_pimpl->m_registry_set = m_pimpl->m_config.instantiate_registry_set(*this); } + for (std::string triplet : this->overlay_triplets) + { + m_pimpl->triplets_dirs.emplace_back(filesystem.almost_canonical(triplet, VCPKG_LINE_INFO)); + } + m_pimpl->triplets_dirs.emplace_back(triplets); + m_pimpl->triplets_dirs.emplace_back(community_triplets); + // metrics from configuration { auto default_registry = m_pimpl->m_registry_set->default_registry();