summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-01-20 14:35:49 +0000
committerKitware Robot <kwrobot@kitware.com>2023-01-20 09:36:00 -0500
commit1d52007564f114a158e9f1612a39e6b33ca37934 (patch)
tree8c0d131227934d651219b4b869bfb5ee5b8d0840
parent8150831dfdc445316256c8acdbcf9fd29bced58d (diff)
parent4165eb3d0b21601977b26e8f8af5193c55169cee (diff)
downloadcmake-1d52007564f114a158e9f1612a39e6b33ca37934.tar.gz
Merge topic 'ninja-swift-exported-executables'
4165eb3d0b Ninja: Emit swiftmodule from executable with exports Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !8048
-rw-r--r--Modules/CMakeSwiftInformation.cmake6
-rw-r--r--Source/cmNinjaNormalTargetGenerator.cxx10
-rw-r--r--Tests/RunCMake/Swift/NoWorkToDo.cmake5
-rw-r--r--Tests/SwiftOnly/CMakeLists.txt11
-rw-r--r--Tests/SwiftOnly/SwiftPlugin/CMakeLists.txt5
-rw-r--r--Tests/SwiftOnly/SwiftPlugin/main.swift4
-rw-r--r--Tests/SwiftOnly/SwiftPlugin/plugin.swift3
7 files changed, 33 insertions, 11 deletions
diff --git a/Modules/CMakeSwiftInformation.cmake b/Modules/CMakeSwiftInformation.cmake
index 64c7519454..a75dfceea1 100644
--- a/Modules/CMakeSwiftInformation.cmake
+++ b/Modules/CMakeSwiftInformation.cmake
@@ -17,8 +17,6 @@ if(CMAKE_Swift_COMPILER_ID)
include(Platform/${CMAKE_EFFECTIVE_SYSTEM_NAME}-${CMAKE_Swift_COMPILER_ID}-Swift OPTIONAL)
endif()
-set(CMAKE_EXE_EXPORTS_Swift_FLAG "-emit-module -emit-module-path <SWIFT_MODULE> ${CMAKE_Swift_IMPLIB_LINKER_FLAGS}")
-
set(CMAKE_INCLUDE_FLAG_Swift "-I ")
# FIXME: Move compiler- and platform-specific flags to the above-included modules.
@@ -117,6 +115,10 @@ if(NOT CMAKE_Swift_LINK_EXECUTABLE)
set(CMAKE_Swift_LINK_EXECUTABLE "<CMAKE_Swift_COMPILER> -j ${CMAKE_Swift_NUM_THREADS} -num-threads ${CMAKE_Swift_NUM_THREADS} -emit-executable -o <TARGET> -emit-dependencies <DEFINES> <FLAGS> <INCLUDES> <SWIFT_SOURCES> <LINK_FLAGS> <LINK_LIBRARIES>")
endif()
+if(NOT CMAKE_Swift_LINK_EXECUTABLE_WITH_EXPORTS)
+ set(CMAKE_Swift_LINK_EXECUTABLE_WITH_EXPORTS "${CMAKE_Swift_LINK_EXECUTABLE} -emit-module -emit-module-path <SWIFT_MODULE> ${CMAKE_Swift_IMPLIB_LINKER_FLAGS}")
+endif()
+
if(NOT CMAKE_Swift_CREATE_STATIC_LIBRARY)
set(CMAKE_Swift_CREATE_STATIC_LIBRARY "<CMAKE_Swift_COMPILER> -j ${CMAKE_Swift_NUM_THREADS} -num-threads ${CMAKE_Swift_NUM_THREADS} -emit-library -static -o <TARGET> -module-name <SWIFT_MODULE_NAME> -module-link-name <SWIFT_LIBRARY_NAME> -emit-module -emit-module-path <SWIFT_MODULE> -emit-dependencies <DEFINES> <FLAGS> <INCLUDES> <SWIFT_SOURCES> <LINK_FLAGS> <LINK_LIBRARIES>")
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx
index b8f851f310..d481b64c6b 100644
--- a/Source/cmNinjaNormalTargetGenerator.cxx
+++ b/Source/cmNinjaNormalTargetGenerator.cxx
@@ -644,14 +644,7 @@ std::vector<std::string> cmNinjaNormalTargetGenerator::ComputeLinkCmd(
} break;
case cmStateEnums::SHARED_LIBRARY:
case cmStateEnums::MODULE_LIBRARY:
- break;
case cmStateEnums::EXECUTABLE:
- if (this->TargetLinkLanguage(config) == "Swift") {
- if (this->GeneratorTarget->IsExecutableWithExports()) {
- this->Makefile->GetDefExpandList("CMAKE_EXE_EXPORTS_Swift_FLAG",
- linkCmds);
- }
- }
break;
default:
assert(false && "Unexpected target type");
@@ -1112,7 +1105,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
this->GetObjectFilePath(source, config));
}
}
- if (targetType != cmStateEnums::EXECUTABLE) {
+ if (targetType != cmStateEnums::EXECUTABLE ||
+ gt->IsExecutableWithExports()) {
linkBuild.Outputs.push_back(vars["SWIFT_MODULE"]);
}
} else {
diff --git a/Tests/RunCMake/Swift/NoWorkToDo.cmake b/Tests/RunCMake/Swift/NoWorkToDo.cmake
index e86a8610df..51c2ff3878 100644
--- a/Tests/RunCMake/Swift/NoWorkToDo.cmake
+++ b/Tests/RunCMake/Swift/NoWorkToDo.cmake
@@ -1,2 +1,5 @@
enable_language(Swift)
-add_executable(hello hello.swift)
+add_executable(hello1 hello.swift)
+set_target_properties(hello1 PROPERTIES ENABLE_EXPORTS TRUE)
+
+add_executable(hello2 hello.swift)
diff --git a/Tests/SwiftOnly/CMakeLists.txt b/Tests/SwiftOnly/CMakeLists.txt
index fa8687d5df..13cf2b165c 100644
--- a/Tests/SwiftOnly/CMakeLists.txt
+++ b/Tests/SwiftOnly/CMakeLists.txt
@@ -43,3 +43,14 @@ target_link_libraries(N PUBLIC
# Dummy to make sure generation works with such targets.
add_library(SwiftIface INTERFACE)
target_link_libraries(SwiftOnly PRIVATE SwiftIface)
+
+# @_alwaysEmitIntoClient ensures that the function body is inserted into the
+# swiftmodule instead of as a symbol in the binary itself. I'm doing this to
+# avoid having to link the executable. There are some flags required in order to
+# link an executable into a library that I didn't see CMake emitting for Swift
+# on macOS. AEIC is the easiest workaround that still tests this functionality.
+# Unfortunately, AEIC was only added recently (~Swift 5.2), so we need to check
+# that it is available before using it.
+if(CMAKE_Swift_COMPILER_VERSION VERSION_GREATER_EQUAL 5.2)
+ add_subdirectory("SwiftPlugin")
+endif()
diff --git a/Tests/SwiftOnly/SwiftPlugin/CMakeLists.txt b/Tests/SwiftOnly/SwiftPlugin/CMakeLists.txt
new file mode 100644
index 0000000000..4069f16c9e
--- /dev/null
+++ b/Tests/SwiftOnly/SwiftPlugin/CMakeLists.txt
@@ -0,0 +1,5 @@
+add_executable(main main.swift)
+set_target_properties(main PROPERTIES ENABLE_EXPORTS TRUE)
+
+add_library(plugin plugin.swift)
+target_link_libraries(plugin PRIVATE main)
diff --git a/Tests/SwiftOnly/SwiftPlugin/main.swift b/Tests/SwiftOnly/SwiftPlugin/main.swift
new file mode 100644
index 0000000000..f5aac51403
--- /dev/null
+++ b/Tests/SwiftOnly/SwiftPlugin/main.swift
@@ -0,0 +1,4 @@
+@_alwaysEmitIntoClient
+public func exported() -> Int { 32 }
+
+print(exported())
diff --git a/Tests/SwiftOnly/SwiftPlugin/plugin.swift b/Tests/SwiftOnly/SwiftPlugin/plugin.swift
new file mode 100644
index 0000000000..e84f248d0c
--- /dev/null
+++ b/Tests/SwiftOnly/SwiftPlugin/plugin.swift
@@ -0,0 +1,3 @@
+import main
+
+public func importing() -> Int { main.exported() + 1 }