diff --git a/docs/WindowsBuild.md b/docs/WindowsBuild.md index 01afd78f479ff..3b896fb373ef5 100644 --- a/docs/WindowsBuild.md +++ b/docs/WindowsBuild.md @@ -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 ``` diff --git a/include/swift/AST/DiagnosticsClangImporter.def b/include/swift/AST/DiagnosticsClangImporter.def index 722f677c5ba6b..af9a252784e98 100644 --- a/include/swift/AST/DiagnosticsClangImporter.def +++ b/include/swift/AST/DiagnosticsClangImporter.def @@ -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)) diff --git a/lib/ClangImporter/ClangIncludePaths.cpp b/lib/ClangImporter/ClangIncludePaths.cpp index e48720f6009b5..0e4a49703074d 100644 --- a/lib/ClangImporter/ClangIncludePaths.cpp +++ b/lib/ClangImporter/ClangIncludePaths.cpp @@ -86,6 +86,11 @@ getGlibcModuleMapPath(SearchPathOptions &Opts, const llvm::Triple &triple) { return getActualModuleMapPath("glibc.modulemap", Opts, triple); } +static Optional +getWinSDKModuleMapPath(SearchPathOptions &Opts, const llvm::Triple &triple) { + return getActualModuleMapPath("WinSDK.modulemap", Opts, triple); +} + static Optional getLibStdCxxModuleMapPath(SearchPathOptions &opts, const llvm::Triple &triple) { return getActualModuleMapPath("libstdcxx.modulemap", opts, triple); @@ -226,6 +231,45 @@ getGlibcFileMapping(ASTContext &ctx) { }; } +static SmallVector, 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, 2> getLibStdCxxFileMapping(ASTContext &ctx) { assert(ctx.LangOpts.EnableCXXInterop && diff --git a/stdlib/public/Windows/CMakeLists.txt b/stdlib/public/Windows/CMakeLists.txt index 65a2c8e9011a2..8f8b366af03b0 100644 --- a/stdlib/public/Windows/CMakeLists.txt +++ b/stdlib/public/Windows/CMakeLists.txt @@ -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) diff --git a/stdlib/public/Platform/winsdk.modulemap b/stdlib/public/Windows/winsdk.modulemap similarity index 100% rename from stdlib/public/Platform/winsdk.modulemap rename to stdlib/public/Windows/winsdk.modulemap diff --git a/utils/build-windows-toolchain.bat b/utils/build-windows-toolchain.bat index 1cd195a01b698..3b939223c37dc 100644 --- a/utils/build-windows-toolchain.bat +++ b/utils/build-windows-toolchain.bat @@ -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) diff --git a/utils/build-windows.bat b/utils/build-windows.bat index 83b90eed2c949..276f0d0bb6051 100644 --- a/utils/build-windows.bat +++ b/utils/build-windows.bat @@ -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%