Skip to content

Commit 336ede3

Browse files
committed
Unix toolchains will not try to use fat binaries.
Unix (other than Darwin) and Windows do not support fat binaries. However, the build system was trying to "lipo" several architectures into one file even for those targets (only Windows was exercising that part of the code, it seems). This patch removes the copy for a bogus empty target, and modifies the Unix toolchain to look into the architecture subdirectory, instead of trying to use the platform directory. The Windows toolchain already checked the architecture directory, and not the platform one. This should allow building two Linux or Android SDKs for different architures side by side. Some tests are modified to handle the new structure. The tests are hardcoded to use x86_64 because their targets were originally x86_64.
1 parent ae9f1b1 commit 336ede3

File tree

7 files changed

+190
-131
lines changed

7 files changed

+190
-131
lines changed

cmake/modules/AddSwift.cmake

Lines changed: 150 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,18 @@ function(is_darwin_based_sdk sdk_name out_var)
7676
endif()
7777
endfunction()
7878

79+
function(_compute_library_dependency_targets input_list sdk arch result_var_name)
80+
# On Darwin, don't add the ${arch} to the suffix. We want to link against fat
81+
# libraries.
82+
if(sdk IN_LIST SWIFT_APPLE_PLATFORMS)
83+
set(suffix "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
84+
else()
85+
set(suffix "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}")
86+
endif()
87+
_list_add_string_suffix("${input_list}" "${suffix}" result)
88+
set("${result_var_name}" "${result}" PARENT_SCOPE)
89+
endfunction()
90+
7991
# Usage:
8092
# _add_variant_c_compile_link_flags(
8193
# SDK sdk
@@ -530,6 +542,8 @@ function(_add_swift_lipo_target)
530542
"" # multi-value args
531543
${ARGN})
532544

545+
set(IS_DARWIN ${LIPO_SDK} IN_LIST SWIFT_APPLE_PLATFORMS)
546+
precondition(IS_DARWIN MESSAGE "It's not possible to build a universal binary for a non-MachO target")
533547
precondition(LIPO_SDK MESSAGE "sdk is required")
534548
precondition(LIPO_TARGET MESSAGE "target is required")
535549
precondition(LIPO_OUTPUT MESSAGE "output is required")
@@ -543,25 +557,16 @@ function(_add_swift_lipo_target)
543557
list(APPEND source_binaries $<TARGET_FILE:${source_target}>)
544558
endforeach()
545559

546-
if(${LIPO_SDK} IN_LIST SWIFT_APPLE_PLATFORMS)
547-
if(LIPO_CODESIGN)
548-
set(codesign_command COMMAND "codesign" "-f" "-s" "-" "${LIPO_OUTPUT}")
549-
endif()
550-
# Use lipo to create the final binary.
551-
add_custom_command_target(unused_var
552-
COMMAND "${SWIFT_LIPO}" "-create" "-output" "${LIPO_OUTPUT}" ${source_binaries}
553-
${codesign_command}
554-
CUSTOM_TARGET_NAME "${LIPO_TARGET}"
555-
OUTPUT "${LIPO_OUTPUT}"
556-
DEPENDS ${source_targets})
557-
else()
558-
# We don't know how to create fat binaries for other platforms.
559-
add_custom_command_target(unused_var
560-
COMMAND "${CMAKE_COMMAND}" "-E" "copy" "${source_binaries}" "${LIPO_OUTPUT}"
561-
CUSTOM_TARGET_NAME "${LIPO_TARGET}"
562-
OUTPUT "${LIPO_OUTPUT}"
563-
DEPENDS ${source_targets})
560+
if(LIPO_CODESIGN)
561+
set(codesign_command COMMAND "codesign" "-f" "-s" "-" "${LIPO_OUTPUT}")
564562
endif()
563+
# Use lipo to create the final binary.
564+
add_custom_command_target(unused_var
565+
COMMAND "${SWIFT_LIPO}" "-create" "-output" "${LIPO_OUTPUT}" ${source_binaries}
566+
${codesign_command}
567+
CUSTOM_TARGET_NAME "${LIPO_TARGET}"
568+
OUTPUT "${LIPO_OUTPUT}"
569+
DEPENDS ${source_targets})
565570
endfunction()
566571

