diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 1e244865b2117..7d31eea603087 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -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) diff --git a/clang/test/Driver/cl-include.c b/clang/test/Driver/cl-include.c index ca9e7db1e6f07..d041698c7fd3b 100644 --- a/clang/test/Driver/cl-include.c +++ b/clang/test/Driver/cl-include.c @@ -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" diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index f3240b22a1442..8a016d44d4636 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -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 WinSdkDir, WinSdkVersion; if (auto *A = Args.getLastArg(OPT_winsdkdir)) WinSdkDir = A->getValue(); @@ -1620,7 +1621,8 @@ void LinkerDriver::linkerMain(ArrayRef 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)) diff --git a/lld/test/COFF/winsysroot.test b/lld/test/COFF/winsysroot.test index e29e6ca115c89..c2e9f23562d4c 100644 --- a/lld/test/COFF/winsysroot.test +++ b/lld/test/COFF/winsysroot.test @@ -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'