Skip to content

Commit 09ade25

Browse files
authored
Merge pull request #64151 from compnerd/control
Driver: introduce additional Windows controls
2 parents bcfe5a1 + 73cafeb commit 09ade25

File tree

6 files changed

+98
-4
lines changed

6 files changed

+98
-4
lines changed

include/swift/AST/SearchPathOptions.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,11 @@ class SearchPathOptions {
265265
FrameworkSearchPaths.size() - 1);
266266
}
267267

268+
llvm::Optional<StringRef> WinSDKRoot = llvm::None;
269+
llvm::Optional<StringRef> WinSDKVersion = llvm::None;
270+
llvm::Optional<StringRef> VCToolsRoot = llvm::None;
271+
llvm::Optional<StringRef> VCToolsVersion = llvm::None;
272+
268273
public:
269274
StringRef getSDKPath() const { return SDKPath; }
270275

@@ -283,6 +288,26 @@ class SearchPathOptions {
283288
Lookup.searchPathsDidChange();
284289
}
285290

291+
llvm::Optional<StringRef> getWinSDKRoot() const { return WinSDKRoot; }
292+
void setWinSDKRoot(StringRef root) {
293+
WinSDKRoot = root;
294+
}
295+
296+
llvm::Optional<StringRef> getWinSDKVersion() const { return WinSDKVersion; }
297+
void setWinSDKVersion(StringRef version) {
298+
WinSDKVersion = version;
299+
}
300+
301+
llvm::Optional<StringRef> getVCToolsRoot() const { return VCToolsRoot; }
302+
void setVCToolsRoot(StringRef root) {
303+
VCToolsRoot = root;
304+
}
305+
306+
llvm::Optional<StringRef> getVCToolsVersion() const { return VCToolsVersion; }
307+
void setVCToolsVersion(StringRef version) {
308+
VCToolsVersion = version;
309+
}
310+
286311
ArrayRef<std::string> getImportSearchPaths() const {
287312
return ImportSearchPaths;
288313
}

include/swift/Option/Options.td

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,25 @@ def parseable_output : Flag<["-"], "parseable-output">,
224224
Flags<[NoInteractiveOption, DoesNotAffectIncrementalBuild]>,
225225
HelpText<"Emit textual output in a parseable format">;
226226

227+
// Windows Options
228+
229+
def windows_sdk_root : Separate<["-"], "windows-sdk-root">,
230+
Flags<[ArgumentIsPath, FrontendOption, SwiftAPIExtractOption,
231+
SwiftSymbolGraphExtractOption, SwiftAPIDigesterOption]>,
232+
HelpText<"Windows SDK Root">, MetaVarName<"<root>">;
233+
def windows_sdk_version : Separate<["-"], "windows-sdk-version">,
234+
Flags<[ArgumentIsPath, FrontendOption, SwiftAPIExtractOption,
235+
SwiftSymbolGraphExtractOption, SwiftAPIDigesterOption]>,
236+
HelpText<"Windows SDK Version">, MetaVarName<"<version>">;
237+
def visualc_tools_root : Separate<["-"], "visualc-tools-root">,
238+
Flags<[ArgumentIsPath, FrontendOption, SwiftAPIExtractOption,
239+
SwiftSymbolGraphExtractOption, SwiftAPIDigesterOption]>,
240+
HelpText<"VisualC++ Tools Root">, MetaVarName<"<root>">;
241+
def visualc_tools_version : Separate<["-"], "visualc-tools-version">,
242+
Flags<[ArgumentIsPath, FrontendOption, SwiftAPIExtractOption,
243+
SwiftSymbolGraphExtractOption, SwiftAPIDigesterOption]>,
244+
HelpText<"VisualC++ ToolSet Version">, MetaVarName<"<version>">;
245+
227246
// Standard Options
228247
def _DASH_DASH : Option<["--"], "", KIND_REMAINING_ARGS>,
229248
Flags<[FrontendOption, DoesNotAffectIncrementalBuild]>;

lib/ClangImporter/ClangImporter.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,23 @@ importer::addCommonInvocationArguments(
774774
invocationArgStrs.push_back("-mcx16");
775775
}
776776

777+
if (llvm::Optional<StringRef> R = ctx.SearchPathOpts.getWinSDKRoot()) {
778+
invocationArgStrs.emplace_back("-Xmicrosoft-windows-sdk-root");
779+
invocationArgStrs.emplace_back(*R);
780+
}
781+
if (llvm::Optional<StringRef> V = ctx.SearchPathOpts.getWinSDKVersion()) {
782+
invocationArgStrs.emplace_back("-Xmicrosoft-windows-sdk-version");
783+
invocationArgStrs.emplace_back(*V);
784+
}
785+
if (llvm::Optional<StringRef> R = ctx.SearchPathOpts.getVCToolsRoot()) {
786+
invocationArgStrs.emplace_back("-Xmicrosoft-visualc-tools-root");
787+
invocationArgStrs.emplace_back(*R);
788+
}
789+
if (llvm::Optional<StringRef> V = ctx.SearchPathOpts.getVCToolsVersion()) {
790+
invocationArgStrs.emplace_back("-Xmicrosoft-visualc-tools-version");
791+
invocationArgStrs.emplace_back(*V);
792+
}
793+
777794
if (!importerOpts.Optimization.empty()) {
778795
invocationArgStrs.push_back(importerOpts.Optimization);
779796
}