567572
function(swift_target_link_search_directories target directories)
@@ -1701,13 +1706,22 @@ function(add_swift_target_library name)
17011706
list_intersect(
17021707
"${SWIFTLIB_TARGET_SDKS}" "${SWIFT_SDKS}" SWIFTLIB_TARGET_SDKS)
17031708

1709+
if(SWIFTLIB_SHARED)
1710+
set(resource_list "INSTALLABLE_SHARED_TARGETS")
1711+
else()
1712+
set(resource_list "INSTALLABLE_STATIC_TARGETS")
1713+
endif()
1714+
17041715
foreach(sdk ${SWIFTLIB_TARGET_SDKS})
17051716
if(NOT SWIFT_SDK_${sdk}_ARCHITECTURES)
17061717
# SWIFT_SDK_${sdk}_ARCHITECTURES is empty, so just continue
17071718
continue()
17081719
endif()
17091720

17101721
set(THIN_INPUT_TARGETS)
1722+
set(INSTALLABLE_SHARED_TARGETS)
1723+
set(INSTALLABLE_STATIC_TARGETS)
1724+
set(STDLIB_DEPENDENCIES)
17111725

17121726
# Collect architecture agnostic SDK module dependencies
17131727
set(swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS})
@@ -1748,7 +1762,7 @@ function(add_swift_target_library name)
17481762
${SWIFTLIB_FRAMEWORK_DEPENDS_IOS_TVOS})
17491763
endif()
17501764

1751-
# Collect architecutre agnostic compiler flags
1765+
# Collect architecture agnostic compiler flags
17521766
set(swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS})
17531767
if(${sdk} STREQUAL OSX)
17541768
list(APPEND swiftlib_swift_compile_flags_all
@@ -1908,47 +1922,52 @@ function(add_swift_target_library name)
19081922
)
19091923

