Skip to content

Commit 5246be5

Browse files
authored
Merge pull request #82571 from edymtt/edymtt/nested-swiftmodule-structure-before-cmake-4.1
[Runtimes] lay down nested swift modules ahead of CMake 4.1
2 parents 83d7dbb + 111cfe2 commit 5246be5

File tree

11 files changed

+124
-163
lines changed

11 files changed

+124
-163
lines changed

Runtimes/Core/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
# Install *.abi.json, swiftdoc, and swiftsourceinfo
3131

3232
cmake_minimum_required(VERSION 3.29)
33+
# TODO before requiring CMake 4.1 or later
34+
# and/or enforcing CMP0195, please check/update
35+
# the implementation of `emit_swift_interface`
36+
# in `EmitSwiftInterface.cmake`
37+
# to ensure it keeps laying down nested swiftmodule folders
3338

3439
set(CMAKE_C_VISIBILITY_PRESET "hidden")
3540
set(CMAKE_CXX_VISIBILITY_PRESET "hidden")

Runtimes/Core/cmake/modules/EmitSwiftInterface.cmake

Lines changed: 27 additions & 12 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+
# 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>")
1124
if(SwiftCore_VARIANT_MODULE_TRIPLE)
12-
set(variant_module_tmp_dir "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftCore_VARIANT_MODULE_TRIPLE}")
13-
file(MAKE_DIRECTORY "${variant_module_tmp_dir}")
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
1935
if(SwiftCore_ENABLE_LIBRARY_EVOLUTION)
2036
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>
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()
44+
target_compile_options(${target} PRIVATE
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(SwiftCore_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 & 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 "${SwiftCore_MODULE_TRIPLE}.swiftmodule"
7-
DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
8-
COMPONENT SwiftCore_development)
9-
if(SwiftCore_VARIANT_MODULE_TRIPLE)
10-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftCore_VARIANT_MODULE_TRIPLE}/${target}.swiftmodule"
11-
RENAME "${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftmodule"
12-
DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
13-
COMPONENT SwiftCore_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(SwiftCore_ENABLE_LIBRARY_EVOLUTION)
18-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftinterface"
19-
RENAME "${SwiftCore_MODULE_TRIPLE}.swiftinterface"
20-
DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
21-
COMPONENT SwiftCore_development)
22-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.private.swiftinterface"
23-
RENAME "${SwiftCore_MODULE_TRIPLE}.private.swiftinterface"
24-
DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
25-
COMPONENT SwiftCore_development)
26-
27-
# Install catalyst interface files
28-
if(SwiftCore_VARIANT_MODULE_TRIPLE)
29-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftCore_VARIANT_MODULE_TRIPLE}/${target}.swiftinterface"
30-
RENAME "${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftinterface"
31-
DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
32-
COMPONENT SwiftCore_development)
33-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftCore_VARIANT_MODULE_TRIPLE}/${target}.private.swiftinterface"
34-
RENAME "${SwiftCore_VARIANT_MODULE_TRIPLE}.private.swiftinterface"
35-
DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
36-
COMPONENT SwiftCore_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 "${SwiftCore_MODULE_TRIPLE}.swiftdoc"
43-
DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
10+
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule"
11+
DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}"
4412
COMPONENT SwiftCore_development)
45-
if(SwiftCore_VARIANT_MODULE_TRIPLE)
46-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftCore_VARIANT_MODULE_TRIPLE}/${target}.swiftdoc"
47-
RENAME "${SwiftCore_VARIANT_MODULE_TRIPLE}.swiftdoc"
48-
DESTINATION "${SwiftCore_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
49-
COMPONENT SwiftCore_development)
50-
endif()
5113
endfunction()

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: 27 additions & 12 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+
# 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/${SwiftOverlay_MODULE_TRIPLE}.swiftmodule>")
1124
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}")
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/${SwiftOverlay_VARIANT_MODULE_TRIPLE}.swiftmodule>")
1627
endif()
28+
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftOverlay_MODULE_TRIPLE}.swiftmodule"
29+
DEPENDS ${target})
30+
target_sources(${target}
31+
INTERFACE
32+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftOverlay_MODULE_TRIPLE}.swiftmodule>)
1733

