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()