19101924
if(NOT SWIFTLIB_OBJECT_LIBRARY)
1911-
# Add dependencies on the (not-yet-created) custom lipo target.
1912-
foreach(DEP ${SWIFTLIB_LINK_LIBRARIES})
1913-
if (NOT "${DEP}" STREQUAL "icucore")
1914-
add_dependencies(${VARIANT_NAME}
1915-
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
1925+
if(SWIFTLIB_LINK_LIBRARIES)
1926+
set(unsuffixed_dependencies ${SWIFTLIB_LINK_LIBRARIES})
1927+
list(FILTER unsuffixed_dependencies EXCLUDE REGEX "^icucore$")
1928+
_compute_library_dependency_targets("${unsuffixed_dependencies}" ${sdk} ${arch} shared_dependencies)
1929+
add_dependencies(${VARIANT_NAME} ${shared_dependencies})
1930+
1931+
if (SWIFTLIB_IS_STDLIB AND SWIFTLIB_STATIC)
1932+
_list_add_string_suffix(shared_dependencies "-static" static_dependencies)
1933+
add_dependencies("${VARIANT_NAME}-static" ${static_dependencies})
19161934
endif()
1917-
endforeach()
1918-
1919-
if (SWIFTLIB_IS_STDLIB AND SWIFTLIB_STATIC)
1920-
# Add dependencies on the (not-yet-created) custom lipo target.
1921-
foreach(DEP ${SWIFTLIB_LINK_LIBRARIES})
1922-
if (NOT "${DEP}" STREQUAL "icucore")
1923-
add_dependencies("${VARIANT_NAME}-static"
1924-
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static")
1925-
endif()
1926-
endforeach()
19271935
endif()
19281936

19291937
# Note this thin library.
19301938
list(APPEND THIN_INPUT_TARGETS ${VARIANT_NAME})
1939+
1940+
# For non-Darwin SDKs, we install each of the architectures
1941+
if(NOT ${sdk} IN_LIST SWIFT_APPLE_PLATFORMS)
1942+
list(APPEND "${resource_list}" "${VARIANT_NAME}")
1943+
list(APPEND STDLIB_DEPENDENCIES ${VARIANT_NAME})
1944+
set_target_properties(${VARIANT_NAME}
1945+
PROPERTIES
1946+
SWIFTLIB_INSTALL_FILES $<TARGET_FILE:${VARIANT_NAME}>
1947+
SWIFTLIB_INSTALL_DESTINATION "${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${arch}"
1948+
SWIFTLIB_INSTALL_EXPORT_TARGETS "${VARIANT_NAME}")
1949+
1950+
if (SWIFTLIB_IS_STDLIB AND SWIFTLIB_STATIC)
1951+
list(APPEND INSTALLABLE_STATIC_TARGETS "${VARIANT_NAME}-static")
1952+
list(APPEND STDLIB_DEPENDENCIES "${VARIANT_NAME}-static")
1953+
set_target_properties("${VARIANT_NAME}-static"
1954+
PROPERTIES
1955+
SWIFTLIB_INSTALL_FILES $<TARGET_FILE:${VARIANT_NAME}-static>
1956+
SWIFTLIB_INSTALL_DESTINATION "${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${arch}")
1957+
endif()
1958+
endif()
19311959
endif()
19321960
endforeach()
19331961

1934-
if(NOT SWIFTLIB_OBJECT_LIBRARY)
1962+
# Only Darwin supports universal binaries.
1963+
if(NOT SWIFTLIB_OBJECT_LIBRARY AND ${sdk} IN_LIST SWIFT_APPLE_PLATFORMS)
19351964
# Determine the name of the universal library.
19361965
if(SWIFTLIB_SHARED)
1937-
if("${sdk}" STREQUAL "WINDOWS")
1938-
set(UNIVERSAL_LIBRARY_NAME
1939-
"${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${name}.dll")
1940-
else()
1941-
set(UNIVERSAL_LIBRARY_NAME
1942-
"${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}")
1943-
endif()
1966+
set(UNIVERSAL_LIBRARY_NAME
1967+
"${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}")
19441968
else()
1945-
if("${sdk}" STREQUAL "WINDOWS")
1946-
set(UNIVERSAL_LIBRARY_NAME
1947-
"${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${name}.lib")
1948-
else()
1949-
set(UNIVERSAL_LIBRARY_NAME
1950-
"${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
1951-
endif()
1969+
set(UNIVERSAL_LIBRARY_NAME
1970+
"${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
19521971
endif()
19531972

19541973
set(lipo_target "${name}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
@@ -1975,42 +1994,14 @@ function(add_swift_target_library name)
19751994
set(resource_dir_sdk_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
19761995
precondition(resource_dir_sdk_subdir)
19771996

1978-
if(SWIFTLIB_SHARED)
1979-
set(resource_dir "swift")
1980-
set(file_permissions
1981-
OWNER_READ OWNER_WRITE OWNER_EXECUTE
1982-
GROUP_READ GROUP_EXECUTE
1983-
WORLD_READ WORLD_EXECUTE)
1984-
else()
1985-
set(resource_dir "swift_static")
1986-
set(file_permissions
1987-
OWNER_READ OWNER_WRITE
1988-
GROUP_READ
1989-
WORLD_READ)
1990-
endif()
1991-
1992-
swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}"
1993-
FILES "${UNIVERSAL_LIBRARY_NAME}"
1994-
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/${resource_dir}/${resource_dir_sdk_subdir}"
1995-
PERMISSIONS ${file_permissions})
1996-
if(sdk STREQUAL WINDOWS)
1997-
foreach(arch ${SWIFT_SDK_WINDOWS_ARCHITECTURES})
1998-
if(TARGET ${name}-windows-${arch}_IMPLIB)
1999-
get_target_property(import_library ${name}-windows-${arch}_IMPLIB IMPORTED_LOCATION)
2000-
swift_install_in_component(${SWIFTLIB_INSTALL_IN_COMPONENT}
2001-
FILES ${import_library}
2002-
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/${resource_dir}/${resource_dir_sdk_subdir}/${arch}"
2003-
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
2004-
endif()
2005-
endforeach()
2006-
endif()
2007-
2008-
swift_is_installing_component("${SWIFTLIB_INSTALL_IN_COMPONENT}" is_installing)
2009-
if(NOT is_installing)
2010-
set_property(GLOBAL APPEND PROPERTY SWIFT_BUILDTREE_EXPORTS ${VARIANT_NAME})
2011-
else()
2012-
set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS ${VARIANT_NAME})
2013-
endif()
1997+
list(APPEND "${resource_list}" ${lipo_target})
1998+
list(APPEND STDLIB_DEPENDENCIES ${lipo_target})
1999+
# NOTE: for lipo targets, the exported target is the last ${VARIANT_NAME}, for some reason.
2000+
set_target_properties(${lipo_target}
2001+
PROPERTIES
2002+
SWIFTLIB_INSTALL_FILES "${UNIVERSAL_LIBRARY_NAME}"
2003+
SWIFTLIB_INSTALL_DESTINATION "${resource_dir_sdk_subdir}"
2004+
SWIFTLIB_INSTALL_EXPORT_TARGETS "${VARIANT_NAME}")
20142005

20152006
# If we built static variants of the library, create a lipo target for
20162007
# them.
@@ -2032,17 +2023,19 @@ function(add_swift_target_library name)
20322023
OUTPUT
20332024
"${UNIVERSAL_LIBRARY_NAME}"
20342025
${THIN_INPUT_TARGETS_STATIC})
2035-
swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}"
2036-
FILES "${UNIVERSAL_LIBRARY_NAME}"
2037-
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift_static/${resource_dir_sdk_subdir}"
2038-
PERMISSIONS
2039-
OWNER_READ OWNER_WRITE
2040-
GROUP_READ
2041-
WORLD_READ)
2026+
2027+
list(APPEND INSTALLABLE_STATIC_TARGETS ${lipo_target_static})
2028+
list(APPEND STDLIB_DEPENDENCIES ${lipo_target_static})
2029+
set_target_properties(${lipo_target_static}
2030+
PROPERTIES
2031+
SWIFTLIB_INSTALL_FILES "${UNIVERSAL_LIBRARY_NAME}"
2032+
SWIFTLIB_INSTALL_DESTINATION "${resource_dir_sdk_subdir}")
20422033
endif()
2034+
endif()
20432035

2044-
# Add Swift standard library targets as dependencies to the top-level
2045-
# convenience target.
2036+
# Add Swift standard library targets as dependencies to the top-level
2037+
# convenience target.
2038+
if(NOT SWIFTLIB_OBJECT_LIBRARY)
20462039
set(FILTERED_UNITTESTS
20472040
swiftStdlibCollectionUnittest
20482041
swiftStdlibUnicodeUnittest)
@@ -2052,12 +2045,52 @@ function(add_swift_target_library name)
20522045
if(TARGET "swift-stdlib${VARIANT_SUFFIX}" AND
20532046
TARGET "swift-test-stdlib${VARIANT_SUFFIX}")
20542047
add_dependencies("swift-stdlib${VARIANT_SUFFIX}"
2055-
${lipo_target}
2056-
${lipo_target_static})
2048+
${STDLIB_DEPENDENCIES})
20572049
if(NOT "${name}" IN_LIST FILTERED_UNITTESTS)
20582050
add_dependencies("swift-test-stdlib${VARIANT_SUFFIX}"
2059-
${lipo_target}
2060-
${lipo_target_static})
2051+
${STDLIB_DEPENDENCIES})
2052+
endif()
2053+
endif()
2054+
endforeach()
2055+
endif()
2056+
2057+
if(NOT SWIFTLIB_OBJECT_LIBRARY)
2058+
set(SHARED_TARGET_PERMISSIONS
2059+
OWNER_READ OWNER_WRITE OWNER_EXECUTE
2060+
GROUP_READ GROUP_EXECUTE
2061+
WORLD_READ WORLD_EXECUTE)
2062+
set(STATIC_TARGET_PERMISSIONS
2063+
OWNER_READ OWNER_WRITE
2064+
GROUP_READ
2065+
WORLD_READ)
2066+
2067+
foreach(target ${INSTALLABLE_SHARED_TARGETS})
2068+
get_target_property(target_files "${target}" SWIFTLIB_INSTALL_FILES)
2069+
get_target_property(target_destination "${target}" SWIFTLIB_INSTALL_DESTINATION)
2070+
swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}"
2071+
FILES ${target_files}
2072+
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift/${target_destination}"
2073+
PERMISSIONS ${SHARED_TARGET_PERMISSIONS})
2074+
endforeach()
2075+
foreach(target ${INSTALLABLE_STATIC_TARGETS})
2076+
get_target_property(target_files "${target}" SWIFTLIB_INSTALL_FILES)
2077+
get_target_property(target_destination "${target}" SWIFTLIB_INSTALL_DESTINATION)
2078+
swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}"
2079+
FILES ${target_files}
2080+
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift_static/${target_destination}"
2081+
PERMISSIONS ${STATIC_TARGET_PERMISSIONS})
2082+
endforeach()
2083+
2084+
swift_is_installing_component("${SWIFTLIB_INSTALL_IN_COMPONENT}" is_installing)
2085+
foreach(target IN LISTS INSTALLABLE_SHARED_TARGETS INSTALLABLE_STATIC_TARGETS)
2086+
get_target_property(target_exports "${target}" SWIFTLIB_INSTALL_EXPORT_TARGETS)
2087+
2088+
# Some static targets are not exported.
2089+
if(target_exports)
2090+
if(NOT is_installing)
2091+
set_property(GLOBAL APPEND PROPERTY SWIFT_BUILDTREE_EXPORTS ${target_exports})
2092+
else()
2093+
set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS ${target_exports})
20612094
endif()
20622095
endif()
20632096
endforeach()
@@ -2104,8 +2137,13 @@ function(_add_swift_executable_single name)
21042137
set(link_flags)
21052138

