Skip to content

Commit bf7b721

Browse files
committed
[Unix] Move all ELF SDK runtime libraries into their own architecture-specific directories
This is needed for all platforms that don't have multi-architecture libraries like Darwin. Resolves swiftlang#63645
1 parent e770bbe commit bf7b721

File tree

16 files changed

+69
-52
lines changed

16 files changed

+69
-52
lines changed

cmake/modules/AddSwift.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ function(_add_swift_runtime_link_flags target relpath_to_lib_dir bootstrapping)
539539
# installed host toolchain.
540540
get_filename_component(swift_bin_dir ${SWIFT_EXEC_FOR_SWIFT_MODULES} DIRECTORY)
541541
get_filename_component(swift_dir ${swift_bin_dir} DIRECTORY)
542-
set(host_lib_dir "${swift_dir}/lib/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}")
542+
set(host_lib_dir "${swift_dir}/lib/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}/${SWIFT_HOST_VARIANT_ARCH}")
543543
544544
target_link_libraries(${target} PRIVATE ${swiftrt})
545545
target_link_libraries(${target} PRIVATE "swiftCore")
@@ -548,7 +548,7 @@ function(_add_swift_runtime_link_flags target relpath_to_lib_dir bootstrapping)
548548
if(ASRLF_BOOTSTRAPPING_MODE STREQUAL "HOSTTOOLS")
549549
set(swift_runtime_rpath "${host_lib_dir}")
550550
else()
551-
set(swift_runtime_rpath "$ORIGIN/${relpath_to_lib_dir}/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}")
551+
set(swift_runtime_rpath "$ORIGIN/${relpath_to_lib_dir}/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}/${SWIFT_HOST_VARIANT_ARCH}")
552552
endif()
553553
554554
elseif(ASRLF_BOOTSTRAPPING_MODE STREQUAL "BOOTSTRAPPING")
@@ -563,7 +563,7 @@ function(_add_swift_runtime_link_flags target relpath_to_lib_dir bootstrapping)
563563
564564
# At runtime link against the built swift libraries from the current
565565
# bootstrapping stage.
566-
set(swift_runtime_rpath "$ORIGIN/${relpath_to_lib_dir}/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}")
566+
set(swift_runtime_rpath "$ORIGIN/${relpath_to_lib_dir}/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}/${SWIFT_HOST_VARIANT_ARCH}")
567567
568568
elseif(ASRLF_BOOTSTRAPPING_MODE STREQUAL "BOOTSTRAPPING-WITH-HOSTLIBS")
569569
message(FATAL_ERROR "BOOTSTRAPPING_MODE 'BOOTSTRAPPING-WITH-HOSTLIBS' not supported on Linux")

