Skip to content

Commit 6858e17

Browse files
committed
[Runtimes][Overlay] 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 b5a87e0 commit 6858e17

File tree

2 files changed

+44
-56
lines changed

2 files changed

+44
-56
lines changed
Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,54 @@
1-
# Generate and install swift interface files
1+
i# Generate and install swift interface files
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
11-
if(SwiftOverlay_VARIANT_MODULE_TRIPLE)
12-
set(variant_module_tmp_dir "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftOverlay_VARIANT_MODULE_TRIPLE}")
13-
file(MAKE_DIRECTORY "${variant_module_tmp_dir}")
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/${SwiftCore_MODULE_TRIPLE}.swiftmodule>")
30+
if(SwiftCore_VARIANT_MODULE_TRIPLE)
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/${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftmodule>")
1633
endif()
34+
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.swiftmodule"
35+
DEPENDS ${target})
36+
target_sources(${target}
37+
INTERFACE
38+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.swiftmodule>)
1739

1840
# Generate textual swift interfaces is library-evolution is enabled
19-
if(SwiftOverlay_ENABLE_LIBRARY_EVOLUTION)
41+
if(SwiftCore_ENABLE_LIBRARY_EVOLUTION)
42+
target_compile_options(${target} PRIVATE
43+
$<$<COMPILE_LANGUAGE:Swift>:-emit-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.swiftinterface>
44+
$<$<COMPILE_LANGUAGE:Swift>:-emit-private-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.private.swiftinterface>)
45+
if(SwiftCore_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/${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftinterface>"
48+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-private-module-interface-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_VARIANT_MODULE_TRIPLE}.private.swiftinterface>")
49+
endif()
2050
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>
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(SwiftOverlay_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: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +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 "${SwiftOverlay_MODULE_TRIPLE}.swiftmodule"
7-
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
8-
if(SwiftOverlay_VARIANT_MODULE_TRIPLE)
9-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftOverlay_VARIANT_MODULE_TRIPLE}/${target}.swiftmodule"
10-
RENAME "${SwiftOverlay_VARIANT_MODULE_TRIPLE}.swiftmodule"
11-
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
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})
128
endif()
139

14-
# Install Swift interfaces if library-evolution is enabled
15-
if(SwiftOverlay_ENABLE_LIBRARY_EVOLUTION)
16-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftinterface"
17-
RENAME "${SwiftOverlay_MODULE_TRIPLE}.swiftinterface"
18-
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
19-
20-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.private.swiftinterface"
21-
RENAME "${SwiftOverlay_MODULE_TRIPLE}.private.swiftinterface"
22-
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
23-
24-
# Install catalyst interface files
25-
if(SwiftOverlay_VARIANT_MODULE_TRIPLE)
26-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftOverlay_VARIANT_MODULE_TRIPLE}/${target}.swiftinterface"
27-
RENAME "${SwiftOverlay_VARIANT_MODULE_TRIPLE}.swiftinterface"
28-
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
29-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftOverlay_VARIANT_MODULE_TRIPLE}/${target}.private.swiftinterface"
30-
RENAME "${SwiftOverlay_VARIANT_MODULE_TRIPLE}.private.swiftinterface"
31-
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
32-
endif()
33-
endif()
34-
35-
# Install Swift documentation interface files.
36-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftdoc"
37-
RENAME "${SwiftOverlay_MODULE_TRIPLE}.swiftdoc"
38-
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
10+
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swif\tmodule"
11+
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}"
3912
COMPONENT SwiftOverlay_development)
40-
if(SwiftOverlay_VARIANT_MODULE_TRIPLE)
41-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftOverlay_VARIANT_MODULE_TRIPLE}/${target}.swiftdoc"
42-
RENAME "${SwiftOverlay_VARIANT_MODULE_TRIPLE}.swiftdoc"
43-
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
44-
COMPONENT SwiftOverlay_development)
45-
endif()
46-
endfunction()
13+
endfunction()

0 commit comments

Comments
 (0)