Skip to content

Commit 85d250c

Browse files
authored
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.
1 parent d807661 commit 85d250c

File tree

4 files changed

+29
-13
lines changed

4 files changed

+29
-13
lines changed

clang/lib/Driver/ToolChains/MSVC.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,9 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
111111
CmdArgs.push_back(Args.MakeArgString(Twine("-libpath:") + DIAPath));
112112
}
113113
if (!llvm::sys::Process::GetEnv("LIB") ||
114-
Args.getLastArg(options::OPT__SLASH_vctoolsdir,
115-
options::OPT__SLASH_winsysroot)) {
114+
Args.hasArg(options::OPT__SLASH_vctoolsdir,
115+
options::OPT__SLASH_vctoolsversion,
116+
options::OPT__SLASH_winsysroot)) {
116117
CmdArgs.push_back(Args.MakeArgString(
117118
Twine("-libpath:") +
118119
TC.getSubDirectoryPath(llvm::SubDirectoryType::Lib)));
@@ -121,8 +122,9 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
121122
TC.getSubDirectoryPath(llvm::SubDirectoryType::Lib, "atlmfc")));
122123
}
123124
if (!llvm::sys::Process::GetEnv("LIB") ||
124-
Args.getLastArg(options::OPT__SLASH_winsdkdir,
125-
options::OPT__SLASH_winsysroot)) {
125+
Args.hasArg(options::OPT__SLASH_winsdkdir,
126+
options::OPT__SLASH_winsdkversion,
127+
options::OPT__SLASH_winsysroot)) {
126128
if (TC.useUniversalCRT()) {
127129
std::string UniversalCRTLibPath;
128130
if (TC.getUniversalCRTLibraryPath(Args, UniversalCRTLibPath))
@@ -694,9 +696,12 @@ void MSVCToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
694696
return;
695697

696698
// Honor %INCLUDE% and %EXTERNAL_INCLUDE%. It should have essential search
697-
// paths set by vcvarsall.bat. Skip if the user expressly set a vctoolsdir.
698-
if (!DriverArgs.getLastArg(options::OPT__SLASH_vctoolsdir,
699-
options::OPT__SLASH_winsysroot)) {
699+
// paths set by vcvarsall.bat. Skip if the user expressly set any of the
700+
// Windows SDK or VC Tools options.
701+
if (!DriverArgs.hasArg(
702+
options::OPT__SLASH_vctoolsdir, options::OPT__SLASH_vctoolsversion,
703+
options::OPT__SLASH_winsysroot, options::OPT__SLASH_winsdkdir,
704+
options::OPT__SLASH_winsdkversion)) {
700705
bool Found = AddSystemIncludesFromEnv("INCLUDE");
701706
Found |= AddSystemIncludesFromEnv("EXTERNAL_INCLUDE");
702707
if (Found)

clang/test/Driver/cl-include.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,8 @@
4141
// EXTERNAL_ENV: "-internal-isystem" "/dir1"
4242
// EXTERNAL_ENV: "-internal-isystem" "/dir2"
4343
// EXTERNAL_ENV: "-internal-isystem" "/dir3"
44+
45+
// /winsdkversion suppresses %INCLUDE% and %EXTERNAL_INCLUDE%
46+
// 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
47+
// SDKVERSION-NOT: "-internal-isystem" "/my/system/inc"
48+
// SDKVERSION-NOT: "-internal-isystem" "/my/system/inc2"

lld/COFF/Driver.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -706,11 +706,12 @@ void LinkerDriver::detectWinSysRoot(const opt::InputArgList &Args) {
706706
if (A->getOption().getID() == OPT_winsysroot)
707707
path::append(diaPath, "DIA SDK");
708708
}
709-
useWinSysRootLibPath = Args.hasArg(OPT_lldignoreenv) ||
710-
!Process::GetEnv("LIB") ||
711-
Args.getLastArg(OPT_vctoolsdir, OPT_winsysroot);
712-
if (Args.hasArg(OPT_lldignoreenv) || !Process::GetEnv("LIB") ||
713-
Args.getLastArg(OPT_winsdkdir, OPT_winsysroot)) {
709+
useWinSysRootLibPath = !Process::GetEnv("LIB") ||
710+
Args.hasArg(OPT_lldignoreenv, OPT_vctoolsdir,
711+
OPT_vctoolsversion, OPT_winsysroot);
712+
if (!Process::GetEnv("LIB") ||
713+
Args.hasArg(OPT_lldignoreenv, OPT_winsdkdir, OPT_winsdkversion,
714+
OPT_winsysroot)) {
714715
std::optional<StringRef> WinSdkDir, WinSdkVersion;
715716
if (auto *A = Args.getLastArg(OPT_winsdkdir))
716717
WinSdkDir = A->getValue();
@@ -1620,7 +1621,8 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
16201621
// installations when operating in mingw mode. (This also makes LLD ignore
16211622
// winsysroot and vctoolsdir arguments.)
16221623
detectWinSysRoot(args);
1623-
if (!args.hasArg(OPT_lldignoreenv) && !args.hasArg(OPT_winsysroot))
1624+
if (!args.hasArg(OPT_lldignoreenv, OPT_winsysroot, OPT_vctoolsdir,
1625+
OPT_vctoolsversion, OPT_winsdkdir, OPT_winsdkversion))
16241626
addLibSearchPaths();
16251627
} else {
16261628
if (args.hasArg(OPT_vctoolsdir, OPT_winsysroot))

lld/test/COFF/winsysroot.test

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,7 @@ LIBIGNORED_MINGW: could not open 'libstd32.a'
5858

5959
# RUN: not lld-link -lldmingw %t.obj /defaultlib:std32 /winsysroot:%t.dir/sysroot 2>&1 | FileCheck -check-prefix=IGNORED_ARG %s
6060
IGNORED_ARG: warning: ignoring /vctoolsdir or /winsysroot flags in MinGW mode
61+
62+
Check that when /winsdkversion is specified, %LIB% is ignored.
63+
# 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
64+
WINSDKVERSION: could not open 'std32.lib'

0 commit comments

Comments
 (0)