Skip to content

build: Install libraries in an arch sub-folder #5257

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 2 additions & 20 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,6 @@ if(FOUNDATION_SWIFTPM_DEPS)
return()
endif()

if(NOT SWIFT_SYSTEM_NAME)
if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
set(SWIFT_SYSTEM_NAME macosx)
else()
set(SWIFT_SYSTEM_NAME "$<LOWER_CASE:${CMAKE_SYSTEM_NAME}>")
endif()
endif()

# Don't enable WMO on Windows due to linker failures
if(NOT CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
# Enable whole module optimization for release builds & incremental for debug builds
Expand Down Expand Up @@ -138,18 +130,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL Linux)
"$<$<COMPILE_LANGUAGE:C,CXX>:-fno-omit-frame-pointer>")
endif()

# Precompute module triple for installation
if(NOT SwiftFoundation_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(SwiftFoundation_MODULE_TRIPLE "${module_triple}" CACHE STRING "swift module triple used for installed swiftmodule and swiftinterface files")
mark_as_advanced(SwiftFoundation_MODULE_TRIPLE)
endif()

# System dependencies

# We know libdispatch is always unavailable on WASI
Expand Down Expand Up @@ -256,6 +236,8 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
"-D_GNU_SOURCE")
endif()

option(SwiftFoundation_INSTALL_ARCH_SUBDIR "Install libraries under an architecture subdirectory" NO)

include(GNUInstallDirs)
include(FoundationSwiftSupport)