21062139
# Prepare linker search directories.
2107-
set(library_search_directories
2108-
"${SWIFTLIB_DIR}/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}")
2140+
if(SWIFTEXE_SINGLE_SDK IN_LIST SWIFT_APPLE_PLATFORMS)
2141+
set(library_search_directories
2142+
"${SWIFTLIB_DIR}/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}")
2143+
else()
2144+
set(library_search_directories
2145+
"${SWIFTLIB_DIR}/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}/${SWIFTEXE_SINGLE_ARCHITECTURE}")
2146+
endif()
21092147

21102148
# Add variant-specific flags.
21112149
_add_variant_c_compile_flags(
@@ -2127,20 +2165,20 @@ function(_add_swift_executable_single name)
21272165
RESULT_VAR_NAME link_flags
21282166
LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories)
21292167

2168+
if(SWIFTEXE_SINGLE_DISABLE_ASLR)
2169+
list(APPEND link_flags "-Wl,-no_pie")
2170+
endif()
2171+
21302172
if(${SWIFTEXE_SINGLE_SDK} IN_LIST SWIFT_APPLE_PLATFORMS)
21312173
list(APPEND link_flags
21322174
"-Xlinker" "-rpath"
21332175
"-Xlinker" "@executable_path/../lib/swift/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}")
21342176
endif()
21352177

