From 44b417fdc7505ae696b32fd33ac3f969b92b03cd Mon Sep 17 00:00:00 2001 From: Stuart Montgomery Date: Wed, 10 Jul 2024 09:17:50 -0500 Subject: [PATCH 1/4] Configure CMake build to install content into toolchain --- CMakeLists.txt | 8 +++ Sources/CMakeLists.txt | 23 +++++++- Sources/Testing/CMakeLists.txt | 10 +++- Sources/TestingMacros/CMakeLists.txt | 7 +++ Sources/_TestingInternals/CMakeLists.txt | 2 + cmake/modules/SwiftModuleInstallation.cmake | 64 +++++++++++++++++++++ 6 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 cmake/modules/SwiftModuleInstallation.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 15fe3c1f0..b2f757018 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,4 +28,12 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_Swift_LANGUAGE_VERSION 6) set(CMAKE_Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/swift) +if(NOT SWIFT_SYSTEM_NAME) + if(CMAKE_SYSTEM_NAME STREQUAL Darwin) + set(SWIFT_SYSTEM_NAME macosx) + else() + set(SWIFT_SYSTEM_NAME "$") + endif() +endif() + add_subdirectory(Sources) diff --git a/Sources/CMakeLists.txt b/Sources/CMakeLists.txt index b9828e5da..76b50eb14 100644 --- a/Sources/CMakeLists.txt +++ b/Sources/CMakeLists.txt @@ -11,6 +11,15 @@ include(ExternalProject) if(NOT SwiftTesting_MACRO_MAKE_PROGRAM) set(SwiftTesting_MACRO_MAKE_PROGRAM ${CMAKE_MAKE_PROGRAM}) endif() +if(NOT SwiftTesting_MACRO_Swift_COMPILER) + set(SwiftTesting_MACRO_Swift_COMPILER ${CMAKE_Swift_COMPILER}) +endif() +if(NOT SwiftTesting_MACRO_AR) + set(SwiftTesting_MACRO_AR ${CMAKE_AR}) +endif() +if(NOT SwiftTesting_MACRO_RANLIB) + set(SwiftTesting_MACRO_RANLIB ${CMAKE_RANLIB}) +endif() find_package(SwiftSyntax CONFIG GLOBAL) if(SwiftSyntax_FOUND) @@ -23,13 +32,25 @@ ExternalProject_Add(TestingMacros PREFIX "tm" SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/TestingMacros" CMAKE_ARGS + -DCMAKE_Swift_COMPILER=${SwiftTesting_MACRO_Swift_COMPILER} + -DCMAKE_AR=${SwiftTesting_MACRO_AR} + -DCMAKE_RANLIB=${SwiftTesting_MACRO_RANLIB} -DCMAKE_MAKE_PROGRAM=${SwiftTesting_MACRO_MAKE_PROGRAM} -DSwiftTesting_BuildMacrosAsExecutables=${SwiftTesting_BuildMacrosAsExecutables} -DSwiftSyntax_DIR=${SwiftSyntax_DIR} - INSTALL_COMMAND "") + -DCMAKE_INSTALL_PREFIX=) ExternalProject_Get_Property(TestingMacros BINARY_DIR) +ExternalProject_Get_Property(TestingMacros INSTALL_DIR) include(AvailabilityDefinitions) include(CompilerSettings) add_subdirectory(_TestingInternals) add_subdirectory(Testing) + +if(SwiftTesting_BuildMacrosAsExecutables) + install(PROGRAMS "${INSTALL_DIR}/lib/libTestingMacros.dylib" + # TODO: Finalize the install path + ARCHIVE DESTINATION lib/swift/host/plugins + LIBRARY DESTINATION lib/swift/host/plugins + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() diff --git a/Sources/Testing/CMakeLists.txt b/Sources/Testing/CMakeLists.txt index 2a0c4014b..f813cc0e9 100644 --- a/Sources/Testing/CMakeLists.txt +++ b/Sources/Testing/CMakeLists.txt @@ -97,7 +97,8 @@ target_link_libraries(Testing PRIVATE add_dependencies(Testing TestingMacros) target_compile_options(Testing PRIVATE - -enable-library-evolution) + -enable-library-evolution + -emit-module-interface -emit-module-interface-path $/Testing.swiftinterface) if(SwiftTesting_BuildMacrosAsExecutables) if(CMAKE_HOST_WIN32) @@ -110,3 +111,10 @@ else() target_compile_options(Testing PUBLIC "SHELL:$<$:-plugin-path ${BINARY_DIR}>") endif() + +# TODO: @rpath-relative install name +# This may or may not involve the `-(no-)toolchain-stdlib-rpath` Swift flag. + +include(SwiftModuleInstallation) +# TODO: Finalize the install path +_swift_testing_install_target(Testing) diff --git a/Sources/TestingMacros/CMakeLists.txt b/Sources/TestingMacros/CMakeLists.txt index d4a40a886..390ba959c 100644 --- a/Sources/TestingMacros/CMakeLists.txt +++ b/Sources/TestingMacros/CMakeLists.txt @@ -58,6 +58,13 @@ if(SwiftTesting_BuildMacrosAsExecutables) target_compile_definitions(TestingMacros PRIVATE SWT_NO_LIBRARY_MACRO_PLUGINS) else() add_library(TestingMacros SHARED) + + # Install the macro plugin to the default location. + # + # This is not the plugin's actual, final install location -- it's only + # relative to this external project's install dir. The final location is + # determined by the "outer" project. + install(TARGETS TestingMacros DESTINATION "") endif() target_sources(TestingMacros PRIVATE diff --git a/Sources/_TestingInternals/CMakeLists.txt b/Sources/_TestingInternals/CMakeLists.txt index 148e89fa4..42c27932e 100644 --- a/Sources/_TestingInternals/CMakeLists.txt +++ b/Sources/_TestingInternals/CMakeLists.txt @@ -6,6 +6,8 @@ # See http://swift.org/LICENSE.txt for license information # See http://swift.org/CONTRIBUTORS.txt for Swift project authors +set(CMAKE_CXX_SCAN_FOR_MODULES 0) + include(LibraryVersion) add_library(_TestingInternals STATIC Discovery.cpp diff --git a/cmake/modules/SwiftModuleInstallation.cmake b/cmake/modules/SwiftModuleInstallation.cmake new file mode 100644 index 000000000..f361034f5 --- /dev/null +++ b/cmake/modules/SwiftModuleInstallation.cmake @@ -0,0 +1,64 @@ +# This source file is part of the Swift.org open source project +# +# Copyright (c) 2024 Apple Inc. and the Swift project authors +# Licensed under Apache License v2.0 with Runtime Library Exception +# +# See http://swift.org/LICENSE.txt for license information +# See http://swift.org/CONTRIBUTORS.txt for Swift project authors + +# Returns the os name in a variable +# +# Usage: +# get_swift_host_os(result_var_name) +# +# +# Sets ${result_var_name} with the converted OS name derived from +# CMAKE_SYSTEM_NAME. +function(get_swift_host_os result_var_name) + set(${result_var_name} ${SWIFT_SYSTEM_NAME} PARENT_SCOPE) +endfunction() + +function(_swift_testing_install_target module) + get_swift_host_os(swift_os) + get_target_property(type ${module} TYPE) + + if(type STREQUAL STATIC_LIBRARY) + set(swift swift_static) + else() + set(swift swift) + endif() + + install(TARGETS ${module} + ARCHIVE DESTINATION lib/${swift}/${swift_os} + LIBRARY DESTINATION lib/${swift}/${swift_os} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + if(type STREQUAL EXECUTABLE) + return() + endif() + + get_target_property(module_name ${module} Swift_MODULE_NAME) + if(NOT module_name) + set(module_name ${module}) + endif() + + if(NOT SwiftTesting_MODULE_TRIPLE) + set(module_triple_command "${CMAKE_Swift_COMPILER}" -print-target-info) + if(CMAKE_Swift_COMPILER_TARGET) + list(APPEND module_triple_command -target ${CMAKE_Swift_COMPILER_TARGET}) + endif() + execute_process(COMMAND ${module_triple_command} OUTPUT_VARIABLE target_info_json) + string(JSON module_triple GET "${target_info_json}" "target" "moduleTriple") + set(SwiftTesting_MODULE_TRIPLE "${module_triple}" CACHE STRING "swift module triple used for installed swiftmodule and swiftinterface files") + mark_as_advanced(SwiftTesting_MODULE_TRIPLE) + endif() + + install(FILES $/${module_name}.swiftdoc + DESTINATION lib/${swift}/${swift_os}/${module_name}.swiftmodule + RENAME ${SwiftTesting_MODULE_TRIPLE}.swiftdoc) + install(FILES $/${module_name}.swiftmodule + DESTINATION lib/${swift}/${swift_os}/${module_name}.swiftmodule + RENAME ${SwiftTesting_MODULE_TRIPLE}.swiftmodule) + install(FILES $/${module_name}.swiftinterface + DESTINATION lib/${swift}/${swift_os}/${module_name}.swiftmodule + RENAME ${SwiftTesting_MODULE_TRIPLE}.swiftinterface) +endfunction() From 543febdbacd3d4d3ed98b76415e18abcba5b3fa4 Mon Sep 17 00:00:00 2001 From: Stuart Montgomery Date: Tue, 16 Jul 2024 13:22:35 -0500 Subject: [PATCH 2/4] Fix negated conditional to ensure the macro plugin is installed when it's _not_ built as an executable --- Sources/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CMakeLists.txt b/Sources/CMakeLists.txt index 76b50eb14..a03893352 100644 --- a/Sources/CMakeLists.txt +++ b/Sources/CMakeLists.txt @@ -47,7 +47,7 @@ include(CompilerSettings) add_subdirectory(_TestingInternals) add_subdirectory(Testing) -if(SwiftTesting_BuildMacrosAsExecutables) +if(NOT SwiftTesting_BuildMacrosAsExecutables) install(PROGRAMS "${INSTALL_DIR}/lib/libTestingMacros.dylib" # TODO: Finalize the install path ARCHIVE DESTINATION lib/swift/host/plugins From 69e7171d1f8c3fd29e66be969296188dc60e3547 Mon Sep 17 00:00:00 2001 From: Stuart Montgomery Date: Thu, 18 Jul 2024 13:14:00 -0500 Subject: [PATCH 3/4] Fix the macro install locations --- Sources/CMakeLists.txt | 4 +--- Sources/TestingMacros/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Sources/CMakeLists.txt b/Sources/CMakeLists.txt index a03893352..bd58f7eb8 100644 --- a/Sources/CMakeLists.txt +++ b/Sources/CMakeLists.txt @@ -50,7 +50,5 @@ add_subdirectory(Testing) if(NOT SwiftTesting_BuildMacrosAsExecutables) install(PROGRAMS "${INSTALL_DIR}/lib/libTestingMacros.dylib" # TODO: Finalize the install path - ARCHIVE DESTINATION lib/swift/host/plugins - LIBRARY DESTINATION lib/swift/host/plugins - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + DESTINATION lib/swift/host/plugins) endif() diff --git a/Sources/TestingMacros/CMakeLists.txt b/Sources/TestingMacros/CMakeLists.txt index 390ba959c..a64a7dfec 100644 --- a/Sources/TestingMacros/CMakeLists.txt +++ b/Sources/TestingMacros/CMakeLists.txt @@ -64,7 +64,7 @@ else() # This is not the plugin's actual, final install location -- it's only # relative to this external project's install dir. The final location is # determined by the "outer" project. - install(TARGETS TestingMacros DESTINATION "") + install(TARGETS TestingMacros) endif() target_sources(TestingMacros PRIVATE From 9f3328c7d770cfe3b1031a6dd5e97272548f3cb2 Mon Sep 17 00:00:00 2001 From: Stuart Montgomery Date: Thu, 18 Jul 2024 14:57:16 -0500 Subject: [PATCH 4/4] Use the correct library name for the macro plugin on Linux --- Sources/CMakeLists.txt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Sources/CMakeLists.txt b/Sources/CMakeLists.txt index bd58f7eb8..292736a36 100644 --- a/Sources/CMakeLists.txt +++ b/Sources/CMakeLists.txt @@ -48,7 +48,18 @@ add_subdirectory(_TestingInternals) add_subdirectory(Testing) if(NOT SwiftTesting_BuildMacrosAsExecutables) - install(PROGRAMS "${INSTALL_DIR}/lib/libTestingMacros.dylib" + # Hardcode the known library names based on system name as a workaround since + # TestingMacros uses `ExternalProject` and we cannot directly query the + # properties of its targets here. + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") + set(SwiftTesting_TestingMacrosLibraryName "libTestingMacros.dylib") + elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") + set(SwiftTesting_TestingMacrosLibraryName "libTestingMacros.so") + else() + message(FATAL_ERROR "Unable to determine the library name for TestingMacros based on system name: ${CMAKE_SYSTEM_NAME}") + endif() + + install(PROGRAMS "${INSTALL_DIR}/lib/${SwiftTesting_TestingMacrosLibraryName}" # TODO: Finalize the install path DESTINATION lib/swift/host/plugins) endif()