Skip to content

Commit 0d28592

Browse files
committed
Inject WinSDK module map using VFS
1 parent 92ce766 commit 0d28592

File tree

6 files changed

+121
-4
lines changed

6 files changed

+121
-4
lines changed

include/swift/AST/DiagnosticsClangImporter.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ ERROR(module_map_not_found, none, "module map file '%0' not found", (StringRef))
121121
WARNING(glibc_not_found, none,
122122
"glibc not found for '%0'; C stdlib may be unavailable",
123123
(StringRef))
124+
WARNING(windows_sdk_not_found, none,
125+
"Windows SDK not found for '%0'; Platform functionalities may be unavailable",
126+
(StringRef))
124127
WARNING(libstdcxx_not_found, none,
125128
"libstdc++ not found for '%0'; C++ stdlib may be unavailable",
126129
(StringRef))

lib/ClangImporter/ClangIncludePaths.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ getGlibcModuleMapPath(SearchPathOptions &Opts, const llvm::Triple &triple) {
8686
return getActualModuleMapPath("glibc.modulemap", Opts, triple);
8787
}
8888

89+
static Optional<Path>
90+
getWinSDKModuleMapPath(SearchPathOptions &Opts, const llvm::Triple &triple) {
91+
return getActualModuleMapPath("WinSDK.modulemap", Opts, triple);
92+
}
93+
8994
static Optional<Path>
9095
getLibStdCxxModuleMapPath(SearchPathOptions &opts, const llvm::Triple &triple) {
9196
return getActualModuleMapPath("libstdcxx.modulemap", opts, triple);
@@ -226,6 +231,45 @@ getGlibcFileMapping(ASTContext &ctx) {
226231
};
227232
}
228233