2136-
# Find the names of dependency library targets.
2137-
#
2138-
# We don't add the ${ARCH} to the target suffix because we want to link
2139-
# against fat libraries.
2140-
_list_add_string_suffix(
2141-
"${SWIFTEXE_SINGLE_LINK_FAT_LIBRARIES}"
2142-
"-${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}"
2143-
SWIFTEXE_SINGLE_LINK_FAT_LIBRARIES_TARGETS)
2178+
_compute_library_dependency_targets("${SWIFTEXE_SINGLE_LINK_FAT_LIBRARIES}"
2179+
"${SWIFTEXE_SINGLE_SDK}"
2180+
"${SWIFTEXE_SINGLE_ARCHITECTURE}"
2181+
SWIFTEXE_SINGLE_LINK_FAT_LIBRARIES_TARGETS)
21442182

21452183
handle_swift_sources(
21462184
dependency_target
@@ -2245,12 +2283,10 @@ function(add_swift_target_executable name)
22452283
add_dependencies("swift-test-stdlib${VARIANT_SUFFIX}" ${VARIANT_NAME})
22462284
endif()
22472285

2248-
# Don't add the ${arch} to the suffix. We want to link against fat
2249-
# libraries.
2250-
_list_add_string_suffix(
2251-
"${SWIFTEXE_TARGET_DEPENDS}"
2252-
"-${SWIFT_SDK_${sdk}_LIB_SUBDIR}"
2253-
SWIFTEXE_TARGET_DEPENDS_with_suffix)
2286+
_compute_library_dependency_targets("${SWIFTEXE_TARGET_DEPENDS}"
2287+
"${sdk}"
2288+
"${arch}"
2289+
SWIFTEXE_TARGET_DEPENDS_with_suffix)
22542290
_add_swift_executable_single(
22552291
${VARIANT_NAME}
22562292
${SWIFTEXE_TARGET_SOURCES}

0 commit comments

Comments
 (0)