Skip to content

[stdlib] Inject WinSDK module map using VFS #63042

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions docs/WindowsBuild.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,17 +98,15 @@ alternatively, see the ICU project for details on building ICU from source.

## One-time Setup (re-run on Visual Studio upgrades)

Set up the `ucrt`, `visualc`, and `WinSDK` modules by:
Set up the `ucrt` and `visualc` modules by:

- copying `ucrt.modulemap` located at `swift/stdlib/public/Platform/ucrt.modulemap` into
`${UniversalCRTSdkDir}/Include/${UCRTVersion}/ucrt` as `module.modulemap`
- copying `vcruntime.modulemap` located at `swift/stdlib/public/Platform/vcruntime.modulemap` into `${VCToolsInstallDir}/include` as `module.modulemap`
- copying `winsdk.modulemap` located at `swift/stdlib/public/Platform/winsdk.modulemap` into `${UniversalCRTSdkDir}/Include/${UCRTVersion}/um`
- and setup the `vcruntime.apinotes` located at `swift/stdlib/public/Platform/vcruntime.apinotes` into `${VCToolsInstallDir}/include` as `vcruntime.apinotes`

```cmd
mklink "%UniversalCRTSdkDir%\Include\%UCRTVersion%\ucrt\module.modulemap" S:\swift\stdlib\public\Platform\ucrt.modulemap
mklink "%UniversalCRTSdkDir%\Include\%UCRTVersion%\um\module.modulemap" S:\swift\stdlib\public\Platform\winsdk.modulemap
mklink "%VCToolsInstallDir%\include\module.modulemap" S:\swift\stdlib\public\Platform\vcruntime.modulemap
mklink "%VCToolsInstallDir%\include\vcruntime.apinotes" S:\swift\stdlib\public\Platform\vcruntime.apinotes
```
Expand Down
3 changes: 3 additions & 0 deletions include/swift/AST/DiagnosticsClangImporter.def
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,9 @@ ERROR(module_map_not_found, none, "module map file '%0' not found", (StringRef))
WARNING(glibc_not_found, none,
"glibc not found for '%0'; C stdlib may be unavailable",
(StringRef))
WARNING(windows_sdk_not_found, none,
"Windows SDK not found for '%0'; Platform functionalities may be unavailable",
(StringRef))
WARNING(libstdcxx_not_found, none,
"libstdc++ not found for '%0'; C++ stdlib may be unavailable",
(StringRef))
Expand Down
44 changes: 44 additions & 0 deletions lib/ClangImporter/ClangIncludePaths.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ getGlibcModuleMapPath(SearchPathOptions &Opts, const llvm::Triple &triple) {
return getActualModuleMapPath("glibc.modulemap", Opts, triple);
}

static Optional<Path>
getWinSDKModuleMapPath(SearchPathOptions &Opts, const llvm::Triple &triple) {
return getActualModuleMapPath("WinSDK.modulemap", Opts, triple);
}

static Optional<Path>
getLibStdCxxModuleMapPath(SearchPathOptions &opts, const llvm::Triple &triple) {
return getActualModuleMapPath("libstdcxx.modulemap", opts, triple);
Expand Down Expand Up @@ -226,6 +231,45 @@ getGlibcFileMapping(ASTContext &ctx) {
};
}

static SmallVector<std::pair<std::string, std::string>, 2>
getWinSDKFileMapping(ASTContext &ctx) {
const llvm::Triple &triple = ctx.LangOpts.Target;

// Extract Windows SDK path from Clang driver.
auto clangDriver = createClangDriver(ctx);
auto clangDriverArgs = createClangArgs(ctx, clangDriver);

llvm::opt::ArgStringList includeArgStrings;
const auto &clangToolchain =
clangDriver.getToolChain(clangDriverArgs, triple);
clangToolchain.AddClangSystemIncludeArgs(clangDriverArgs, includeArgStrings);
auto parsedIncludeArgs = parseClangDriverArgs(clangDriver, includeArgStrings);

// Find the include path that contains Windows.h header, which should be
// located under %UniversalCRTSdkDir%\Include\%UCRTVersion%\um.
Path winSDKDir;
if (auto dir = findFirstIncludeDir(parsedIncludeArgs, {"Windows.h"})) {
winSDKDir = dir.value();
} else {
ctx.Diags.diagnose(SourceLoc(), diag::windows_sdk_not_found, triple.str());
return {};
}

Path actualModuleMapPath;
if (auto path = getWinSDKModuleMapPath(ctx.SearchPathOpts, triple))
actualModuleMapPath = path.value();
else
// FIXME: Emit a warning of some kind.
return {};

Path injectedModuleMapPath(winSDKDir);
llvm::sys::path::append(injectedModuleMapPath, "module.modulemap");

return {
{std::string(injectedModuleMapPath), std::string(actualModuleMapPath)},
};
}

