From cc0c96f113f323fd6d16319626538642ef6f8c04 Mon Sep 17 00:00:00 2001 From: Evan Wilde Date: Wed, 16 Apr 2025 21:19:59 -0700 Subject: [PATCH] CMake: SwiftCore: Directory Swift Modules The catalyst support in the driver requires that the swiftmodules for the catalyst slice live in the swiftmodule directory. CMake currently doesn't do this natively so this patch works around it by specifying the module path explicitly. The use of an empty custom command is used to hook up the dependency graph on the specific target swiftmodule files correctly. This is only needed for catalyst builds that this time so limit the affect of this change to instances where we are building zippered catalyst binaries. The nested structure also greatly simplifies the installation story. We simply need to copy the entire swiftmodule directory into the install location. --- .../cmake/modules/EmitSwiftInterface.cmake | 81 +++++++++++-------- 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/Runtimes/Core/cmake/modules/EmitSwiftInterface.cmake b/Runtimes/Core/cmake/modules/EmitSwiftInterface.cmake index 88cf2427a68f5..f24190e637184 100644 --- a/Runtimes/Core/cmake/modules/EmitSwiftInterface.cmake +++ b/Runtimes/Core/cmake/modules/EmitSwiftInterface.cmake @@ -9,63 +9,74 @@ function(emit_swift_interface target) # Generate the target-variant binary swift module when performing zippered # build if(SwiftCore_VARIANT_MODULE_TRIPLE) - set(variant_module_tmp_dir "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftCore_VARIANT_MODULE_TRIPLE}") - file(MAKE_DIRECTORY "${variant_module_tmp_dir}") + # Clean this up once CMake has nested swiftmodules in the build directory: + # https://gitlab.kitware.com/cmake/cmake/-/merge_requests/10664 + + # We can't expand the Swift_MODULE_NAME target property in a generator + # expression or it will fail saying that the target doesn't exist. + get_target_property(module_name ${target} Swift_MODULE_NAME) + if(NOT module_name) + set(module_name ${target}) + endif() target_compile_options(${target} PRIVATE - "$<$:SHELL:-emit-variant-module-path ${variant_module_tmp_dir}/${target}.swiftmodule>") + "$<$:SHELL:-emit-module-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.swiftmodule>" + "$<$:SHELL:-emit-variant-module-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftmodule>") + add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.swiftmodule" + DEPENDS ${target}) + target_sources(${target} + INTERFACE + $) endif() # Generate textual swift interfaces is library-evolution is enabled if(SwiftCore_ENABLE_LIBRARY_EVOLUTION) + # Emit catalyst swiftmodules and interfaces + if(SwiftCore_VARIANT_MODULE_TRIPLE) + target_compile_options(${target} PRIVATE + $<$:-emit-module-interface-path$${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.swiftinterface> + $<$:-emit-private-module-interface-path$${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.private.swiftinterface> + "$<$:SHELL:-emit-variant-module-interface-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftinterface>" + "$<$:SHELL:-emit-variant-private-module-interface-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_VARIANT_MODULE_TRIPLE}.private.swiftinterface>") + else() + target_compile_options(${target} PRIVATE + $<$:-emit-module-interface-path$${CMAKE_CURRENT_BINARY_DIR}/$.swiftinterface> + $<$:-emit-private-module-interface-path$${CMAKE_CURRENT_BINARY_DIR}/$.private.swiftinterface>) + endif() target_compile_options(${target} PRIVATE - $<$:-emit-module-interface-path$${CMAKE_CURRENT_BINARY_DIR}/$.swiftinterface> - $<$:-emit-private-module-interface-path$${CMAKE_CURRENT_BINARY_DIR}/$.private.swiftinterface> $<$:-library-level$api> $<$:-Xfrontend$-require-explicit-availability=ignore>) - - # Emit catalyst swiftmodules and interfaces - if(SwiftCore_VARIANT_MODULE_TRIPLE) - target_compile_options(${target} PRIVATE - "$<$:SHELL:-emit-variant-module-interface-path ${variant_module_tmp_dir}/${target}.swiftinterface>" - "$<$:SHELL:-emit-variant-private-module-interface-path ${variant_module_tmp_dir}/${target}.private.swiftinterface>") - endif() endif() endfunction() # Install the generated swift interface file for the target if library evolution # is enabled. function(install_swift_interface target) - # Install binary swift modules - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$.swiftmodule" - RENAME "${SwiftCore_MODULE_TRIPLE}.swiftmodule" - DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$.swiftmodule" - COMPONENT SwiftCore_development) if(SwiftCore_VARIANT_MODULE_TRIPLE) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftCore_VARIANT_MODULE_TRIPLE}/${target}.swiftmodule" - RENAME "${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftmodule" - DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$.swiftmodule" - COMPONENT SwiftCore_development) - endif() + # Swiftmodules are already in the directory structure if we are doing a + # catalyst build. Just copy the entire directory. + get_target_property(module_name ${target} Swift_MODULE_NAME) + if(NOT module_name) + set(module_name ${target}) + endif() - # Install Swift interfaces if library-evolution is enabled - if(SwiftCore_ENABLE_LIBRARY_EVOLUTION) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$.swiftinterface" - RENAME "${SwiftCore_MODULE_TRIPLE}.swiftinterface" - DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$.swiftmodule" + install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule" + DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}" COMPONENT SwiftCore_development) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$.private.swiftinterface" - RENAME "${SwiftCore_MODULE_TRIPLE}.private.swiftinterface" + else() + # Install binary swift modules + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$.swiftmodule" + RENAME "${SwiftCore_MODULE_TRIPLE}.swiftmodule" DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$.swiftmodule" COMPONENT SwiftCore_development) - # Install catalyst interface files - if(SwiftCore_VARIANT_MODULE_TRIPLE) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftCore_VARIANT_MODULE_TRIPLE}/${target}.swiftinterface" - RENAME "${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftinterface" + # Install Swift interfaces if library-evolution is enabled + if(SwiftCore_ENABLE_LIBRARY_EVOLUTION) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$.swiftinterface" + RENAME "${SwiftCore_MODULE_TRIPLE}.swiftinterface" DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$.swiftmodule" COMPONENT SwiftCore_development) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftCore_VARIANT_MODULE_TRIPLE}/${target}.private.swiftinterface" - RENAME "${SwiftCore_VARIANT_MODULE_TRIPLE}.private.swiftinterface" + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$.private.swiftinterface" + RENAME "${SwiftCore_MODULE_TRIPLE}.private.swiftinterface" DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$.swiftmodule" COMPONENT SwiftCore_development) endif()