The VCPKG_LOAD_VCVARS_ENV
option cannot be used to disable vcvars loading #40480
Description
Describe the bug
If you set the VCPKG_LOAD_VCVARS_ENV
to false, then vcpkg will still launch a VS Command prompt to get the vcvars environment.
Environment
- OS: Windows
To Reproduce
Steps to reproduce the behavior:
- Create a custom triplet with
set(VCPKG_LOAD_VCVARS_ENV OFF)
. For example:
set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE static)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_LOAD_VCVARS_ENV OFF)
- Run a build with no compiler on the
PATH
, noLIB
env var set, etc.
Expected behavior
vcpkg/CMake complains that it can't find a compiler.
Additional context
The bug occurs when vcpkg uses the value load_vcvars_env
which is set by VCPKG_LOAD_VCVARS_ENV
:
bool PreBuildInfo::using_vcvars() const
{
return (!external_toolchain_file.has_value() || load_vcvars_env) &&
(cmake_system_name.empty() || cmake_system_name == "WindowsStore");
}
If there is no external toolchain file (VCPKG_CHAINLOAD_TOOLCHAIN_FILE
is not set) then !external_toolchain_file.has_value()
is true
and so the value of load_vcvars_env
is ignored, thus VCPKG_LOAD_VCVARS_ENV
cannot be used to disable vcvargs loading.
It could, however, be used to re-enable vcvars loading if VCPKG_CHAINLOAD_TOOLCHAIN_FILE
was set - but that's not what the documentation indicates it does: "Determines whether vcpkg will search for and use an instance of Visual Studio as part of the triplet environment."
For anyone who came across this issue looking for a way to disable vcvars loading WITHOUT using a custom toolchain file, the workaround is to add set(VCPKG_CMAKE_SYSTEM_NAME Windows)
to your triplet.
It should be noted that changing the behavior now would be a breaking change, which I'm not sure how vcpkg handles.