Skip to content

Commit 0a334dd

Browse files
authored
Merge pull request #10895 from Steelskin/fabrice/cp-no-include-for-win-sdk-version
🍒 Use the Windows SDK arguments over the environment (llvm#144805)
2 parents 3c7e35a + 484a69e commit 0a334dd

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)