static SmallVector<std::pair<std::string, std::string>, 2>
getLibStdCxxFileMapping(ASTContext &ctx) {
assert(ctx.LangOpts.EnableCXXInterop &&
Expand Down
76 changes: 74 additions & 2 deletions stdlib/public/Windows/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,80 @@
set(winsdk_modulemap_target_list)
foreach(arch ${SWIFT_SDK_WINDOWS_ARCHITECTURES})
set(arch_suffix "${SWIFT_SDK_WINDOWS_LIB_SUBDIR}-${arch}")
set(arch_subdir "${SWIFT_SDK_WINDOWS_LIB_SUBDIR}/${arch}")

set(module_dir "${SWIFTLIB_DIR}/${arch_subdir}")
set(module_dir_static "${SWIFTSTATICLIB_DIR}/${arch_subdir}")

set(winsdk_modulemap "winsdk.modulemap")
set(winsdk_modulemap_out "${module_dir}/WinSDK.modulemap")
set(winsdk_modulemap_out_static "${module_dir_static}/WinSDK.modulemap")

add_custom_command_target(
copy_winsdk_modulemap
COMMAND
"${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir}
COMMAND
"${CMAKE_COMMAND}" "-E" "copy_if_different" "${CMAKE_CURRENT_SOURCE_DIR}/${winsdk_modulemap}" "${winsdk_modulemap_out}"
OUTPUT ${winsdk_modulemap_out}
DEPENDS ${winsdk_modulemap}
COMMENT "Copying WinSDK modulemap to resources")
list(APPEND winsdk_modulemap_target_list ${copy_winsdk_modulemap})
add_dependencies(swift-stdlib-${arch_suffix} ${copy_winsdk_modulemap})

if(SWIFT_BUILD_STATIC_STDLIB)
add_custom_command_target(
copy_winsdk_modulemap_static
COMMAND
"${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir_static}
COMMAND
"${CMAKE_COMMAND}" "-E" "copy_if_different"
"${winsdk_modulemap_out}" "${winsdk_modulemap_out_static}"
OUTPUT ${winsdk_modulemap_out_static}
DEPENDS ${copy_winsdk_modulemap}
COMMENT "Copying WinSDK modulemap to static resources")
list(APPEND winsdk_modulemap_target_list ${copy_winsdk_modulemap_static})
add_dependencies(swift-stdlib-${arch_suffix} ${copy_winsdk_modulemap_static})
endif()

swift_install_in_component(FILES "${winsdk_modulemap_out}"
DESTINATION "lib/swift/${arch_subdir}"
COMPONENT sdk-overlay)

if(SWIFT_BUILD_STATIC_STDLIB)
swift_install_in_component(FILES "${winsdk_modulemap_out_static}"
DESTINATION "lib/swift_static/${arch_subdir}"
COMPONENT sdk-overlay)
endif()

if(${BOOTSTRAPPING_MODE} MATCHES "BOOTSTRAPPING.*")
foreach(bootstrapping "0" "1")
get_bootstrapping_path(bootstrapping_dir ${module_dir} ${bootstrapping})
set(winsdk_modulemap_out_bootstrapping "${bootstrapping_dir}/WinSDK.modulemap")

add_custom_command_target(unused_var
COMMAND
"${CMAKE_COMMAND}" "-E" "make_directory" "${bootstrapping_dir}"
COMMAND
"${CMAKE_COMMAND}" "-E" "copy_if_different"
"${CMAKE_CURRENT_SOURCE_DIR}/${winsdk_modulemap}" "${winsdk_modulemap_out_bootstrapping}"

CUSTOM_TARGET_NAME "copy-winsdk-modulemap-bootstrapping${bootstrapping}"
OUTPUT "${winsdk_modulemap_out_bootstrapping}"
DEPENDS ${winsdk_modulemap}
COMMENT "Copying WinSDK modulemap to resources for bootstrapping${bootstrapping}")
endforeach()
endif()
endforeach()
add_custom_target(winsdk-modulemap DEPENDS ${winsdk_modulemap_target_list})
set_property(TARGET winsdk-modulemap PROPERTY FOLDER "Miscellaneous")
add_dependencies(sdk-overlay winsdk-modulemap)

add_swift_target_library(swiftWinSDK ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_SDK_OVERLAY
WinSDK.swift

SWIFT_COMPILE_FLAGS ${SWIFT_RUNTIME_SWIFT_COMPILE_FLAGS} ${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}"
TARGET_SDKS WINDOWS
INSTALL_IN_COMPONENT sdk-overlay)

INSTALL_IN_COMPONENT sdk-overlay
DEPENDS winsdk-modulemap)
1 change: 0 additions & 1 deletion utils/build-windows-toolchain.bat
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,6 @@ cmake --build "%BuildRoot%\curl" --target install || (exit /b)

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

Expand Down
1 change: 0 additions & 1 deletion utils/build-windows.bat
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,6 @@ endlocal
setlocal enableextensions enabledelayedexpansion

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

Expand Down