Skip to content

Commit b834690

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 bf32bf5 commit b834690

File tree

3 files changed

+40
-53
lines changed

3 files changed

+40
-53
lines changed

Runtimes/Overlay/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11

22
cmake_minimum_required(VERSION 3.26...3.29)
3+
# TODO before requiring CMake 4.1 or later
4+
# and/or enforcing CMP0195, please check/update
5+
# the implementation of `emit_swift_interface`
6+
# in `EmitSwiftInterface.cmake`
7+
# to ensure it keeps laying down nested swiftmodule folders
38

49
set(CMAKE_C_VISIBILITY_PRESET "hidden")
510
set(CMAKE_CXX_VISIBILITY_PRESET "hidden")

Runtimes/Overlay/cmake/modules/EmitSwiftInterface.cmake

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,41 @@
88
function(emit_swift_interface target)
99
# Generate the target-variant binary swift module when performing zippered
1010
# 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}")
11+
# Clean this up once CMake has nested swiftmodules in the build directory:
12+
# https://gitlab.kitware.com/cmake/cmake/-/merge_requests/10664
13+
# https://cmake.org/cmake/help/git-stage/policy/CMP0195.html
14+
15+
# We can't expand the Swift_MODULE_NAME target property in a generator
16+
# expression or it will fail saying that the target doesn't exist.
17+
get_target_property(module_name ${target} Swift_MODULE_NAME)
18+
if(NOT module_name)
19+
set(module_name ${target})
20+
endif()
21+
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule")
22+
target_compile_options(${target} PRIVATE
23+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-module-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.swiftmodule>")
24+
if(SwiftCore_VARIANT_MODULE_TRIPLE)
1425
target_compile_options(${target} PRIVATE
15-
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-path ${variant_module_tmp_dir}/${target}.swiftmodule>")
26+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftmodule>")
1627
endif()
28+
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.swiftmodule"
29+
DEPENDS ${target})
30+
target_sources(${target}
31+
INTERFACE
32+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.swiftmodule>)
1733

1834
# Generate textual swift interfaces is library-evolution is enabled
19-
if(SwiftOverlay_ENABLE_LIBRARY_EVOLUTION)
35+
if(SwiftCore_ENABLE_LIBRARY_EVOLUTION)
36+
target_compile_options(${target} PRIVATE
37+
$<$<COMPILE_LANGUAGE:Swift>:-emit-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.swiftinterface>
38+
$<$<COMPILE_LANGUAGE:Swift>:-emit-private-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_MODULE_TRIPLE}.private.swiftinterface>)
39+
if(SwiftCore_VARIANT_MODULE_TRIPLE)
40+
target_compile_options(${target} PRIVATE
41+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-interface-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftinterface>"
42+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-private-module-interface-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftCore_VARIANT_MODULE_TRIPLE}.private.swiftinterface>")
43+
endif()
2044
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>
2345
$<$<COMPILE_LANGUAGE:Swift>:-library-level$<SEMICOLON>api>
2446
$<$<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()
3247
endif()
3348
endfunction()
Lines changed: 6 additions & 39 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()
4613
endfunction()

0 commit comments

Comments
 (0)