Skip to content

Commit 955598c

Browse files
sbogolepovSpace Team
authored andcommitted
[K/N] Pick minimal iOS/tvOS depending on the Xcode version
ld from Xcode 15 beta 5 incorrectly parses dylib version if it was built with version < 12.0. In the master branch we simply solved the problem by bumping minOsVersion to 12.0. However, in 1.9.10 we have to support both Xcode 14 as well as Xcode 15. Thus, we a added a bit of logic that checks Xcode version and sets minOsVersion depending on it. ^KT-60758
1 parent b1aa582 commit 955598c

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

kotlin-native/konan/konan.properties

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ minVersion.tvos = 9.0
9090
# 7.0 for watchos_x64, watchos_simulator_arm64
9191
minVersion.watchos = 5.0
9292

93+
# Workaround for Xcode 15. See KT-60758
94+
minVersionSinceXcode15.ios = 12.0
95+
minVersionSinceXcode15.tvos = 12.0
96+
9397
toolchainDependency.mingw_x64 = msys2-mingw-w64-x86_64-2
9498
toolchainDependency.mingw_x86 = msys2-mingw-w64-i686-2
9599
toolchainDependency.linux_x64 = x86_64-unknown-linux-gnu-gcc-8.3.0-glibc-2.19-kernel-4.9-2
@@ -244,6 +248,7 @@ linkerDynamicFlags.ios_arm64 = -dylib
244248
linkerKonanFlags.ios_arm64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit
245249
linkerOptimizationFlags.ios_arm64 = -dead_strip
246250
osVersionMin.ios_arm64 = $minVersion.ios
251+
osVersionMinSinceXcode15.ios_arm64 = $minVersionSinceXcode15.ios
247252
sdkVersion.ios_arm64 = $sdkVersion.ios
248253
osVersionMinFlagLd.ios_arm64 = -ios_version_min
249254

@@ -270,6 +275,7 @@ linkerNoDebugFlags.ios_x64 = -S
270275
stripFlags.ios_x64 = -S
271276
linkerDynamicFlags.ios_x64 = -dylib
272277
osVersionMin.ios_x64 = $minVersion.ios
278+
osVersionMinSinceXcode15.ios_x64 = $minVersionSinceXcode15.ios
273279
sdkVersion.ios_x64 = $sdkVersion.ios
274280
osVersionMinFlagLd.ios_x64 = -ios_simulator_version_min
275281

@@ -295,6 +301,7 @@ linkerNoDebugFlags.ios_simulator_arm64 = -S
295301
stripFlags.ios_simulator_arm64 = -S
296302
linkerDynamicFlags.ios_simulator_arm64 = -dylib
297303
osVersionMin.ios_simulator_arm64 = $minVersion.ios
304+
osVersionMinSinceXcode15.ios_simulator_arm64 = $minVersionSinceXcode15.ios
298305
sdkVersion.ios_simulator_arm64 = $sdkVersion.ios
299306
osVersionMinFlagLd.ios_simulator_arm64 = -ios_simulator_version_min
300307

@@ -320,6 +327,7 @@ linkerNoDebugFlags.tvos_x64 = -S
320327
stripFlags.tvos_x64 = -S
321328
linkerDynamicFlags.tvos_x64 = -dylib
322329
osVersionMin.tvos_x64 = $minVersion.tvos
330+
osVersionMinSinceXcode15.tvos_x64 = $minVersionSinceXcode15.tvos
323331
sdkVersion.tvos_x64 = $sdkVersion.tvos
324332
osVersionMinFlagLd.tvos_x64 = -tvos_simulator_version_min
325333

@@ -344,6 +352,7 @@ linkerNoDebugFlags.tvos_simulator_arm64 = -S
344352
stripFlags.tvos_simulator_arm64 = -S
345353
linkerDynamicFlags.tvos_simulator_arm64 = -dylib
346354
osVersionMin.tvos_simulator_arm64 = $minVersion.tvos
355+
osVersionMinSinceXcode15.tvos_simulator_arm64 = $minVersionSinceXcode15.tvos
347356
sdkVersion.tvos_simulator_arm64 = $sdkVersion.tvos
348357
osVersionMinFlagLd.tvos_simulator_arm64 = -tvos_simulator_version_min
349358