1834
# Generate textual swift interfaces is library-evolution is enabled
1935
if(SwiftOverlay_ENABLE_LIBRARY_EVOLUTION)
2036
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>
37+
$<$<COMPILE_LANGUAGE:Swift>:-emit-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftOverlay_MODULE_TRIPLE}.swiftinterface>
38+
$<$<COMPILE_LANGUAGE:Swift>:-emit-private-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftOverlay_MODULE_TRIPLE}.private.swiftinterface>)
39+
if(SwiftOverlay_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/${SwiftOverlay_VARIANT_MODULE_TRIPLE}.swiftinterface>"
42+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-private-module-interface-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${SwiftOverlay_VARIANT_MODULE_TRIPLE}.private.swiftinterface>")
43+
endif()
44+
target_compile_options(${target} PRIVATE
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}.swiftmodule"
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()

Runtimes/Supplemental/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
cmake_minimum_required(VERSION 3.29)
2+
# TODO before requiring CMake 4.1 or later
3+
# and/or enforcing CMP0195, please check/update
4+
# the implementation of `emit_swift_interface`
5+
# in `EmitSwiftInterface.cmake`
6+
# to ensure it keeps laying down nested swiftmodule folders
27

38
project(SwiftRuntime LANGUAGES Swift C CXX)
49

Runtimes/Supplemental/StringProcessing/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
cmake_minimum_required(VERSION 3.29)
2+
# TODO before requiring CMake 4.1 or later
3+
# and/or enforcing CMP0195, please check/update
4+
# the implementation of `emit_swift_interface`
5+
# in `EmitSwiftInterface.cmake`
6+
# to ensure it keeps laying down nested swiftmodule folders
27

38
if(POLICY CMP0157 AND CMAKE_Swift_COMPILER_USE_OLD_DRIVER)
49
cmake_policy(SET CMP0157 OLD)

Runtimes/Supplemental/Synchronization/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
cmake_minimum_required(VERSION 3.29)
2+
# TODO before requiring CMake 4.1 or later
3+
# and/or enforcing CMP0195, please check/update
4+
# the implementation of `emit_swift_interface`
5+
# in `EmitSwiftInterface.cmake`
6+
# to ensure it keeps laying down nested swiftmodule folders
27

38
if(POLICY CMP0157 AND CMAKE_Swift_COMPILER_USE_OLD_DRIVER)
49
cmake_policy(SET CMP0157 OLD)

Runtimes/Supplemental/cmake/modules/EmitSwiftInterface.cmake

Lines changed: 27 additions & 12 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+
# 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/${${PROJECT_NAME}_MODULE_TRIPLE}.swiftmodule>")
1124
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}")
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/${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.swiftmodule>")
1627
endif()
28+
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_MODULE_TRIPLE}.swiftmodule"
29+
DEPENDS ${target})
30+
target_sources(${target}
31+
INTERFACE
32+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_MODULE_TRIPLE}.swiftmodule>)
1733

1834
# Generate textual swift interfaces is library-evolution is enabled
1935
if(${PROJECT_NAME}_ENABLE_LIBRARY_EVOLUTION)
2036
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>
37+
$<$<COMPILE_LANGUAGE:Swift>:-emit-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_MODULE_TRIPLE}.swiftinterface>
38+
$<$<COMPILE_LANGUAGE:Swift>:-emit-private-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_MODULE_TRIPLE}.private.swiftinterface>)
39+
if(${PROJECT_NAME}_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/${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.swiftinterface>"
42+
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-private-module-interface-path ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.swiftmodule/${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.private.swiftinterface>")
43+
endif()
44+
target_compile_options(${target} PRIVATE
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(${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()
3247
endif()
3348
endfunction()

0 commit comments

Comments
 (0)