@@ -76,6 +76,18 @@ function(is_darwin_based_sdk sdk_name out_var)
76
76
endif ()
77
77
endfunction ()
78
78
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
+
79
91
# Usage:
80
92
# _add_variant_c_compile_link_flags(
81
93
# SDK sdk
@@ -530,6 +542,8 @@ function(_add_swift_lipo_target)
530
542
"" # multi-value args
531
543
${ARGN} )
532
544
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" )
533
547
precondition (LIPO_SDK MESSAGE "sdk is required" )
534
548
precondition (LIPO_TARGET MESSAGE "target is required" )
535
549
precondition (LIPO_OUTPUT MESSAGE "output is required" )
@@ -543,25 +557,16 @@ function(_add_swift_lipo_target)
543
557
list (APPEND source_binaries $< TARGET_FILE:${source_target} > )
544
558
endforeach ()
545
559
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} " )
564
562
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} )
565
570
endfunction ()
566
571
567
572
function (swift_target_link_search_directories target directories )
@@ -1701,13 +1706,22 @@ function(add_swift_target_library name)
1701
1706
list_intersect (
1702
1707
"${SWIFTLIB_TARGET_SDKS} " "${SWIFT_SDKS} " SWIFTLIB_TARGET_SDKS )
1703
1708
1709
+ if (SWIFTLIB_SHARED )
1710
+ set (resource_list "INSTALLABLE_SHARED_TARGETS" )
1711
+ else ()
1712
+ set (resource_list "INSTALLABLE_STATIC_TARGETS" )
1713
+ endif ()
1714
+
1704
1715
foreach (sdk ${SWIFTLIB_TARGET_SDKS} )
1705
1716
if (NOT SWIFT_SDK_${sdk}_ARCHITECTURES )
1706
1717
# SWIFT_SDK_${sdk}_ARCHITECTURES is empty, so just continue
1707
1718
continue ()
1708
1719
endif ()
1709
1720
1710
1721
set (THIN_INPUT_TARGETS )
1722
+ set (INSTALLABLE_SHARED_TARGETS )
1723
+ set (INSTALLABLE_STATIC_TARGETS )
1724
+ set (STDLIB_DEPENDENCIES )
1711
1725
1712
1726
# Collect architecture agnostic SDK module dependencies
1713
1727
set (swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS} )
@@ -1748,7 +1762,7 @@ function(add_swift_target_library name)
1748
1762
${SWIFTLIB_FRAMEWORK_DEPENDS_IOS_TVOS} )
1749
1763
endif ()
1750
1764
1751
- # Collect architecutre agnostic compiler flags
1765
+ # Collect architecture agnostic compiler flags
1752
1766
set (swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS} )
1753
1767
if (${sdk} STREQUAL OSX )
1754
1768
list (APPEND swiftlib_swift_compile_flags_all
@@ -1908,47 +1922,52 @@ function(add_swift_target_library name)
1908
1922
)
1909
1923
1910
1924
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} )
1916
1934
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 ()
1927
1935
endif ()
1928
1936
1929
1937
# Note this thin library.
1930
1938
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 ()
1931
1959
endif ()
1932
1960
endforeach ()
1933
1961
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 )
1935
1964
# Determine the name of the universal library.
1936
1965
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} " )
1944
1968
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} " )
1952
1971
endif ()
1953
1972
1954
1973
set (lipo_target "${name} -${SWIFT_SDK_${sdk} _LIB_SUBDIR}" )
@@ -1975,42 +1994,14 @@ function(add_swift_target_library name)
1975
1994
set (resource_dir_sdk_subdir "${SWIFT_SDK_${sdk} _LIB_SUBDIR}" )
1976
1995
precondition (resource_dir_sdk_subdir )
1977
1996
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} " )
2014
2005
2015
2006
# If we built static variants of the library, create a lipo target for
2016
2007
# them.
@@ -2032,17 +2023,19 @@ function(add_swift_target_library name)
2032
2023
OUTPUT
2033
2024
"${UNIVERSAL_LIBRARY_NAME} "
2034
2025
${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} " )
2042
2033
endif ()
2034
+ endif ()
2043
2035
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 )
2046
2039
set (FILTERED_UNITTESTS
2047
2040
swiftStdlibCollectionUnittest
2048
2041
swiftStdlibUnicodeUnittest )
@@ -2052,12 +2045,52 @@ function(add_swift_target_library name)
2052
2045
if (TARGET "swift-stdlib${VARIANT_SUFFIX} " AND
2053
2046
TARGET "swift-test-stdlib${VARIANT_SUFFIX} " )
2054
2047
add_dependencies ("swift-stdlib${VARIANT_SUFFIX} "
2055
- ${lipo_target}
2056
- ${lipo_target_static} )
2048
+ ${STDLIB_DEPENDENCIES} )
2057
2049
if (NOT "${name} " IN_LIST FILTERED_UNITTESTS )
2058
2050
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} )
2061
2094
endif ()
2062
2095
endif ()
2063
2096
endforeach ()
@@ -2104,8 +2137,13 @@ function(_add_swift_executable_single name)
2104
2137
set (link_flags )
2105
2138
2106
2139
# 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 ()
2109
2147
2110
2148
# Add variant-specific flags.
2111
2149
_add_variant_c_compile_flags (
@@ -2127,20 +2165,20 @@ function(_add_swift_executable_single name)
2127
2165
RESULT_VAR_NAME link_flags
2128
2166
LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories )
2129
2167
2168
+ if (SWIFTEXE_SINGLE_DISABLE_ASLR )
2169
+ list (APPEND link_flags "-Wl,-no_pie" )
2170
+ endif ()
2171
+
2130
2172
if (${SWIFTEXE_SINGLE_SDK} IN_LIST SWIFT_APPLE_PLATFORMS )
2131
2173
list (APPEND link_flags
2132
2174
"-Xlinker" "-rpath"
2133
2175
"-Xlinker" "@executable_path/../lib/swift/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK} _LIB_SUBDIR}" )
2134
2176
endif ()
2135
2177
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 )
2144
2182
2145
2183
handle_swift_sources (
2146
2184
dependency_target
@@ -2245,12 +2283,10 @@ function(add_swift_target_executable name)
2245
2283
add_dependencies ("swift-test-stdlib${VARIANT_SUFFIX} " ${VARIANT_NAME} )
2246
2284
endif ()
2247
2285
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 )
2254
2290
_add_swift_executable_single (
2255
2291
${VARIANT_NAME}
2256
2292
${SWIFTEXE_TARGET_SOURCES}
0 commit comments