234+
static SmallVector<std::pair<std::string, std::string>, 2>
235+
getWinSDKFileMapping(ASTContext &ctx) {
236+
const llvm::Triple &triple = ctx.LangOpts.Target;
237+
238+
// Extract the Glibc path from Clang driver.
239+
auto clangDriver = createClangDriver(ctx);
240+
auto clangDriverArgs = createClangArgs(ctx, clangDriver);
241+
242+
llvm::opt::ArgStringList includeArgStrings;
243+
const auto &clangToolchain =
244+
clangDriver.getToolChain(clangDriverArgs, triple);
245+
clangToolchain.AddClangSystemIncludeArgs(clangDriverArgs, includeArgStrings);
246+
auto parsedIncludeArgs = parseClangDriverArgs(clangDriver, includeArgStrings);
247+
248+
// Find the include path that contains Windows.h header, which should be
249+
// located under %UniversalCRTSdkDir%\Include\%UCRTVersion%\um.
250+
Path winSDKDir;
251+
if (auto dir = findFirstIncludeDir(parsedIncludeArgs, {"Windows.h"})) {
252+
winSDKDir = dir.value();
253+
} else {
254+
ctx.Diags.diagnose(SourceLoc(), diag::windows_sdk_not_found, triple.str());
255+
return {};
256+
}
257+
258+
Path actualModuleMapPath;
259+
if (auto path = getWinSDKModuleMapPath(ctx.SearchPathOpts, triple))
260+
actualModuleMapPath = path.value();
261+
else
262+
// FIXME: Emit a warning of some kind.
263+
return {};
264+
265+
Path injectedModuleMapPath(winSDKDir);
266+
llvm::sys::path::append(injectedModuleMapPath, "module.modulemap");
267+
268+
return {
269+
{std::string(injectedModuleMapPath), std::string(actualModuleMapPath)},
270+
};
271+
}
272+
229273
static SmallVector<std::pair<std::string, std::string>, 2>
230274
getLibStdCxxFileMapping(ASTContext &ctx) {
231275
assert(ctx.LangOpts.EnableCXXInterop &&

stdlib/public/Windows/CMakeLists.txt

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,80 @@
1+
set(winsdk_modulemap_target_list)
2+
foreach(arch ${SWIFT_SDK_WINDOWS_ARCHITECTURES})
3+
set(arch_suffix "${SWIFT_SDK_WINDOWS_LIB_SUBDIR}-${arch}")
4+
set(arch_subdir "${SWIFT_SDK_WINDOWS_LIB_SUBDIR}/${arch}")
5+
6+
set(module_dir "${SWIFTLIB_DIR}/${arch_subdir}")
7+
set(module_dir_static "${SWIFTSTATICLIB_DIR}/${arch_subdir}")
8+
9+
set(winsdk_modulemap "winsdk.modulemap")
10+
set(winsdk_modulemap_out "${module_dir}/WinSDK.modulemap")
11+
set(winsdk_modulemap_out_static "${module_dir_static}/WinSDK.modulemap")
12+
13+
add_custom_command_target(
14+
copy_winsdk_modulemap
15+
COMMAND
16+
"${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir}
17+
COMMAND
18+
"${CMAKE_COMMAND}" "-E" "copy_if_different" "${CMAKE_CURRENT_SOURCE_DIR}/${winsdk_modulemap}" "${winsdk_modulemap_out}"
19+
OUTPUT ${winsdk_modulemap_out}
20+
DEPENDS ${winsdk_modulemap}
21+
COMMENT "Copying WinSDK modulemap to resources")
22+
list(APPEND winsdk_modulemap_target_list ${copy_winsdk_modulemap})
23+
add_dependencies(swift-stdlib-${arch_suffix} ${copy_winsdk_modulemap})
24+
25+
if(SWIFT_BUILD_STATIC_STDLIB)
26+
add_custom_command_target(
27+
copy_winsdk_modulemap_static
28+
COMMAND
29+
"${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir_static}
30+
COMMAND
31+
"${CMAKE_COMMAND}" "-E" "copy_if_different"
32+
"${winsdk_modulemap_out}" "${winsdk_modulemap_out_static}"
33+
OUTPUT ${winsdk_modulemap_out_static}
34+
DEPENDS ${copy_winsdk_modulemap}
35+
COMMENT "Copying WinSDK modulemap to static resources")
36+
list(APPEND winsdk_modulemap_target_list ${copy_winsdk_modulemap_static})
37+
add_dependencies(swift-stdlib-${arch_suffix} ${copy_winsdk_modulemap_static})
38+
endif()
39+
40+
swift_install_in_component(FILES "${winsdk_modulemap_out}"
41+
DESTINATION "lib/swift/${arch_subdir}"
42+
COMPONENT sdk-overlay)
43+
44+
if(SWIFT_BUILD_STATIC_STDLIB)
45+
swift_install_in_component(FILES "${winsdk_modulemap_out_static}"
46+
DESTINATION "lib/swift_static/${arch_subdir}"
47+
COMPONENT sdk-overlay)
48+
endif()
49+
50+
if(${BOOTSTRAPPING_MODE} MATCHES "BOOTSTRAPPING.*")
51+
foreach(bootstrapping "0" "1")
52+
get_bootstrapping_path(bootstrapping_dir ${module_dir} ${bootstrapping})
53+
set(winsdk_modulemap_out_bootstrapping "${bootstrapping_dir}/WinSDK.modulemap")
54+
55+
add_custom_command_target(unused_var
56+
COMMAND
57+
"${CMAKE_COMMAND}" "-E" "make_directory" "${bootstrapping_dir}"
58+
COMMAND
59+
"${CMAKE_COMMAND}" "-E" "copy_if_different"
60+
"${CMAKE_CURRENT_SOURCE_DIR}/${winsdk_modulemap}" "${winsdk_modulemap_out_bootstrapping}"
61+
62+
CUSTOM_TARGET_NAME "copy-winsdk-modulemap-bootstrapping${bootstrapping}"
63+
OUTPUT "${winsdk_modulemap_out_bootstrapping}"
64+
DEPENDS ${winsdk_modulemap}
65+
COMMENT "Copying WinSDK modulemap to resources for bootstrapping${bootstrapping}")
66+
endforeach()
67+
endif()
68+
endforeach()
69+
add_custom_target(winsdk-modulemap DEPENDS ${winsdk_modulemap_target_list})
70+
set_property(TARGET winsdk-modulemap PROPERTY FOLDER "Miscellaneous")
71+
add_dependencies(sdk-overlay winsdk-modulemap)
72+
173
add_swift_target_library(swiftWinSDK ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_SDK_OVERLAY
274
WinSDK.swift
375

476
SWIFT_COMPILE_FLAGS ${SWIFT_RUNTIME_SWIFT_COMPILE_FLAGS} ${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
577
LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}"
678
TARGET_SDKS WINDOWS
7-
INSTALL_IN_COMPONENT sdk-overlay)
8-
79+
INSTALL_IN_COMPONENT sdk-overlay
80+
DEPENDS winsdk-modulemap)

utils/build-windows-toolchain.bat

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,6 @@ cmake --build "%BuildRoot%\curl" --target install || (exit /b)
180180

181181
:: Prepare system modules
182182
copy /y "%SourceRoot%\swift\stdlib\public\Platform\ucrt.modulemap" "%UniversalCRTSdkDir%\Include\%UCRTVersion%\ucrt\module.modulemap" || (exit /b)
183-
copy /y "%SourceRoot%\swift\stdlib\public\Platform\winsdk.modulemap" "%UniversalCRTSdkDir%\Include\%UCRTVersion%\um\module.modulemap" || (exit /b)
184183
copy /y "%SourceRoot%\swift\stdlib\public\Platform\vcruntime.modulemap" "%VCToolsInstallDir%\include\module.modulemap" || (exit /b)
185184
copy /y "%SourceRoot%\swift\stdlib\public\Platform\vcruntime.apinotes" "%VCToolsInstallDir%\include\vcruntime.apinotes" || (exit /b)
186185

utils/build-windows.bat

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,6 @@ endlocal
168168
setlocal enableextensions enabledelayedexpansion
169169

170170
copy /y "%source_root%\swift\stdlib\public\Platform\ucrt.modulemap" "%UniversalCRTSdkDir%\Include\%UCRTVersion%\ucrt\module.modulemap" %exitOnError%
171-
copy /y "%source_root%\swift\stdlib\public\Platform\winsdk.modulemap" "%UniversalCRTSdkDir%\Include\%UCRTVersion%\um\module.modulemap" %exitOnError%
172171
copy /y "%source_root%\swift\stdlib\public\Platform\vcruntime.modulemap" "%VCToolsInstallDir%\include\module.modulemap" %exitOnError%
173172
copy /y "%source_root%\swift\stdlib\public\Platform\vcruntime.apinotes" "%VCToolsInstallDir%\include\vcruntime.apinotes" %exitOnError%
174173

0 commit comments

Comments
 (0)