lib/ClangImporter/ClangIncludePaths.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,8 @@ GetWindowsFileMappings(ASTContext &Context) {
339339
std::string LibraryVersion;
340340
int MajorVersion;
341341
} WindowsSDK;
342-
if (llvm::getWindowsSDKDir(VFS, {}, {}, {},
342+
if (llvm::getWindowsSDKDir(VFS, SearchPathOpts.getWinSDKRoot(),
343+
SearchPathOpts.getWinSDKVersion(), {},
343344
WindowsSDK.Path, WindowsSDK.MajorVersion,
344345
WindowsSDK.IncludeVersion,
345346
WindowsSDK.LibraryVersion)) {
@@ -358,7 +359,8 @@ GetWindowsFileMappings(ASTContext &Context) {
358359
std::string Path;
359360
std::string Version;
360361
} UCRTSDK;
361-
if (llvm::getUniversalCRTSdkDir(VFS, {}, {}, {},
362+
if (llvm::getUniversalCRTSdkDir(VFS, SearchPathOpts.getWinSDKRoot(),
363+
SearchPathOpts.getWinSDKVersion(), {},
362364
UCRTSDK.Path, UCRTSDK.Version)) {
363365
llvm::SmallString<261> UCRTInjection{UCRTSDK.Path};
364366
llvm::sys::path::append(UCRTInjection, "Include", UCRTSDK.Version, "ucrt");
@@ -373,9 +375,13 @@ GetWindowsFileMappings(ASTContext &Context) {
373375
std::string Path;
374376
llvm::ToolsetLayout Layout;
375377
} VCTools;
376-
if (llvm::findVCToolChainViaCommandLine(VFS, {}, {}, {}, VCTools.Path, VCTools.Layout) ||
378+
if (llvm::findVCToolChainViaCommandLine(VFS, SearchPathOpts.getVCToolsRoot(),
379+
SearchPathOpts.getVCToolsVersion(),
380+
{}, VCTools.Path, VCTools.Layout) ||
377381
llvm::findVCToolChainViaEnvironment(VFS, VCTools.Path, VCTools.Layout) ||
378-
llvm::findVCToolChainViaSetupConfig(VFS, VCTools.Path, VCTools.Layout)) {
382+
llvm::findVCToolChainViaSetupConfig(VFS,
383+
SearchPathOpts.getVCToolsVersion(),
384+
VCTools.Path, VCTools.Layout)) {
379385
assert(VCTools.Layout == llvm::ToolsetLayout::VS2017OrNewer &&
380386
"unsupported toolset layout (VS2017+ required)");
381387

lib/Driver/ToolChains.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,24 @@ void ToolChain::addCommonFrontendArgs(const OutputInfo &OI,
211211
arguments.push_back(inputArgs.MakeArgString(OI.SDKPath));
212212
}
213213

214+
if (const Arg *A = inputArgs.getLastArg(options::OPT_windows_sdk_root)) {
215+
arguments.push_back("-windows-sdk-root");
216+
arguments.push_back(inputArgs.MakeArgString(A->getValue()));
217+
}
218+
if (const Arg *A = inputArgs.getLastArg(options::OPT_windows_sdk_version)) {
219+
arguments.push_back("-windows-sdk-version");
220+
arguments.push_back(inputArgs.MakeArgString(A->getValue()));
221+
}
222+
if (const Arg *A = inputArgs.getLastArg(options::OPT_visualc_tools_root)) {
223+
arguments.push_back("-visualc-tools-root");
224+
arguments.push_back(inputArgs.MakeArgString(A->getValue()));
225+
}
226+
if (const Arg *A = inputArgs.getLastArg(options::OPT_visualc_tools_version)) {
227+
arguments.push_back("-visualc-tools-version");
228+
arguments.push_back(inputArgs.MakeArgString(A->getValue()));
229+
}
230+
231+
214232
if (llvm::sys::Process::StandardErrHasColors()) {
215233
arguments.push_back("-color-diagnostics");
216234
}

lib/Frontend/CompilerInvocation.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,6 +1494,15 @@ static bool ParseSearchPathArgs(SearchPathOptions &Opts,
14941494
if (const Arg *A = Args.getLastArg(OPT_sdk))
14951495
Opts.setSDKPath(A->getValue());
14961496

1497+
if (const Arg *A = Args.getLastArg(OPT_windows_sdk_root))
1498+
Opts.setWinSDKRoot(A->getValue());
1499+
if (const Arg *A = Args.getLastArg(OPT_windows_sdk_version))
1500+
Opts.setWinSDKVersion(A->getValue());
1501+
if (const Arg *A = Args.getLastArg(OPT_visualc_tools_root))
1502+
Opts.setVCToolsRoot(A->getValue());
1503+
if (const Arg *A = Args.getLastArg(OPT_visualc_tools_version))
1504+
Opts.setVCToolsVersion(A->getValue());
1505+
14971506
if (const Arg *A = Args.getLastArg(OPT_resource_dir))
14981507
Opts.RuntimeResourcePath = A->getValue();
14991508

0 commit comments

Comments
 (0)