From 9a81392e48e88ac4789107b100b93504d4ac713c Mon Sep 17 00:00:00 2001 From: ras0219 <533828+ras0219@users.noreply.github.com> Date: Thu, 17 Dec 2020 11:35:08 -0800 Subject: [vcpkg] `VCPKG_ENV_PASSTHROUGH_UNTRACKED` (#15115) * [vcpkg] Add VCPKG_ENV_PASSTHROUGH_UNTRACKED * [vcpkg] CR comments Co-authored-by: Robert Schumacher --- docs/users/triplets.md | 12 +++++++++--- .../end-to-end-tests-dir/env-passthrough.ps1 | 21 +++++++++++++++++++++ scripts/testing/env-passthrough/passthrough.cmake | 6 ++++++ scripts/vcpkg_get_tags.cmake | 1 + toolsrc/include/vcpkg/build.h | 1 + toolsrc/src/vcpkg/build.cpp | 18 +++++++++++++----- toolsrc/src/vcpkg/commands.env.cpp | 7 +++++++ 7 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 scripts/azure-pipelines/end-to-end-tests-dir/env-passthrough.ps1 create mode 100644 scripts/testing/env-passthrough/passthrough.cmake diff --git a/docs/users/triplets.md b/docs/users/triplets.md index 9903b197c..37efd590d 100644 --- a/docs/users/triplets.md +++ b/docs/users/triplets.md @@ -102,14 +102,20 @@ See the [`"supports"`](../maintainers/manifest-files.md#supports) manifest file ### VCPKG_ENV_PASSTHROUGH Instructs vcpkg to allow additional environment variables into the build process. -On Windows, vcpkg builds packages in a special clean environment that is isolated from the current command prompt to ensure build reliability and consistency. - -This triplet option can be set to a list of additional environment variables that will be added to the clean environment. +On Windows, vcpkg builds packages in a special clean environment that is isolated from the current command prompt to +ensure build reliability and consistency. This triplet option can be set to a list of additional environment variables +that will be added to the clean environment. The values of these environment variables will be hashed into the package +abi -- to pass through environment variables without abi tracking, see `VCPKG_ENV_PASSTHROUGH_UNTRACKED`. See also the `vcpkg env` command for how you can inspect the precise environment that will be used. > Implementers' Note: this list is extracted via the `vcpkg_get_tags` mechanism. +### VCPKG_ENV_PASSTHROUGH_UNTRACKED +Instructs vcpkg to allow additional environment variables into the build process without abi tracking. + +See `VCPKG_ENV_PASSTHROUGH`. + ### VCPKG_VISUAL_STUDIO_PATH Specifies the Visual Studio installation to use. diff --git a/scripts/azure-pipelines/end-to-end-tests-dir/env-passthrough.ps1 b/scripts/azure-pipelines/end-to-end-tests-dir/env-passthrough.ps1 new file mode 100644 index 000000000..6de1335d7 --- /dev/null +++ b/scripts/azure-pipelines/end-to-end-tests-dir/env-passthrough.ps1 @@ -0,0 +1,21 @@ +if (-not $IsLinux -and -not $IsMacOS) { + . $PSScriptRoot/../end-to-end-tests-prelude.ps1 + + $env:_VCPKG_TEST_TRACKED = "a" + $env:_VCPKG_TEST_UNTRACKED = "b" + + $x = ./vcpkg "--overlay-triplets=$PSScriptRoot/../../testing/env-passthrough" env "echo %_VCPKG_TEST_TRACKED% %_VCPKG_TEST_TRACKED2% %_VCPKG_TEST_UNTRACKED% %_VCPKG_TEST_UNTRACKED2%" + if ($x -ne "%_VCPKG_TEST_TRACKED% %_VCPKG_TEST_TRACKED2% %_VCPKG_TEST_UNTRACKED% %_VCPKG_TEST_UNTRACKED2%") + { + throw "env should have cleaned the environment ($x)" + } + + $y = ./vcpkg "--overlay-triplets=$PSScriptRoot/../../testing/env-passthrough" env --triplet passthrough "echo %_VCPKG_TEST_TRACKED% %_VCPKG_TEST_TRACKED2% %_VCPKG_TEST_UNTRACKED% %_VCPKG_TEST_UNTRACKED2%" + if ($y -ne "a %_VCPKG_TEST_TRACKED2% b %_VCPKG_TEST_UNTRACKED2%") + { + throw "env should have kept the environment ($y)" + } + + rm env:_VCPKG_TEST_TRACKED + rm env:_VCPKG_TEST_UNTRACKED +} \ No newline at end of file diff --git a/scripts/testing/env-passthrough/passthrough.cmake b/scripts/testing/env-passthrough/passthrough.cmake new file mode 100644 index 000000000..071b8381e --- /dev/null +++ b/scripts/testing/env-passthrough/passthrough.cmake @@ -0,0 +1,6 @@ +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE dynamic) + +set(VCPKG_ENV_PASSTHROUGH _VCPKG_TEST_TRACKED _VCPKG_TEST_TRACKED2) +set(VCPKG_ENV_PASSTHROUGH_UNTRACKED _VCPKG_TEST_UNTRACKED _VCPKG_TEST_UNTRACKED2) diff --git a/scripts/vcpkg_get_tags.cmake b/scripts/vcpkg_get_tags.cmake index bec5d9331..749b06e5a 100644 --- a/scripts/vcpkg_get_tags.cmake +++ b/scripts/vcpkg_get_tags.cmake @@ -24,6 +24,7 @@ e1e74b5c-18cb-4474-a6bd-5c1c8bc81f3f") message("c35112b6-d1ba-415b-aa5d-81de856ef8eb VCPKG_PUBLIC_ABI_OVERRIDE=${VCPKG_PUBLIC_ABI_OVERRIDE} VCPKG_ENV_PASSTHROUGH=${VCPKG_ENV_PASSTHROUGH} +VCPKG_ENV_PASSTHROUGH_UNTRACKED=${VCPKG_ENV_PASSTHROUGH_UNTRACKED} VCPKG_LOAD_VCVARS_ENV=${VCPKG_LOAD_VCVARS_ENV} e1e74b5c-18cb-4474-a6bd-5c1c8bc81f3f 8c504940-be29-4cba-9f8f-6cd83e9d87b7") diff --git a/toolsrc/include/vcpkg/build.h b/toolsrc/include/vcpkg/build.h index 2e3c5fafa..88a12e5c1 100644 --- a/toolsrc/include/vcpkg/build.h +++ b/toolsrc/include/vcpkg/build.h @@ -213,6 +213,7 @@ namespace vcpkg::Build Optional build_type; Optional public_abi_override; std::vector passthrough_env_vars; + std::vector passthrough_env_vars_tracked; fs::path toolchain_file() const; bool using_vcvars() const; diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp index 4cc4c2987..b01162b4f 100644 --- a/toolsrc/src/vcpkg/build.cpp +++ b/toolsrc/src/vcpkg/build.cpp @@ -896,11 +896,13 @@ namespace vcpkg::Build Hash::Algorithm::Sha1)); } - for (const auto& env_var : pre_build_info.passthrough_env_vars) + for (const auto& env_var : pre_build_info.passthrough_env_vars_tracked) { - abi_tag_entries.emplace_back( - "ENV:" + env_var, - Hash::get_string_hash(System::get_environment_variable(env_var).value_or(""), Hash::Algorithm::Sha1)); + if (auto e = System::get_environment_variable(env_var)) + { + abi_tag_entries.emplace_back( + "ENV:" + env_var, Hash::get_string_hash(e.value_or_exit(VCPKG_LINE_INFO), Hash::Algorithm::Sha1)); + } } } @@ -1305,6 +1307,7 @@ namespace vcpkg::Build CHAINLOAD_TOOLCHAIN_FILE, BUILD_TYPE, ENV_PASSTHROUGH, + ENV_PASSTHROUGH_UNTRACKED, PUBLIC_ABI_OVERRIDE, LOAD_VCVARS_ENV, }; @@ -1318,6 +1321,7 @@ namespace vcpkg::Build {"VCPKG_CHAINLOAD_TOOLCHAIN_FILE", VcpkgTripletVar::CHAINLOAD_TOOLCHAIN_FILE}, {"VCPKG_BUILD_TYPE", VcpkgTripletVar::BUILD_TYPE}, {"VCPKG_ENV_PASSTHROUGH", VcpkgTripletVar::ENV_PASSTHROUGH}, + {"VCPKG_ENV_PASSTHROUGH_UNTRACKED", VcpkgTripletVar::ENV_PASSTHROUGH_UNTRACKED}, {"VCPKG_PUBLIC_ABI_OVERRIDE", VcpkgTripletVar::PUBLIC_ABI_OVERRIDE}, {"VCPKG_LOAD_VCVARS_ENV", VcpkgTripletVar::LOAD_VCVARS_ENV}, }; @@ -1365,7 +1369,11 @@ namespace vcpkg::Build variable_value); break; case VcpkgTripletVar::ENV_PASSTHROUGH: - passthrough_env_vars = Strings::split(variable_value, ';'); + passthrough_env_vars_tracked = Strings::split(variable_value, ';'); + Util::Vectors::append(&passthrough_env_vars, passthrough_env_vars_tracked); + break; + case VcpkgTripletVar::ENV_PASSTHROUGH_UNTRACKED: + Util::Vectors::append(&passthrough_env_vars, Strings::split(variable_value, ';')); break; case VcpkgTripletVar::PUBLIC_ABI_OVERRIDE: public_abi_override = variable_value.empty() ? nullopt : Optional{variable_value}; diff --git a/toolsrc/src/vcpkg/commands.env.cpp b/toolsrc/src/vcpkg/commands.env.cpp index eadfd5bc0..d05a6ef50 100644 --- a/toolsrc/src/vcpkg/commands.env.cpp +++ b/toolsrc/src/vcpkg/commands.env.cpp @@ -75,6 +75,13 @@ namespace vcpkg::Commands::Env extra_env.emplace("PYTHONPATH", fs::u8string(paths.installed / fs::u8path(triplet.to_string()) / fs::u8path("python"))); if (path_vars.size() > 0) extra_env.emplace("PATH", Strings::join(";", path_vars)); + for (auto&& passthrough : pre_build_info.passthrough_env_vars) + { + if (auto e = System::get_environment_variable(passthrough)) + { + extra_env.emplace(passthrough, e.value_or_exit(VCPKG_LINE_INFO)); + } + } auto env = [&] { auto clean_env = System::get_modified_clean_environment(extra_env); -- cgit v1.2.3