aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorras0219 <533828+ras0219@users.noreply.github.com>2020-12-17 11:35:08 -0800
committerGitHub <noreply@github.com>2020-12-17 11:35:08 -0800
commit9a81392e48e88ac4789107b100b93504d4ac713c (patch)
tree895a03748f7f93a09b23c22463c050ad0dabe896
parenta268c5a7f1aa0e933924bc09d48d92f0120769e5 (diff)
downloadvcpkg-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.md12
-rw-r--r--scripts/azure-pipelines/end-to-end-tests-dir/env-passthrough.ps121
-rw-r--r--scripts/testing/env-passthrough/passthrough.cmake6
-rw-r--r--scripts/vcpkg_get_tags.cmake1
-rw-r--r--toolsrc/include/vcpkg/build.h1
-rw-r--r--toolsrc/src/vcpkg/build.cpp18
-rw-r--r--toolsrc/src/vcpkg/commands.env.cpp7
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);