diff options
| author | ras0219 <533828+ras0219@users.noreply.github.com> | 2020-12-17 11:35:08 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-17 11:35:08 -0800 |
| commit | 9a81392e48e88ac4789107b100b93504d4ac713c (patch) | |
| tree | 895a03748f7f93a09b23c22463c050ad0dabe896 | |
| parent | a268c5a7f1aa0e933924bc09d48d92f0120769e5 (diff) | |
| download | vcpkg-9a81392e48e88ac4789107b100b93504d4ac713c.tar.gz vcpkg-9a81392e48e88ac4789107b100b93504d4ac713c.zip | |
[vcpkg] `VCPKG_ENV_PASSTHROUGH_UNTRACKED` (#15115)
* [vcpkg] Add VCPKG_ENV_PASSTHROUGH_UNTRACKED
* [vcpkg] CR comments
Co-authored-by: Robert Schumacher <roschuma@microsoft.com>
| -rw-r--r-- | docs/users/triplets.md | 12 | ||||
| -rw-r--r-- | scripts/azure-pipelines/end-to-end-tests-dir/env-passthrough.ps1 | 21 | ||||
| -rw-r--r-- | scripts/testing/env-passthrough/passthrough.cmake | 6 | ||||
| -rw-r--r-- | scripts/vcpkg_get_tags.cmake | 1 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/build.h | 1 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/build.cpp | 18 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/commands.env.cpp | 7 |
7 files changed, 58 insertions, 8 deletions
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`. + <a name="VCPKG_VISUAL_STUDIO_PATH"></a> ### 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<ConfigurationType> build_type; Optional<std::string> public_abi_override; std::vector<std::string> passthrough_env_vars; + std::vector<std::string> 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<std::string>{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); |