cmake/modules/Libdispatch.cmake

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,6 @@ foreach(sdk ${DISPATCH_SDKS})
125125
${CMAKE_COMMAND} -E copy
126126
<INSTALL_DIR>/${LIBDISPATCH_RUNTIME_DIR}/${SWIFT_SDK_${sdk}_SHARED_LIBRARY_PREFIX}BlocksRuntime${SWIFT_SDK_${sdk}_SHARED_LIBRARY_SUFFIX}
127127
${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${arch}/${SWIFT_SDK_${sdk}_SHARED_LIBRARY_PREFIX}BlocksRuntime${SWIFT_SDK_${sdk}_SHARED_LIBRARY_SUFFIX}
128-
COMMAND
129-
${CMAKE_COMMAND} -E copy
130-
<INSTALL_DIR>/${LIBDISPATCH_RUNTIME_DIR}/${SWIFT_SDK_${sdk}_SHARED_LIBRARY_PREFIX}dispatch${SWIFT_SDK_${sdk}_SHARED_LIBRARY_SUFFIX}
131-
${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${SWIFT_SDK_${sdk}_SHARED_LIBRARY_PREFIX}dispatch${SWIFT_SDK_${sdk}_SHARED_LIBRARY_SUFFIX}
132-
COMMAND
133-
${CMAKE_COMMAND} -E copy
134-
<INSTALL_DIR>/${LIBDISPATCH_RUNTIME_DIR}/${SWIFT_SDK_${sdk}_SHARED_LIBRARY_PREFIX}BlocksRuntime${SWIFT_SDK_${sdk}_SHARED_LIBRARY_SUFFIX}
135-
${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${SWIFT_SDK_${sdk}_SHARED_LIBRARY_PREFIX}BlocksRuntime${SWIFT_SDK_${sdk}_SHARED_LIBRARY_SUFFIX}
136128
STEP_TARGETS
137129
install
138130
BUILD_BYPRODUCTS

cmake/modules/SwiftUtils.cmake

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ function(get_bootstrapping_swift_lib_dir bs_lib_dir bootstrapping)
9999
if(BOOTSTRAPPING_MODE STREQUAL "BOOTSTRAPPING")
100100
set(lib_dir
101101
"${SWIFTLIB_DIR}/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}")
102+
if(NOT ${SWIFT_HOST_VARIANT_SDK} IN_LIST SWIFT_DARWIN_PLATFORMS)
103+
set(lib_dir "${lib_dir}/${SWIFT_HOST_VARIANT_ARCH}")
104+
endif()
102105
# If building the stdlib with bootstrapping, the compiler has to pick up
103106
# the swift libraries of the previous bootstrapping level (because in the
104107
# current lib-directory they are not built yet.

docs/Android.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,13 @@ listed when you run the `adb devices` command - **currently this example works o
121121
commands to copy the Swift Android stdlib:
122122

123123
```
124-
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftCore.so /data/local/tmp
125-
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftGlibc.so /data/local/tmp
126-
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftSwiftOnoneSupport.so /data/local/tmp
127-
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftRemoteMirror.so /data/local/tmp
128-
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswift_Concurrency.so /data/local/tmp
129-
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libdispatch.so /data/local/tmp
130-
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libBlocksRuntime.so /data/local/tmp
124+
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/aarch64/libswiftCore.so /data/local/tmp
125+
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/aarch64/libswiftGlibc.so /data/local/tmp
126+
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/aarch64/libswiftSwiftOnoneSupport.so /data/local/tmp
127+
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/aarch64/libswiftRemoteMirror.so /data/local/tmp
128+
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/aarch64/libswift_Concurrency.so /data/local/tmp
129+
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/aarch64/libdispatch.so /data/local/tmp
130+
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/aarch64/libBlocksRuntime.so /data/local/tmp
131131
```
132132

133133
In addition, you'll also need to copy the Android NDK's libc++:

lib/Driver/ToolChains.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1452,6 +1452,11 @@ void ToolChain::getRuntimeLibraryPaths(SmallVectorImpl<std::string> &runtimeLibP
14521452
StringRef SDKPath, bool shared) const {
14531453
SmallString<128> scratchPath;
14541454
getResourceDirPath(scratchPath, args, shared);
1455+
// Since only Darwin doesn't have separate libraries per architecture, link
1456+
// against the architecture-specific version of the library everywhere else.
1457+
if (!getTriple().isOSDarwin())
1458+
llvm::sys::path::append(scratchPath,
1459+
swift::getMajorArchitectureName(getTriple()));
14551460
runtimeLibPaths.push_back(std::string(scratchPath.str()));
14561461

14571462
// If there's a secondary resource dir, add it too.

lib/Driver/WindowsToolChains.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,7 @@ toolchains::Windows::constructInvocation(const DynamicLinkJobAction &job,
118118

119119
for (auto path : RuntimeLibPaths) {
120120
Arguments.push_back("-L");
121-
// Since Windows has separate libraries per architecture, link against the
122-
// architecture specific version of the static library.
123-
Arguments.push_back(context.Args.MakeArgString(path + "/" +
124-
getTriple().getArchName()));
121+
Arguments.push_back(context.Args.MakeArgString(path));
125122
}
126123

127124
SmallString<128> SharedResourceDirPath;

lib/Frontend/CompilerInvocation.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,11 @@ static void updateRuntimeLibraryPaths(SearchPathOptions &SearchPathOpts,
168168
LibSubDir = "maccatalyst";
169169

170170
llvm::sys::path::append(LibPath, LibSubDir);
171+
llvm::SmallString<128> runtimeLibPath = LibPath;
172+
if (!Triple.isOSDarwin())
173+
llvm::sys::path::append(runtimeLibPath, swift::getMajorArchitectureName(Triple));
171174
SearchPathOpts.RuntimeLibraryPaths.clear();
172-
SearchPathOpts.RuntimeLibraryPaths.push_back(std::string(LibPath.str()));
175+
SearchPathOpts.RuntimeLibraryPaths.push_back(std::string(runtimeLibPath.str()));
173176
if (Triple.isOSDarwin())
174177
SearchPathOpts.RuntimeLibraryPaths.push_back(DARWIN_OS_LIBRARY_PATH);
175178

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -803,11 +803,11 @@ function(add_swift_target_library_single target name)
803803
"${SWIFT_SDK_MACCATALYST_LIB_SUBDIR}/${SWIFTLIB_SINGLE_ARCHITECTURE}")
804804
endif()
805805

806-
if ("${SWIFTLIB_SINGLE_BOOTSTRAPPING}" STREQUAL "")
806+
if ("${SWIFTLIB_SINGLE_BOOTSTRAPPING}" STREQUAL "" OR NOT SWIFTLIB_SINGLE_SDK IN_LIST SWIFT_DARWIN_PLATFORMS)
807807
set(output_sub_dir ${SWIFTLIB_SINGLE_SUBDIR})
808808
else()
809809
# In the bootstrapping builds, we only have the single host architecture.
810-
# So generated the library directly in the parent SDK specific directory
810+
# So generate the Darwin library directly in the parent SDK specific directory
811811
# (avoiding to lipo/copy the library).
812812
set(output_sub_dir ${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR})
813813
endif()
@@ -1257,11 +1257,12 @@ function(add_swift_target_library_single target name)
12571257
${SWIFTLIB_SINGLE_C_COMPILE_FLAGS} "-DSWIFT_TARGET_LIBRARY_NAME=${name}")
12581258
set(link_flags ${SWIFTLIB_SINGLE_LINK_FLAGS})
12591259

1260-
set(library_search_subdir "${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
12611260
set(library_search_directories
12621261
"${lib_dir}/${output_sub_dir}"
1263-
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFTLIB_SINGLE_SUBDIR}"
1264-
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
1262+
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFTLIB_SINGLE_SUBDIR}")
1263+
if("${SWIFTLIB_SINGLE_SDK}" IN_LIST SWIFT_DARWIN_PLATFORMS)
1264+
list(APPEND library_search_directories "${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
1265+
endif()
12651266

12661267
# In certain cases when building, the environment variable SDKROOT is set to override
12671268
# where the sdk root is located in the system. If that environment variable has been
@@ -1487,8 +1488,10 @@ function(add_swift_target_library_single target name)
14871488
endif()
14881489
set(library_search_directories
14891490
"${search_base_dir}/${SWIFTLIB_SINGLE_SUBDIR}"
1490-
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFTLIB_SINGLE_SUBDIR}"
1491-
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
1491+
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFTLIB_SINGLE_SUBDIR}")
1492+
if("${SWIFTLIB_SINGLE_SDK}" IN_LIST SWIFT_DARWIN_PLATFORMS)
1493+
list(APPEND library_search_directories "${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
1494+
endif()
14921495
target_link_directories(${target_static} PRIVATE
14931496
${library_search_directories})
14941497
target_link_libraries("${target_static}" PRIVATE
@@ -2377,8 +2380,10 @@ function(add_swift_target_library name)
23772380
if (SWIFTLIB_BACK_DEPLOYMENT_LIBRARY)
23782381
# Back-deployment libraries get installed into a versioned directory.
23792382
set(install_dest "lib${LLVM_LIBDIR_SUFFIX}/${resource_dir}-${SWIFTLIB_BACK_DEPLOYMENT_LIBRARY}/${resource_dir_sdk_subdir}")
2380-
else()
2383+
elseif(sdk STREQUAL WINDOWS OR sdk IN_LIST SWIFT_DARWIN_PLATFORMS)
23812384
set(install_dest "lib${LLVM_LIBDIR_SUFFIX}/${resource_dir}/${resource_dir_sdk_subdir}")
2385+
else()
2386+
set(install_dest "lib${LLVM_LIBDIR_SUFFIX}/${resource_dir}/${resource_dir_sdk_subdir}/${SWIFT_PRIMARY_VARIANT_ARCH}")
23822387
endif()
23832388

23842389
swift_install_in_component(FILES "${UNIVERSAL_LIBRARY_NAME}"
@@ -2454,6 +2459,10 @@ function(add_swift_target_library name)
24542459
"${name}-${library_subdir}-static")
24552460
set(UNIVERSAL_LIBRARY_NAME
24562461
"${universal_subdir}/${library_subdir}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
2462+
set(install_dest "lib${LLVM_LIBDIR_SUFFIX}/${install_subdir}/${resource_dir_sdk_subdir}")
2463+
if(NOT sdk STREQUAL WINDOWS AND NOT sdk IN_LIST SWIFT_DARWIN_PLATFORMS)
2464+
set(install_dest "${install_dest}/${SWIFT_PRIMARY_VARIANT_ARCH}")
2465+
endif()
24572466
_add_swift_lipo_target(SDK
24582467
${sdk}
24592468
TARGET
@@ -2463,7 +2472,7 @@ function(add_swift_target_library name)
24632472
${THIN_INPUT_TARGETS_STATIC})
24642473
add_dependencies(${SWIFTLIB_INSTALL_IN_COMPONENT} ${lipo_target_static})
24652474
swift_install_in_component(FILES "${UNIVERSAL_LIBRARY_NAME}"
2466-
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/${install_subdir}/${resource_dir_sdk_subdir}"
2475+
DESTINATION "${install_dest}"
24672476
PERMISSIONS
24682477
OWNER_READ OWNER_WRITE
24692478
GROUP_READ
@@ -2542,6 +2551,10 @@ function(_add_swift_target_executable_single name)
25422551
# Prepare linker search directories.
25432552
set(library_search_directories
25442553
"${SWIFTLIB_DIR}/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}")
2554+
if(NOT ${SWIFTEXE_SINGLE_SDK} IN_LIST SWIFT_DARWIN_PLATFORMS AND NOT ${SWIFTEXE_SINGLE_SDK} STREQUAL WINDOWS)
2555+
set(library_search_directories
2556+
"${library_search_directories}/${SWIFTEXE_SINGLE_ARCHITECTURE}")
2557+
endif()
25452558

25462559
# Add variant-specific flags.
25472560
_add_target_variant_c_compile_flags(

test/Driver/environment.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44

55
// RUN: %swift_driver_plain -sdk "" -target x86_64-unknown-gnu-linux -L/foo/ -driver-use-frontend-path %S/Inputs/print-var.sh %s LD_LIBRARY_PATH | %FileCheck -check-prefix=CHECK${LD_LIBRARY_PATH+_LAX} %s
66

7-
// CHECK: {{^/foo/:[^:]+/lib/swift/linux$}}
8-
// CHECK_LAX: {{^/foo/:[^:]+/lib/swift/linux}}
7+
// CHECK: {{^/foo/:[^:]+/lib/swift/linux/x86_64$}}
8+
// CHECK_LAX: {{^/foo/:[^:]+/lib/swift/linux/x86_64}}

test/Driver/options-interpreter.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
// CHECK-RESOURCE-DIR-ONLY: # DYLD_LIBRARY_PATH=/RSRC/macosx{{$}}
1919

2020
// RUN: %swift_driver_plain -sdk "" -### -target x86_64-unknown-linux-gnu -resource-dir /RSRC/ %s | %FileCheck -check-prefix=CHECK-RESOURCE-DIR-ONLY-LINUX${LD_LIBRARY_PATH+_LAX} %s
21-
// CHECK-RESOURCE-DIR-ONLY-LINUX: # LD_LIBRARY_PATH=/RSRC/linux{{$}}
22-
// CHECK-RESOURCE-DIR-ONLY-LINUX_LAX: # LD_LIBRARY_PATH=/RSRC/linux{{$|:}}
21+
// CHECK-RESOURCE-DIR-ONLY-LINUX: # LD_LIBRARY_PATH=/RSRC/linux/x86_64{{$}}
22+
// CHECK-RESOURCE-DIR-ONLY-LINUX_LAX: # LD_LIBRARY_PATH=/RSRC/linux/x86_64{{$|:}}
2323

2424
// RUN: %swift_driver_plain -sdk "" -### -target x86_64-apple-macosx10.9 -L/foo/ %s | %FileCheck -check-prefix=CHECK-L %s
2525
// CHECK-L: # DYLD_LIBRARY_PATH={{/foo/:[^:]+/lib/swift/macosx$}}
@@ -59,9 +59,9 @@
5959
// CHECK-COMPLEX-DAG: DYLD_LIBRARY_PATH={{/foo2/:/bar2/:[^:]+/lib/swift/macosx:/sdkroot/usr/lib/swift($| )}}
6060

6161
// RUN: %swift_driver_plain -sdk "" -### -target x86_64-unknown-linux-gnu -L/foo/ %s | %FileCheck -check-prefix=CHECK-L-LINUX${LD_LIBRARY_PATH+_LAX} %s
62-
// CHECK-L-LINUX: # LD_LIBRARY_PATH={{/foo/:[^:]+/lib/swift/linux$}}
63-
// CHECK-L-LINUX_LAX: # LD_LIBRARY_PATH={{/foo/:[^:]+/lib/swift/linux($|:)}}
62+
// CHECK-L-LINUX: # LD_LIBRARY_PATH={{/foo/:[^:]+/lib/swift/linux/x86_64$}}
63+
// CHECK-L-LINUX_LAX: # LD_LIBRARY_PATH={{/foo/:[^:]+/lib/swift/linux/x86_64($|:)}}
6464

6565
// RUN: env LD_LIBRARY_PATH=/abc/ %swift_driver_plain -### -target x86_64-unknown-linux-gnu -L/foo/ -L/bar/ %s | %FileCheck -check-prefix=CHECK-LINUX-COMPLEX${LD_LIBRARY_PATH+_LAX} %s
66-
// CHECK-LINUX-COMPLEX: # LD_LIBRARY_PATH={{/foo/:/bar/:[^:]+/lib/swift/linux:/abc/$}}
67-
// CHECK-LINUX-COMPLEX_LAX: # LD_LIBRARY_PATH={{/foo/:/bar/:[^:]+/lib/swift/linux:/abc/($|:)}}
66+
// CHECK-LINUX-COMPLEX: # LD_LIBRARY_PATH={{/foo/:/bar/:[^:]+/lib/swift/linux/x86_64:/abc/$}}
67+
// CHECK-LINUX-COMPLEX_LAX: # LD_LIBRARY_PATH={{/foo/:/bar/:[^:]+/lib/swift/linux/x86_64:/abc/($|:)}}

0 commit comments

Comments
 (0)