|
2 | 2 | //
|
3 | 3 | // This source file is part of the Swift.org open source project
|
4 | 4 | //
|
5 |
| -// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| 5 | +// Copyright (c) 2014 - 2024 Apple Inc. and the Swift project authors |
6 | 6 | // Licensed under Apache License v2.0 with Runtime Library Exception
|
7 | 7 | //
|
8 | 8 | // See https://swift.org/LICENSE.txt for license information
|
|
19 | 19 |
|
20 | 20 | #if defined(__APPLE__) && defined(__MACH__) && SWIFT_STDLIB_SUPPORT_BACK_DEPLOYMENT
|
21 | 21 |
|
22 |
| -#include <Availability.h> |
| 22 | +#include <mach-o/loader.h> |
23 | 23 | #include <TargetConditionals.h>
|
24 | 24 | #include "swift/shims/Visibility.h"
|
25 | 25 |
|
26 |
| -#define RPATH_INSTALL_NAME_DIRECTIVE_IMPL2(name, major, minor) \ |
27 |
| - SWIFT_RUNTIME_EXPORT const char install_name_ ## major ## _ ## minor \ |
28 |
| - __asm("$ld$install_name$os" #major "." #minor "$@rpath/lib" #name ".dylib"); \ |
29 |
| - const char install_name_ ## major ## _ ## minor = 0; |
| 26 | +// Swift was supported as an embedded library in macOS (née OS X) 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0. |
| 27 | +// It became part of the OS in macOS 10.14.4, iOS 12.2, watchOS 5.2, tvOS 12.2. Projects can continue |
| 28 | +// to embed Swift, but the linker will see the OS version and try to link on that by default. In order |
| 29 | +// to support back deployment, add a magic symbol to the OS library so that back deployment will link |
| 30 | +// on the embedded library instead. When running on a newer OS, the OS version of the library will be |
| 31 | +// used due to Xcode inserting a runpath search path of /usr/lib/swift based on the deployment target |
| 32 | +// being less than SupportedTargets[target][SwiftOSRuntimeMinimumDeploymentTarget] in SDKSettings.plist. |
30 | 33 |
|
31 |
| -#define RPATH_INSTALL_NAME_DIRECTIVE_IMPL(name, major, minor) \ |
32 |
| - RPATH_INSTALL_NAME_DIRECTIVE_IMPL2(name, major, minor) |
| 34 | +// The linker uses a specially formatted symbol to do the back deployment: |
| 35 | +// $ld$previous$<install-name>$<compatibility-version>$<platform>$<start-version>$<end-version>$<symbol-name>$ |
| 36 | +// compatibility-version and symbol-name are left off to apply to all library versions and symbols. |
| 37 | +// This symbol isn't a legal C identifier, so it needs to be specified with __asm. |
| 38 | +#define RPATH_PREVIOUS_DIRECTIVE_IMPL(name, platform, startVersion, endVersion) \ |
| 39 | + SWIFT_RUNTIME_EXPORT const char ld_previous_ ## platform \ |
| 40 | + __asm("$ld$previous$@rpath/lib" __STRING(name) ".dylib$$" __STRING(platform) "$" __STRING(startVersion) "$" __STRING(endVersion) "$$"); \ |
| 41 | + const char ld_previous_ ## platform = 0; |
| 42 | +// Using the __STRING macro is important so that name and platform get expanded before being |
| 43 | +// stringified. The versions could just be #version, __STRING is only used for consistency. |
33 | 44 |
|
34 |
| -#define RPATH_INSTALL_NAME_DIRECTIVE(major, minor) \ |
35 |
| - RPATH_INSTALL_NAME_DIRECTIVE_IMPL(SWIFT_TARGET_LIBRARY_NAME, major, minor) |
| 45 | +#define RPATH_PREVIOUS_DIRECTIVE(platform, startVersion, endVersion) \ |
| 46 | + RPATH_PREVIOUS_DIRECTIVE_IMPL(SWIFT_TARGET_LIBRARY_NAME, platform, startVersion, endVersion) |
36 | 47 |
|
37 |
| - |
38 |
| -#if TARGET_OS_WATCH |
39 |
| - // Check watchOS first, because TARGET_OS_IPHONE includes watchOS. |
40 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 2, 0) |
41 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 2, 1) |
42 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 2, 2) |
43 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 3, 0) |
44 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 3, 1) |
45 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 3, 2) |
46 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 4, 0) |
47 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 4, 1) |
48 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 4, 2) |
49 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 4, 3) |
50 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 5, 0) |
51 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 5, 1) |
52 |
| -#elif TARGET_OS_IPHONE |
53 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 7, 0) |
54 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 7, 1) |
55 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 8, 0) |
56 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 8, 1) |
57 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 8, 2) |
58 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 8, 3) |
59 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 8, 4) |
60 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 9, 0) |
61 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 9, 1) |
62 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 9, 2) |
63 |
| - RPATH_INSTALL_NAME_DIRECTIVE( 9, 3) |
64 |
| - RPATH_INSTALL_NAME_DIRECTIVE(10, 0) |
65 |
| - RPATH_INSTALL_NAME_DIRECTIVE(10, 1) |
66 |
| - RPATH_INSTALL_NAME_DIRECTIVE(10, 2) |
67 |
| - RPATH_INSTALL_NAME_DIRECTIVE(10, 3) |
68 |
| - RPATH_INSTALL_NAME_DIRECTIVE(11, 0) |
69 |
| - RPATH_INSTALL_NAME_DIRECTIVE(11, 1) |
70 |
| - RPATH_INSTALL_NAME_DIRECTIVE(11, 2) |
71 |
| - RPATH_INSTALL_NAME_DIRECTIVE(11, 3) |
72 |
| - RPATH_INSTALL_NAME_DIRECTIVE(11, 4) |
73 |
| - RPATH_INSTALL_NAME_DIRECTIVE(12, 0) |
74 |
| - RPATH_INSTALL_NAME_DIRECTIVE(12, 1) |
75 |
| -#elif TARGET_OS_OSX |
76 |
| - RPATH_INSTALL_NAME_DIRECTIVE(10, 9) |
77 |
| - RPATH_INSTALL_NAME_DIRECTIVE(10, 10) |
78 |
| - RPATH_INSTALL_NAME_DIRECTIVE(10, 11) |
79 |
| - RPATH_INSTALL_NAME_DIRECTIVE(10, 12) |
80 |
| - RPATH_INSTALL_NAME_DIRECTIVE(10, 13) |
81 |
| - |
82 |
| - // When building with a deployment target of < macOS 10.14, |
83 |
| - // treat macOS 10.14 as an "older OS." |
84 |
| -#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_14 |
85 |
| - RPATH_INSTALL_NAME_DIRECTIVE(10, 14) |
| 48 | +#if TARGET_OS_OSX || TARGET_OS_MACCATALYST |
| 49 | +RPATH_PREVIOUS_DIRECTIVE(PLATFORM_MACOS, 10.9, 10.14.4) |
| 50 | +#elif TARGET_OS_IOS && !TARGET_OS_VISION |
| 51 | +#if TARGET_OS_SIMULATOR |
| 52 | +RPATH_PREVIOUS_DIRECTIVE(PLATFORM_IOSSIMULATOR, 7.0, 12.2) |
| 53 | +#else |
| 54 | +RPATH_PREVIOUS_DIRECTIVE(PLATFORM_IOS, 7.0, 12.2) |
86 | 55 | #endif
|
87 |
| - |
| 56 | +#elif TARGET_OS_WATCH |
| 57 | +#if TARGET_OS_SIMULATOR |
| 58 | +RPATH_PREVIOUS_DIRECTIVE(PLATFORM_WATCHOSSIMULATOR, 2.0, 5.2) |
88 | 59 | #else
|
89 |
| - #error Unknown target. |
| 60 | +RPATH_PREVIOUS_DIRECTIVE(PLATFORM_WATCHOS, 2.0, 5.2) |
| 61 | +#endif |
| 62 | +#elif TARGET_OS_TV |
| 63 | +#if TARGET_OS_SIMULATOR |
| 64 | +RPATH_PREVIOUS_DIRECTIVE(PLATFORM_TVOSSIMULATOR, 9.0, 12.2) |
| 65 | +#else |
| 66 | +RPATH_PREVIOUS_DIRECTIVE(PLATFORM_TVOS, 9.0, 12.2) |
| 67 | +#endif |
90 | 68 | #endif
|
| 69 | +// Swift wasn't supported as an embedded library in any other OS, so no need to create back deployment |
| 70 | +// symbols for any of the other ones. |
91 | 71 |
|
92 | 72 | #endif // defined(__APPLE__) && defined(__MACH__) && SWIFT_STDLIB_SUPPORT_BACK_DEPLOYMENT
|
0 commit comments