Skip to content

Commit 484a69e

Browse files
committed
Use the Windows SDK arguments over the environment
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 a5adff9 commit 484a69e

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
@@ -110,8 +110,9 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
110110
CmdArgs.push_back(Args.MakeArgString(Twine("-libpath:") + DIAPath));
111111
}
112112
if (!llvm::sys::Process::GetEnv("LIB") ||
113-
Args.getLastArg(options::OPT__SLASH_vctoolsdir,
114-
options::OPT__SLASH_winsysroot)) {
113+
Args.hasArg(options::OPT__SLASH_vctoolsdir,
114+
options::OPT__SLASH_vctoolsversion,
115+
options::OPT__SLASH_winsysroot)) {
115116
CmdArgs.push_back(Args.MakeArgString(
116117
Twine("-libpath:") +
117118
TC.getSubDirectoryPath(llvm::SubDirectoryType::Lib)));
@@ -120,8 +121,9 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
120121
TC.getSubDirectoryPath(llvm::SubDirectoryType::Lib, "atlmfc")));
121122
}
122123
if (!llvm::sys::Process::GetEnv("LIB") ||
123-
Args.getLastArg(options::OPT__SLASH_winsdkdir,
124-
options::OPT__SLASH_winsysroot)) {
124+
Args.hasArg(options::OPT__SLASH_winsdkdir,
125+
options::OPT__SLASH_winsdkversion,
126+
options::OPT__SLASH_winsysroot)) {
125127
if (TC.useUniversalCRT()) {
126128
std::string UniversalCRTLibPath;
127129
if (TC.getUniversalCRTLibraryPath(Args, UniversalCRTLibPath))
@@ -686,9 +688,12 @@ void MSVCToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
686688
return;
687689

688690
// Honor %INCLUDE% and %EXTERNAL_INCLUDE%. It should have essential search
689-
// paths set by vcvarsall.bat. Skip if the user expressly set a vctoolsdir.
690-
if (!DriverArgs.getLastArg(options::OPT__SLASH_vctoolsdir,
691-
options::OPT__SLASH_winsysroot)) {
691+
// paths set by vcvarsall.bat. Skip if the user expressly set any of the
692+
// Windows SDK or VC Tools options.
693+
if (!DriverArgs.hasArg(
694+
options::OPT__SLASH_vctoolsdir, options::OPT__SLASH_vctoolsversion,
695+
options::OPT__SLASH_winsysroot, options::OPT__SLASH_winsdkdir,
696+
options::OPT__SLASH_winsdkversion)) {
692697
bool Found = AddSystemIncludesFromEnv("INCLUDE");
693698
Found |= AddSystemIncludesFromEnv("EXTERNAL_INCLUDE");
694699
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
@@ -597,11 +597,12 @@ void LinkerDriver::detectWinSysRoot(const opt::InputArgList &Args) {
597597
if (A->getOption().getID() == OPT_winsysroot)
598598
path::append(diaPath, "DIA SDK");
599599
}
600-
useWinSysRootLibPath = Args.hasArg(OPT_lldignoreenv) ||
601-
!Process::GetEnv("LIB") ||
602-
Args.getLastArg(OPT_vctoolsdir, OPT_winsysroot);
603-
if (Args.hasArg(OPT_lldignoreenv) || !Process::GetEnv("LIB") ||
604-
Args.getLastArg(OPT_winsdkdir, OPT_winsysroot)) {
600+
useWinSysRootLibPath = !Process::GetEnv("LIB") ||
601+
Args.hasArg(OPT_lldignoreenv, OPT_vctoolsdir,
602+
OPT_vctoolsversion, OPT_winsysroot);
603+
if (!Process::GetEnv("LIB") ||
604+
Args.hasArg(OPT_lldignoreenv, OPT_winsdkdir, OPT_winsdkversion,
605+
OPT_winsysroot)) {
605606
std::optional<StringRef> WinSdkDir, WinSdkVersion;
606607
if (auto *A = Args.getLastArg(OPT_winsdkdir))
607608
WinSdkDir = A->getValue();
@@ -1551,7 +1552,8 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
15511552
// installations when operating in mingw mode. (This also makes LLD ignore
15521553
// winsysroot and vctoolsdir arguments.)
15531554
detectWinSysRoot(args);
1554-
if (!args.hasArg(OPT_lldignoreenv) && !args.hasArg(OPT_winsysroot))
1555+
if (!args.hasArg(OPT_lldignoreenv, OPT_winsysroot, OPT_vctoolsdir,
1556+
OPT_vctoolsversion, OPT_winsdkdir, OPT_winsdkversion))
15551557
addLibSearchPaths();
15561558
} else {
15571559
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)