Expand Down
4 changes: 2 additions & 2 deletions Sources/CoreFoundation/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ install(DIRECTORY

if(NOT BUILD_SHARED_LIBS)
install(TARGETS CoreFoundation
ARCHIVE DESTINATION lib/swift_static/${SWIFT_SYSTEM_NAME}
LIBRARY DESTINATION lib/swift_static/${SWIFT_SYSTEM_NAME}
ARCHIVE DESTINATION lib/swift_static/${SwiftFoundation_PLATFORM}
LIBRARY DESTINATION lib/swift_static/${SwiftFoundation_PLATFORM}
RUNTIME DESTINATION bin)
endif()
4 changes: 2 additions & 2 deletions Sources/_CFURLSessionInterface/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ target_link_libraries(_CFURLSessionInterface PRIVATE
if(NOT BUILD_SHARED_LIBS)
set_property(GLOBAL APPEND PROPERTY Foundation_EXPORTS _CFURLSessionInterface)
install(TARGETS _CFURLSessionInterface
ARCHIVE DESTINATION lib/swift_static/${SWIFT_SYSTEM_NAME}
LIBRARY DESTINATION lib/swift_static/${SWIFT_SYSTEM_NAME}
ARCHIVE DESTINATION lib/swift_static/${SwiftFoundation_PLATFORM}
LIBRARY DESTINATION lib/swift_static/${SwiftFoundation_PLATFORM}
RUNTIME DESTINATION bin)
endif()
4 changes: 2 additions & 2 deletions Sources/_CFXMLInterface/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ endif()
if(NOT BUILD_SHARED_LIBS)
set_property(GLOBAL APPEND PROPERTY Foundation_EXPORTS _CFXMLInterface)
install(TARGETS _CFXMLInterface
ARCHIVE DESTINATION lib/swift_static/${SWIFT_SYSTEM_NAME}
LIBRARY DESTINATION lib/swift_static/${SWIFT_SYSTEM_NAME}
ARCHIVE DESTINATION lib/swift_static/${SwiftFoundation_PLATFORM}
LIBRARY DESTINATION lib/swift_static/${SwiftFoundation_PLATFORM}
RUNTIME DESTINATION bin)
endif()
2 changes: 1 addition & 1 deletion Sources/plutil/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ target_link_libraries(plutil PRIVATE
Foundation)

set_target_properties(plutil PROPERTIES
INSTALL_RPATH "$ORIGIN/../lib/swift/${SWIFT_SYSTEM_NAME}")
INSTALL_RPATH "$ORIGIN/../lib/swift/${SwiftFoundation_PLATFORM}")

set_property(GLOBAL APPEND PROPERTY Foundation_EXPORTS plutil)
install(TARGETS plutil
Expand Down
57 changes: 52 additions & 5 deletions cmake/modules/FoundationSwiftSupport.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,55 @@
##
##===----------------------------------------------------------------------===##

if(NOT SwiftFoundation_MODULE_TRIPLE OR NOT SwiftFoundation_ARCH OR NOT SwiftFoundation_PLATFORM)
# Get the target information from the Swift compiler.
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)
endif()

if(NOT SwiftFoundation_MODULE_TRIPLE)
string(JSON module_triple GET "${target_info_json}" "target" "moduleTriple")
set(SwiftFoundation_MODULE_TRIPLE "${module_triple}" CACHE STRING "Triple used to install swiftmodule files")
mark_as_advanced(SwiftFoundation_MODULE_TRIPLE)
message(CONFIGURE_LOG "Swift module triple: ${module_triple}")
endif()

if(NOT SwiftFoundation_ARCH)
if(CMAKE_Swift_COMPILER_VERSION VERSION_EQUAL 0.0.0 OR CMAKE_Swift_COMPILER_VERSION VERSION_GREATER_EQUAL 6.2)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think these version checks are necessary - the main branch of Foundation must be built using at least a recent nightly snapshot of the main branch of the compiler, so this check should never fail

# For newer compilers, we can use the -print-target-info command to get the architecture.
string(JSON module_arch GET "${target_info_json}" "target" "arch")
else()
# For older compilers, extract the value from `SwiftFoundation_MODULE_TRIPLE`.
string(REGEX MATCH "^[^-]+" module_arch "${SwiftFoundation_MODULE_TRIPLE}")
endif()

set(SwiftFoundation_ARCH "${module_arch}" CACHE STRING "Arch folder name used to install libraries")
mark_as_advanced(SwiftFoundation_ARCH)
message(CONFIGURE_LOG "Swift arch: ${SwiftFoundation_ARCH}")
endif()

if(NOT SwiftFoundation_PLATFORM)
if(CMAKE_Swift_COMPILER_VERSION VERSION_EQUAL 0.0.0 OR CMAKE_Swift_COMPILER_VERSION VERSION_GREATER_EQUAL 6.2)
# For newer compilers, we can use the -print-target-info command to get the platform.
string(JSON swift_platform GET "${target_info_json}" "target" "platform")
else()
# For older compilers, compile the value from `CMAKE_SYSTEM_NAME`.
if(APPLE)
set(swift_platform macosx)
else()
set(swift_platform "$<LOWER_CASE:${CMAKE_SYSTEM_NAME}>")
endif()
endif()

set(SwiftFoundation_PLATFORM "${swift_platform}" CACHE STRING "Platform folder name used to install libraries")
mark_as_advanced(SwiftFoundation_PLATFORM)
message(CONFIGURE_LOG "Swift platform: ${SwiftFoundation_PLATFORM}")
endif()

function(_foundation_install_target module)
set(swift_os ${SWIFT_SYSTEM_NAME})
get_target_property(type ${module} TYPE)

if(type STREQUAL STATIC_LIBRARY)
Expand All @@ -23,8 +70,8 @@ function(_foundation_install_target module)
endif()

install(TARGETS ${module}
ARCHIVE DESTINATION lib/${swift}/${swift_os}
LIBRARY DESTINATION lib/${swift}/${swift_os}
ARCHIVE DESTINATION lib/${swift}/${SwiftFoundation_PLATFORM}$<$<BOOL:${SwiftFoundation_INSTALL_ARCH_SUBDIR}>:/${SwiftFoundation_ARCH}>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like you're only applying the arch subdirectory at install time for the swift modules. What about the other C modules for the static SDK?

LIBRARY DESTINATION lib/${swift}/${SwiftFoundation_PLATFORM}$<$<BOOL:${SwiftFoundation_INSTALL_ARCH_SUBDIR}>:/${SwiftFoundation_ARCH}>
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
if(type STREQUAL EXECUTABLE)
return()
Expand All @@ -36,10 +83,10 @@ function(_foundation_install_target module)
endif()

install(FILES $<TARGET_PROPERTY:${module},Swift_MODULE_DIRECTORY>/${module_name}.swiftdoc
DESTINATION lib/${swift}/${swift_os}/${module_name}.swiftmodule
DESTINATION lib/${swift}/${SwiftFoundation_PLATFORM}/${module_name}.swiftmodule
RENAME ${SwiftFoundation_MODULE_TRIPLE}.swiftdoc)
install(FILES $<TARGET_PROPERTY:${module},Swift_MODULE_DIRECTORY>/${module_name}.swiftmodule
DESTINATION lib/${swift}/${swift_os}/${module_name}.swiftmodule
DESTINATION lib/${swift}/${SwiftFoundation_PLATFORM}/${module_name}.swiftmodule
RENAME ${SwiftFoundation_MODULE_TRIPLE}.swiftmodule)

endfunction()