@@ -368,6 +377,7 @@ linkerDynamicFlags.tvos_arm64 = -dylib
368377
linkerKonanFlags.tvos_arm64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit
369378
linkerOptimizationFlags.tvos_arm64 = -dead_strip
370379
osVersionMin.tvos_arm64 = $minVersion.tvos
380+
osVersionMinSinceXcode15.tvos_arm64 = $minVersionSinceXcode15.tvos
371381
sdkVersion.tvos_arm64 = $sdkVersion.tvos
372382
osVersionMinFlagLd.tvos_arm64 = -tvos_version_min
373383

native/utils/src/org/jetbrains/kotlin/konan/target/Apple.kt

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,24 @@ class AppleConfigurablesImpl(
3636
XcodePartsProvider.InternalServer -> absolute(sdkDependency)
3737
}
3838

39+
override val osVersionMin: String by lazy {
40+
// A hack only for 1.9.10 where we need to keep the old defaults for Xcode 14 (min version 9.0)
41+
// and the new ones for Xcode 15 (min version 12.0).
42+
if (target.family == Family.IOS || target.family == Family.TVOS) {
43+
when (val xcodePartsProvider1 = xcodePartsProvider) {
44+
is XcodePartsProvider.Local -> {
45+
if (checkXcodeVersion("15.0.0", xcodePartsProvider1.xcode.version)) {
46+
return@lazy targetString("osVersionMinSinceXcode15")!!
47+
}
48+
}
49+
is XcodePartsProvider.InternalServer -> {
50+
// Build server case. Here we use Xcode 14, so we don't need a workaround here.
51+
}
52+
}
53+
}
54+
super.osVersionMin
55+
}
56+
3957
override val absoluteTargetToolchain: String get() = when (val provider = xcodePartsProvider) {
4058
is XcodePartsProvider.Local -> provider.xcode.toolchain
4159
XcodePartsProvider.InternalServer -> absolute(toolchainDependency)
@@ -60,15 +78,25 @@ class AppleConfigurablesImpl(
6078
if (properties.getProperty("ignoreXcodeVersionCheck") != "true") {
6179
properties.getProperty("minimalXcodeVersion")?.let { minimalXcodeVersion ->
6280
val currentXcodeVersion = xcode.version
63-
checkXcodeVersion(minimalXcodeVersion, currentXcodeVersion)
81+
if (!checkXcodeVersion(minimalXcodeVersion, currentXcodeVersion)) {
82+
error("Unsupported Xcode version $currentXcodeVersion, minimal supported version is $minimalXcodeVersion.")
83+
}
6484
}
6585
}
6686

6787
XcodePartsProvider.Local(xcode)
6888
}
6989
}
7090

71-
private fun checkXcodeVersion(minimalVersion: String, currentVersion: String) {
91+
/**
92+
* Checks if the current Xcode version meets the minimal version requirement.
93+
*
94+
* @param minimalVersion The minimal Xcode version to check against.
95+
* @param currentVersion The current Xcode version.
96+
* @return true if the current Xcode version is greater than or equal to the minimal version,
97+
* false otherwise.
98+
*/
99+
private fun checkXcodeVersion(minimalVersion: String, currentVersion: String): Boolean {
72100
// Xcode versions contain only numbers (even betas).
73101
// But we still split by '-' and whitespaces to take into account versions like 11.2-beta.
74102
val minimalVersionParts = minimalVersion.split("(\\s+|\\.|-)".toRegex()).map { it.toIntOrNull() ?: 0 }
@@ -80,11 +108,11 @@ class AppleConfigurablesImpl(
80108
val minimalPart = minimalVersionParts.getOrElse(i) { 0 }
81109

82110
when {
83-
currentPart > minimalPart -> return
84-
currentPart < minimalPart ->
85-
error("Unsupported Xcode version $currentVersion, minimal supported version is $minimalVersion.")
111+
currentPart > minimalPart -> return true
112+
currentPart < minimalPart -> return false
86113
}
87114
}
115+
return true
88116
}
89117

90118
private sealed class XcodePartsProvider {

0 commit comments

Comments
 (0)