From 316e9508225f3981ba388f5fafd75a11f36de391 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Fri, 21 Feb 2025 17:47:46 -0800 Subject: [PATCH] build: restructure the install location handling Adopt the latest best practices for handling module installation. Introduce the new `XCTest_INSTALL_NESTED_SUBDIR` option to allow installation into platform/architecture subdirectory allowing multi-architecture installations for platforms like Windows and Android. This is currently opt-in and requires a newer toolchain (something within the last ~2w) to detect the defaults. The values can be overridden by the user if desired. --- CMakeLists.txt | 27 ++++++++++++-------- cmake/modules/PlatformInfo.cmake | 41 +++++++++++++++++++++++++++++ cmake/modules/SwiftSupport.cmake | 44 -------------------------------- 3 files changed, 57 insertions(+), 55 deletions(-) create mode 100644 cmake/modules/PlatformInfo.cmake delete mode 100644 cmake/modules/SwiftSupport.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f23844c..9415b43e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,13 +21,15 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin AND NOT DISABLE_XCTWAITER) find_package(Foundation CONFIG REQUIRED) endif() -include(SwiftSupport) include(GNUInstallDirs) include(CheckLinkerFlag) +include(PlatformInfo) -if(CMAKE_SYSTEM_NAME STREQUAL Linux - OR CMAKE_SYSTEM_NAME STREQUAL FreeBSD - OR CMAKE_SYSTEM_NAME STREQUAL OpenBSD) +option(XCTest_INSTALL_NESTED_SUBDIR "Install libraries under a platform and architecture subdirectory" NO) +set(XCTest_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}/swift$<$>:_static>/${XCTest_PLATFORM_SUBDIR}$<$:/${XCTest_ARCH_SUBDIR}>") +set(XCTest_INSTALL_SWIFTMODULEDIR "${CMAKE_INSTALL_LIBDIR}/swift$<$>:_static>/${XCTest_PLATFORM_SUBDIR}$<$:/${XCTest_PLATFORM_SUBDIR}>") + +if(UNIX) enable_language(C) check_linker_flag(C "LINKER:--build-id=sha1" LINKER_SUPPORTS_BUILD_ID) endif() @@ -142,14 +144,17 @@ endif() set_property(GLOBAL APPEND PROPERTY XCTest_EXPORTS XCTest) -get_swift_host_arch(swift_arch) + + install(TARGETS XCTest - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/swift$<$>:_static>/$ - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/swift$<$>:_static>/$ + ARCHIVE DESTINATION ${XCTest_INSTALL_LIBDIR} + LIBRARY DESTINATION ${XCTest_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) -install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/swift/XCTest.swiftdoc - ${CMAKE_CURRENT_BINARY_DIR}/swift/XCTest.swiftmodule - DESTINATION ${CMAKE_INSTALL_LIBDIR}/swift$<$>:_static>/$/${swift_arch}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/swift/XCTest.swiftdoc + DESTINATION ${XCTest_INSTALL_SWIFTMODULEDIR}/XCTest.swiftmodule + RENAME ${XCTest_MODULE_TRIPLE}.swiftdoc) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/swift/XCTest.swiftmodule + DESTINATION ${XCTest_INSTALL_SWIFTMODULEDIR}/XCTest.swiftmodule + RENAME ${XCTest_MODULE_TRIPLE}.swiftmodule) add_subdirectory(cmake/modules) diff --git a/cmake/modules/PlatformInfo.cmake b/cmake/modules/PlatformInfo.cmake new file mode 100644 index 00000000..468dc61b --- /dev/null +++ b/cmake/modules/PlatformInfo.cmake @@ -0,0 +1,41 @@ + +set(print_target_info_invocation "${CMAKE_Swift_COMPILER}" -print-target-info) +if(CMAKE_Swift_COMPILER_TARGET) + list(APPEND print_target_info_invocation -target ${CMAKE_Swift_COMPILER_TARGET}) +endif() +execute_process(COMMAND ${print_target_info_invocation} OUTPUT_VARIABLE target_info_json) +message(CONFIGURE_LOG "Swift Target Info: ${print_target_info_invocation}\n" +"${target_info_json}") + +if(NOT XCTest_MODULE_TRIPLE) + string(JSON module_triple GET "${target_info_json}" "target" "moduleTriple") + set(XCTest_MODULE_TRIPLE "${module_triple}" CACHE STRING "Triple used for installed swift{doc,module,interface} files") + mark_as_advanced(XCTest_MODULE_TRIPLE) + + message(CONFIGURE_LOG "Swift Module Triple: ${module_triple}") +endif() + +if(NOT XCTest_PLATFORM_SUBDIR) + string(JSON platform GET "${target_info_json}" "target" "platform") + if(NOT platform) + if(NOT SWIFT_SYSTEM_NAME) + if(CMAKE_SYSTEM_NAME STREQUAL Darwin) + set(platform macosx) + else() + set(platform $) + endif() + endif() + endif() + set(XCTest_PLATFORM_SUBDIR "${platform}" CACHE STRING "Platform name used for installed swift{doc,module,interface} files") + mark_as_advanced(XCTest_PLATFORM_SUBDIR) + + message(CONFIGURE_LOG "Swift Platform: ${platform}") +endif() + +if(NOT XCTest_ARCH_SUBDIR) + string(JSON arch GET "${target_info_json}" "target" "arch") + set(XCTest_ARCH_SUBDIR "${arch}" CACHE STRING "Architecture used for setting the architecture subdirectory") + mark_as_advanced(XCTest_ARCH_SUBDIR) + + message(CONFIGURE_LOG "Swift Architecture: ${arch}") +endif() diff --git a/cmake/modules/SwiftSupport.cmake b/cmake/modules/SwiftSupport.cmake deleted file mode 100644 index cabd5d11..00000000 --- a/cmake/modules/SwiftSupport.cmake +++ /dev/null @@ -1,44 +0,0 @@ -# Returns the current architecture name in a variable -# -# Usage: -# get_swift_host_arch(result_var_name) -# -# If the current architecture is supported by Swift, sets ${result_var_name} -# with the sanitized host architecture name derived from CMAKE_SYSTEM_PROCESSOR. -function(get_swift_host_arch result_var_name) - if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") - set("${result_var_name}" "x86_64" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "arm64") - set("${result_var_name}" "arm64" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") - set("${result_var_name}" "aarch64" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ARM64") - set("${result_var_name}" "aarch64" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64") - set("${result_var_name}" "powerpc64" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64le") - set("${result_var_name}" "powerpc64le" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x") - set("${result_var_name}" "s390x" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv6l") - set("${result_var_name}" "armv6" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7l") - set("${result_var_name}" "armv7" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7-a") - set("${result_var_name}" "armv7" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "amd64") - set("${result_var_name}" "amd64" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64") - set("${result_var_name}" "x86_64" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "IA64") - set("${result_var_name}" "itanium" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86") - set("${result_var_name}" "i686" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686") - set("${result_var_name}" "i686" PARENT_SCOPE) - elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "wasm32") - set("${result_var_name}" "wasm32" PARENT_SCOPE) - else() - message(FATAL_ERROR "Unrecognized architecture on host system: ${CMAKE_SYSTEM_PROCESSOR}") - endif() -endfunction()