Skip to content

Commit 336c0c2

Browse files
committed
[Driver] Use -platform_version to specify platform versions for the Darwin linker
Standardize the way in which we pass platform version information to the Darwin linker, using the `-platform_version` option. In the case of Mac Catalyst, there may be two such platform arguments. The eventual point of this refactoring is to also pass information about the SDK version, which `-platform_version` supports but the mix of `-*_version_min` parameters do not. For now, the SDK version is stubbed out to 0.0.0, which is this option's "unknown" value. Part of rdar://problem/55972144.
1 parent 9a37a2a commit 336c0c2

File tree

3 files changed

+71
-58
lines changed

3 files changed

+71
-58
lines changed

lib/Driver/DarwinToolChains.cpp

Lines changed: 59 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -484,58 +484,71 @@ toolchains::Darwin::addProfileGenerationArgs(ArgStringList &Arguments,
484484
void
485485
toolchains::Darwin::addDeploymentTargetArgs(ArgStringList &Arguments,
486486
const JobContext &context) const {
487-
const llvm::Triple &Triple = getTriple();
488-
// FIXME: Properly handle deployment targets.
489-
assert(Triple.isiOS() || Triple.isWatchOS() || Triple.isMacOSX());
490-
if (Triple.isiOS()) {
491-
bool isiOSSimulator = tripleIsiOSSimulator(Triple);
492-
if (Triple.isTvOS()) {
493-
if (isiOSSimulator)
494-
Arguments.push_back("-tvos_simulator_version_min");
495-
else
496-
Arguments.push_back("-tvos_version_min");
487+
488+
auto addPlatformVersionArg = [&](const llvm::Triple &triple) {
489+
// Compute the name of the platform for the linker.
490+
const char *platformName;
491+
if (tripleIsMacCatalystEnvironment(triple)) {
492+
platformName = "mac catalyst";
497493
} else {
498-
if (isiOSSimulator)
499-
Arguments.push_back("-ios_simulator_version_min");
500-
else if (tripleIsMacCatalystEnvironment(Triple))
501-
Arguments.push_back("-maccatalyst_version_min");
502-
else
503-
Arguments.push_back("-iphoneos_version_min");
494+
switch (getDarwinPlatformKind(triple)) {
495+
case DarwinPlatformKind::MacOS:
496+
platformName = "macos";
497+
break;
498+
case DarwinPlatformKind::IPhoneOS:
499+
platformName = "ios";
500+
break;
501+
case DarwinPlatformKind::IPhoneOSSimulator:
502+
platformName = "ios-sim";
503+
break;
504+
case DarwinPlatformKind::TvOS:
505+
platformName = "tvos";
506+
break;
507+
case DarwinPlatformKind::TvOSSimulator:
508+
platformName = "tvos-sim";
509+
break;
510+
case DarwinPlatformKind::WatchOS:
511+
platformName = "watchos";
512+
break;
513+
case DarwinPlatformKind::WatchOSSimulator:
514+
platformName = "watchos-sim";
515+
break;
516+
}
504517
}
505-
unsigned major, minor, micro;
506-
Triple.getiOSVersion(major, minor, micro);
507-
addVersionString(context.Args, Arguments, major, minor, micro);
508518

509-
if (TargetVariant) {
510-
assert(triplesAreValidForZippering(Triple, *TargetVariant));
511-
assert(TargetVariant->isMacOSX());
512-
Arguments.push_back("-macosx_version_min");
513-
unsigned major, minor, micro;
514-
TargetVariant->getMacOSXVersion(major, minor, micro);
515-
addVersionString(context.Args, Arguments, major, minor, micro);
516-
}
517-
} else if (Triple.isWatchOS()) {
518-
if (tripleIsWatchSimulator(Triple))
519-
Arguments.push_back("-watchos_simulator_version_min");
520-
else
521-
Arguments.push_back("-watchos_version_min");
519+
// Compute the platform version.
522520
unsigned major, minor, micro;
523-
Triple.getOSVersion(major, minor, micro);
524-
addVersionString(context.Args, Arguments, major, minor, micro);
525-
} else {
526-
Arguments.push_back("-macosx_version_min");
527-
unsigned major, minor, micro;
528-
Triple.getMacOSXVersion(major, minor, micro);
521+
if (tripleIsMacCatalystEnvironment(triple)) {
522+
triple.getiOSVersion(major, minor, micro);
523+
} else {
524+
switch (getDarwinPlatformKind((triple))) {
525+
case DarwinPlatformKind::MacOS:
526+
triple.getMacOSXVersion(major, minor, micro);
527+
break;
528+
case DarwinPlatformKind::IPhoneOS:
529+
case DarwinPlatformKind::IPhoneOSSimulator:
530+
case DarwinPlatformKind::TvOS:
531+
case DarwinPlatformKind::TvOSSimulator:
532+
triple.getiOSVersion(major, minor, micro);
533+
break;
534+
case DarwinPlatformKind::WatchOS:
535+
case DarwinPlatformKind::WatchOSSimulator:
536+
triple.getOSVersion(major, minor, micro);
537+
break;
538+
}
539+
}
540+
541+
Arguments.push_back("-platform_version");
542+
Arguments.push_back(platformName);
529543
addVersionString(context.Args, Arguments, major, minor, micro);
544+
addVersionString(context.Args, Arguments, 0, 0, 0);
545+
};
530546

531-
if (TargetVariant) {
532-
assert(triplesAreValidForZippering(Triple, *TargetVariant));
533-
assert(tripleIsMacCatalystEnvironment(*TargetVariant));
534-
Arguments.push_back("-maccatalyst_version_min");
535-
unsigned major, minor, micro;
536-
TargetVariant->getiOSVersion(major, minor, micro);
537-
addVersionString(context.Args, Arguments, major, minor, micro);
538-
}
547+
addPlatformVersionArg(getTriple());
548+
549+
if (auto targetVariant = getTargetVariant()) {
550+
assert(triplesAreValidForZippering(getTriple(), *targetVariant));
551+
addPlatformVersionArg(*targetVariant);
539552
}
540553
}
541554

test/Driver/linker.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117

118118
// SIMPLE: {{(bin/)?}}ld{{"? }}
119119
// SIMPLE-NOT: -syslibroot
120-
// SIMPLE: -macosx_version_min 10.{{[0-9]+}}.{{[0-9]+}}
120+
// SIMPLE: -platform_version macos 10.{{[0-9]+}}.{{[0-9]+}} 0.0.0
121121
// SIMPLE-NOT: -syslibroot
122122
// SIMPLE: -o linker
123123

@@ -133,7 +133,7 @@
133133
// IOS_SIMPLE-DAG: -L {{[^ ]+(/|\\\\)lib(/|\\\\)swift(/|\\\\)iphonesimulator}}
134134
// IOS_SIMPLE-DAG: -lSystem
135135
// IOS_SIMPLE-DAG: -arch x86_64
136-
// IOS_SIMPLE-DAG: -ios_simulator_version_min 7.1.{{[0-9]+}}
136+
// IOS_SIMPLE-DAG: -platform_version ios-sim 7.1.{{[0-9]+}} 0.0.0
137137
// IOS_SIMPLE: -o linker
138138

139139

@@ -145,7 +145,7 @@
145145
// tvOS_SIMPLE-DAG: -L {{[^ ]+(/|\\\\)lib(/|\\\\)swift(/|\\\\)appletvsimulator}}
146146
// tvOS_SIMPLE-DAG: -lSystem
147147
// tvOS_SIMPLE-DAG: -arch x86_64
148-
// tvOS_SIMPLE-DAG: -tvos_simulator_version_min 9.0.{{[0-9]+}}
148+
// tvOS_SIMPLE-DAG: -platform_version tvos-sim 9.0.{{[0-9]+}} 0.0.0
149149
// tvOS_SIMPLE: -o linker
150150

151151

@@ -157,7 +157,7 @@
157157
// watchOS_SIMPLE-DAG: -L {{[^ ]+(/|\\\\)lib(/|\\\\)swift(/|\\\\)watchsimulator}}
158158
// watchOS_SIMPLE-DAG: -lSystem
159159
// watchOS_SIMPLE-DAG: -arch i386
160-
// watchOS_SIMPLE-DAG: -watchos_simulator_version_min 2.0.{{[0-9]+}}
160+
// watchOS_SIMPLE-DAG: -platform_version watchos-sim 2.0.{{[0-9]+}} 0.0.0
161161
// watchOS_SIMPLE: -o linker
162162

163163

@@ -298,7 +298,7 @@
298298
// COMPLEX-DAG: -L baz
299299
// COMPLEX-DAG: -F garply -F car -F cdr
300300
// COMPLEX-DAG: -undefined dynamic_lookup
301-
// COMPLEX-DAG: -macosx_version_min 10.9.1
301+
// COMPLEX-DAG: -platform_version macos 10.9.1 0.0.0
302302
// COMPLEX: -o sdk.out
303303

304304
// LINUX_DYNLIB-x86_64: swift

test/Driver/macabi-environment.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
// IOS13-MACABI-DAG: -rpath [[MACOSX_STDLIB_PATH]]
1616
// IOS13-MACABI-DAG: -rpath [[MACCATALYST_SDK_STDLIB_PATH]]
1717
// IOS13-MACABI-DAG: -rpath [[MACOSX_SDK_STDLIB_PATH]]
18-
// IOS13-MACABI-DAG: -maccatalyst_version_min 13.0.0
18+
// IOS13-MACABI-DAG: -platform_version "mac catalyst" 13.0.0 0.0.0
1919

2020

2121
// Test using target-variant to build zippered outputs
@@ -29,7 +29,7 @@
2929
// ZIPPERED-VARIANT-LIBRARY: -target x86_64-apple-macosx10.14 -target-variant x86_64-apple-ios13.0-macabi
3030

3131
// ZIPPERED-VARIANT-LIBRARY: bin/ld
32-
// ZIPPERED-VARIANT-LIBRARY: -macosx_version_min 10.14.0 -maccatalyst_version_min 13.0.0
32+
// ZIPPERED-VARIANT-LIBRARY: -platform_version macos 10.14.0 0.0.0 -platform_version "mac catalyst" 13.0.0 0.0.0
3333

3434
// Make sure we pass the -target-variant when creating the pre-compiled header.
3535
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-macosx10.14 -target-variant x86_64-apple-ios13.0-macabi -enable-bridging-pch -import-objc-header %S/Inputs/bridging-header.h %s | %FileCheck -check-prefix=ZIPPERED-VARIANT-PCH %s
@@ -39,7 +39,7 @@
3939
// ZIPPERED-VARIANT-PCH: bin/swift
4040
// ZIPPERED-VARIANT-PCH: -target x86_64-apple-macosx10.14 -target-variant x86_64-apple-ios13.0-macabi
4141
// ZIPPERED-VARIANT-PCH: bin/ld
42-
// ZIPPERED-VARIANT-PCH: -macosx_version_min 10.14.0 -maccatalyst_version_min 13.0.0
42+
// ZIPPERED-VARIANT-PCH: -platform_version macos 10.14.0 0.0.0 -platform_version "mac catalyst" 13.0.0 0.0.0
4343

4444
// Test using 'reverse' target-variant to build zippered outputs when the primary
4545
// target is ios-macabi
@@ -53,7 +53,7 @@
5353
// REVERSE-ZIPPERED-VARIANT-LIBRARY: -target x86_64-apple-ios13.0-macabi -target-variant x86_64-apple-macosx10.14
5454

5555
// REVERSE-ZIPPERED-VARIANT-LIBRARY: bin/ld
56-
// REVERSE-ZIPPERED-VARIANT-LIBRARY: -maccatalyst_version_min 13.0.0 -macosx_version_min 10.14.0
56+
// REVERSE-ZIPPERED-VARIANT-LIBRARY: -platform_version "mac catalyst" 13.0.0 0.0.0 -platform_version macos 10.14.0
5757

5858
// Make sure we pass the -target-variant when creating the pre-compiled header.
5959
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-ios13.0-macabi -target-variant x86_64-apple-macosx10.14 -enable-bridging-pch -import-objc-header %S/Inputs/bridging-header.h %s | %FileCheck -check-prefix=REVERSE-ZIPPERED-VARIANT-PCH %s
@@ -63,7 +63,7 @@
6363
// REVERSE-ZIPPERED-VARIANT-PCH: bin/swift
6464
// REVERSE-ZIPPERED-VARIANT-PCH: -target x86_64-apple-ios13.0-macabi -target-variant x86_64-apple-macosx10.14
6565
// REVERSE-ZIPPERED-VARIANT-PCH: bin/ld
66-
// REVERSE-ZIPPERED-VARIANT-PCH: -maccatalyst_version_min 13.0.0 -macosx_version_min 10.14.0
66+
// REVERSE-ZIPPERED-VARIANT-PCH: -platform_version "mac catalyst" 13.0.0 0.0.0 -platform_version macos 10.14.0 0.0.0
6767

6868
// RUN: not %swiftc_driver -target x86_64-apple-macosx10.14 -target-variant x86_64-apple-ios13.0 %s 2>&1 | %FileCheck --check-prefix=UNSUPPORTED-TARGET-VARIANT %s
6969
// RUN: not %swiftc_driver -target x86_64-apple-ios13.0 -target-variant x86_64-apple-macosx10.14 %s 2>&1 | %FileCheck --check-prefix=UNSUPPORTED-TARGET %s
@@ -73,11 +73,11 @@
7373

7474
// When compiling for iOS, pass iphoneos_version_min to the linker, not maccatalyst_version_min.
7575

76-
// RUN: %swiftc_driver -driver-print-jobs -target arm64-apple-ios13.0 -sdk %S/../Inputs/clang-importer-sdk %s | %FileCheck -check-prefix=IOS13-NO-MACABI -implicit-check-not=maccatalyst_version_min %s
76+
// RUN: %swiftc_driver -driver-print-jobs -target arm64-apple-ios13.0 -sdk %S/../Inputs/clang-importer-sdk %s | %FileCheck -check-prefix=IOS13-NO-MACABI -implicit-check-not="mac catalyst" %s
7777
// IOS13-NO-MACABI: bin/swift
7878
// IOS13-NO-MACABI: -target arm64-apple-ios13.0
7979

8080
// IOS13-NO-MACABI: bin/ld
8181
// IOS13-NO-MACABI-DAG: -L {{[^ ]+/lib/swift/iphoneos}}
8282
// IOS13-NO-MACABI-DAG: -L {{[^ ]+/clang-importer-sdk/usr/lib/swift}}
83-
// IOS13-NO-MACABI-DAG: -iphoneos_version_min 13.0.0
83+
// IOS13-NO-MACABI-DAG: -platform_version ios 13.0.0

0 commit comments

Comments
 (0)