Use the Windows SDK arguments over the environment (#144805)

If any of the Windows SDK (and MSVC)-related argument is passed in the
command line, they should take priority over the environment variables
like `INCLUDE` or `LIB` set by vcvarsall from the Visual Studio
Developer Environment on Windows.

These changes ensure that all of the arguments related to VC Tools and
the Windows SDK cause the driver to ignore the environment.
This commit is contained in:
Fabrice de Gans
2025-06-24 09:39:11 -07:00
committed by GitHub
parent d80766152c
commit 85d250c96e
4 changed files with 29 additions and 13 deletions

View File

@@ -111,8 +111,9 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back(Args.MakeArgString(Twine("-libpath:") + DIAPath));
}
if (!llvm::sys::Process::GetEnv("LIB") ||
Args.getLastArg(options::OPT__SLASH_vctoolsdir,
options::OPT__SLASH_winsysroot)) {
Args.hasArg(options::OPT__SLASH_vctoolsdir,
options::OPT__SLASH_vctoolsversion,
options::OPT__SLASH_winsysroot)) {
CmdArgs.push_back(Args.MakeArgString(
Twine("-libpath:") +
TC.getSubDirectoryPath(llvm::SubDirectoryType::Lib)));
@@ -121,8 +122,9 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
TC.getSubDirectoryPath(llvm::SubDirectoryType::Lib, "atlmfc")));
}
if (!llvm::sys::Process::GetEnv("LIB") ||
Args.getLastArg(options::OPT__SLASH_winsdkdir,
options::OPT__SLASH_winsysroot)) {
Args.hasArg(options::OPT__SLASH_winsdkdir,
options::OPT__SLASH_winsdkversion,
options::OPT__SLASH_winsysroot)) {
if (TC.useUniversalCRT()) {
std::string UniversalCRTLibPath;
if (TC.getUniversalCRTLibraryPath(Args, UniversalCRTLibPath))
@@ -694,9 +696,12 @@ void MSVCToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
return;
// Honor %INCLUDE% and %EXTERNAL_INCLUDE%. It should have essential search
// paths set by vcvarsall.bat. Skip if the user expressly set a vctoolsdir.
if (!DriverArgs.getLastArg(options::OPT__SLASH_vctoolsdir,
options::OPT__SLASH_winsysroot)) {
// paths set by vcvarsall.bat. Skip if the user expressly set any of the
// Windows SDK or VC Tools options.
if (!DriverArgs.hasArg(
options::OPT__SLASH_vctoolsdir, options::OPT__SLASH_vctoolsversion,
options::OPT__SLASH_winsysroot, options::OPT__SLASH_winsdkdir,
options::OPT__SLASH_winsdkversion)) {
bool Found = AddSystemIncludesFromEnv("INCLUDE");
Found |= AddSystemIncludesFromEnv("EXTERNAL_INCLUDE");
if (Found)

View File

@@ -41,3 +41,8 @@
// EXTERNAL_ENV: "-internal-isystem" "/dir1"
// EXTERNAL_ENV: "-internal-isystem" "/dir2"
// EXTERNAL_ENV: "-internal-isystem" "/dir3"
// /winsdkversion suppresses %INCLUDE% and %EXTERNAL_INCLUDE%
// RUN:env INCLUDE=/my/system/inc env EXTERNAL_INCLUDE=/my/system/inc2 %clang_cl /winsdkversion 99.99.9999.9 -### -- %s 2>&1 | FileCheck %s --check-prefix=SDKVERSION
// SDKVERSION-NOT: "-internal-isystem" "/my/system/inc"
// SDKVERSION-NOT: "-internal-isystem" "/my/system/inc2"

View File

@@ -706,11 +706,12 @@ void LinkerDriver::detectWinSysRoot(const opt::InputArgList &Args) {
if (A->getOption().getID() == OPT_winsysroot)
path::append(diaPath, "DIA SDK");
}
useWinSysRootLibPath = Args.hasArg(OPT_lldignoreenv) ||
!Process::GetEnv("LIB") ||
Args.getLastArg(OPT_vctoolsdir, OPT_winsysroot);
if (Args.hasArg(OPT_lldignoreenv) || !Process::GetEnv("LIB") ||
Args.getLastArg(OPT_winsdkdir, OPT_winsysroot)) {
useWinSysRootLibPath = !Process::GetEnv("LIB") ||
Args.hasArg(OPT_lldignoreenv, OPT_vctoolsdir,
OPT_vctoolsversion, OPT_winsysroot);
if (!Process::GetEnv("LIB") ||
Args.hasArg(OPT_lldignoreenv, OPT_winsdkdir, OPT_winsdkversion,
OPT_winsysroot)) {
std::optional<StringRef> WinSdkDir, WinSdkVersion;
if (auto *A = Args.getLastArg(OPT_winsdkdir))
WinSdkDir = A->getValue();
@@ -1620,7 +1621,8 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
// installations when operating in mingw mode. (This also makes LLD ignore
// winsysroot and vctoolsdir arguments.)
detectWinSysRoot(args);
if (!args.hasArg(OPT_lldignoreenv) && !args.hasArg(OPT_winsysroot))
if (!args.hasArg(OPT_lldignoreenv, OPT_winsysroot, OPT_vctoolsdir,
OPT_vctoolsversion, OPT_winsdkdir, OPT_winsdkversion))
addLibSearchPaths();
} else {
if (args.hasArg(OPT_vctoolsdir, OPT_winsysroot))

View File

@@ -58,3 +58,7 @@ LIBIGNORED_MINGW: could not open 'libstd32.a'
# RUN: not lld-link -lldmingw %t.obj /defaultlib:std32 /winsysroot:%t.dir/sysroot 2>&1 | FileCheck -check-prefix=IGNORED_ARG %s
IGNORED_ARG: warning: ignoring /vctoolsdir or /winsysroot flags in MinGW mode
Check that when /winsdkversion is specified, %LIB% is ignored.
# RUN: env LIB=%t.dir/sysroot/VC/Tools/MSVC/1.1.1.1/lib/x86 not lld-link %t.obj /winsdkversion:99.99.9999.9 /defaultlib:std32 2>&1 | FileCheck -check-prefix=WINSDKVERSION %s
WINSDKVERSION: could not open 'std32.lib'