Skip to content

Commit 73cafeb

Browse files
committed
Driver: introduce additional Windows controls
This adds the following four new options: - `-windows-sdk-root` - `-windows-sdk-version` - `-visualc-tools-root` - `-visualc-tools-version` Together these options make one the master of Windows SDK selection for the Swift compilation. This is important as now that the injection is no longer done by the user, we need to ensure that we have enough control over the paths so that the synthesized overlay is going to map the files to the proper location.
1 parent 342e5f6 commit 73cafeb

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
@@ -1461,6 +1461,15 @@ static bool ParseSearchPathArgs(SearchPathOptions &Opts,
14611461
if (const Arg *A = Args.getLastArg(OPT_sdk))
14621462
Opts.setSDKPath(A->getValue());
14631463

1464+
if (const Arg *A = Args.getLastArg(OPT_windows_sdk_root))
1465+
Opts.setWinSDKRoot(A->getValue());
1466+
if (const Arg *A = Args.getLastArg(OPT_windows_sdk_version))
1467+
Opts.setWinSDKVersion(A->getValue());
1468+
if (const Arg *A = Args.getLastArg(OPT_visualc_tools_root))
1469+
Opts.setVCToolsRoot(A->getValue());
1470+
if (const Arg *A = Args.getLastArg(OPT_visualc_tools_version))
1471+
Opts.setVCToolsVersion(A->getValue());
1472+
14641473
if (const Arg *A = Args.getLastArg(OPT_resource_dir))
14651474
Opts.RuntimeResourcePath = A->getValue();
14661475

0 commit comments

Comments
 (0)