Skip to content

Commit 33f228a

Browse files
committed
[Runtimes][Supplemental] lay down nested swift modules ahead of CMake 4.1
This is needed in order to build target variants properly with a SwiftDriver that has swiftlang/swift-driver#1856 Addresses rdar://154410676
1 parent 6858e17 commit 33f228a

File tree

2 files changed

+40
-57
lines changed

2 files changed

+40
-57
lines changed

Runtimes/Supplemental/cmake/modules/EmitSwiftInterface.cmake

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,53 @@
22

33
# TODO: CMake should learn how to model library evolution and generate this
44
# stuff automatically.
5-
5+
if(POLICY CMP0195)
6+
message(AUTHOR_WARNING [=[
7+
This version of CMake supports the Swift module directory structure
8+
Please consider checking the implementation of `emit_swift_interface``
9+
to ensure it behaves as expected
10+
]=])
11+
endif()
612

713
# Generate a swift interface file for the target if library evolution is enabled
814
function(emit_swift_interface target)
915
# Generate the target-variant binary swift module when performing zippered
1016
# build
17+
# Clean this up once CMake has nested swiftmodules in the build directory:
18+
# https://gitlab.kitware.com/cmake/cmake/-/merge_requests/10664
19+
# https://cmake.org/cmake/help/git-stage/policy/CMP0195.html
20+
21+
# We can't expand the Swift_MODULE_NAME target property in a generator
22+
# expression or it will fail saying that the target doesn't exist.
23+
get_target_property(module_name ${target} Swift_MODULE_NAME)
24+
if(NOT module_name)
25+
set(module_name ${target})
26+
endif()
27+
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule")
28+
target_compile_options(${target} PRIVATE
29+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-module-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_MODULE_TRIPLE}.swiftmodule>")
1130
if(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE)
12-
set(variant_module_tmp_dir "${CMAKE_CURRENT_BINARY_DIR}/${target}-${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}")
13-
file(MAKE_DIRECTORY "${variant_module_tmp_dir}")
1431
target_compile_options(${target} PRIVATE
15-
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-path ${variant_module_tmp_dir}/${target}.swiftmodule>")
32+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.swiftmodule>")
1633
endif()
34+
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_MODULE_TRIPLE}.swiftmodule"
35+
DEPENDS ${target})
36+
target_sources(${target}
37+
INTERFACE
38+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_MODULE_TRIPLE}.swiftmodule>)
1739

1840
# Generate textual swift interfaces is library-evolution is enabled
1941
if(${PROJECT_NAME}_ENABLE_LIBRARY_EVOLUTION)
2042
target_compile_options(${target} PRIVATE
21-
$<$<COMPILE_LANGUAGE:Swift>:-emit-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftinterface>
22-
$<$<COMPILE_LANGUAGE:Swift>:-emit-private-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.private.swiftinterface>
43+
$<$<COMPILE_LANGUAGE:Swift>:-emit-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_MODULE_TRIPLE}.swiftinterface>
44+
$<$<COMPILE_LANGUAGE:Swift>:-emit-private-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_MODULE_TRIPLE}.private.swiftinterface>)
45+
if(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE)
46+
target_compile_options(${target} PRIVATE
47+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-interface-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.swiftinterface>"
48+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-private-module-interface-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.private.swiftinterface>")
49+
endif()
50+
target_compile_options(${target} PRIVATE
2351
$<$<COMPILE_LANGUAGE:Swift>:-library-level$<SEMICOLON>api>
2452
$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend$<SEMICOLON>-require-explicit-availability=ignore>)
25-
26-
# Emit catalyst swiftmodules and interfaces
27-
if(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE)
28-
target_compile_options(${target} PRIVATE
29-
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-interface-path ${variant_module_tmp_dir}/${target}.swiftinterface>"
30-
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-private-module-interface-path ${variant_module_tmp_dir}/${target}.private.swiftinterface>")
31-
endif()
3253
endif()
3354
endfunction()
Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,13 @@
11

22
# Install the generated swift interface files for the target.
33
function(install_swift_interface target)
4-
# Install binary swift modules
5-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
6-
RENAME "${${PROJECT_NAME}_MODULE_TRIPLE}.swiftmodule"
7-
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
8-
COMPONENT ${PROJECT_NAME}_development)
9-
if(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE)
10-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}/${target}.swiftmodule"
11-
RENAME "${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.swiftmodule"
12-
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
13-
COMPONENT ${PROJECT_NAME}_development)
4+
# Swiftmodules are already in the directory structure
5+
get_target_property(module_name ${target} Swift_MODULE_NAME)
6+
if(NOT module_name)
7+
set(module_name ${target})
148
endif()
159

16-
# Install Swift interfaces if library-evolution is enabled
17-
if(${PROJECT_NAME}_ENABLE_LIBRARY_EVOLUTION)
18-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftinterface"
19-
RENAME "${${PROJECT_NAME}_MODULE_TRIPLE}.swiftinterface"
20-
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
21-
COMPONENT ${PROJECT_NAME}_development)
22-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.private.swiftinterface"
23-
RENAME "${${PROJECT_NAME}_MODULE_TRIPLE}.private.swiftinterface"
24-
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
25-
COMPONENT ${PROJECT_NAME}_development)
26-
27-
# Install catalyst interface files
28-
if(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE)
29-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}/${target}.swiftinterface"
30-
RENAME "${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.swiftinterface"
31-
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
32-
COMPONENT ${PROJECT_NAME}_development)
33-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}/${target}.private.swiftinterface"
34-
RENAME "${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.private.swiftinterface"
35-
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
36-
COMPONENT ${PROJECT_NAME}_development)
37-
endif()
38-
endif()
39-
40-
# Install Swift documentation interface files.
41-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftdoc"
42-
RENAME "${${PROJECT_NAME}_MODULE_TRIPLE}.swiftdoc"
43-
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
10+
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule"
11+
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}"
4412
COMPONENT ${PROJECT_NAME}_development)
45-
if(SwiftCore_VARIANT_MODULE_TRIPLE)
46-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}/${target}.swiftdoc"
47-
RENAME "${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.swiftdoc"
48-
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
49-
COMPONENT ${PROJECT_NAME}_development)
50-
endif()
5113
endfunction()

0 commit comments

Comments
 (0)