From 9daa40d2ed21b3f4801bfa942bb8bd3363f8eac0 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Thu, 6 Jul 2023 15:00:17 +0300 Subject: [PATCH] [K/N] Use platform_version instead of sdk_version and os_version_min --- kotlin-native/konan/konan.properties | 93 ++++++++++--------- .../kotlin/konan/target/Configurables.kt | 2 +- .../jetbrains/kotlin/konan/target/Linker.kt | 28 +++++- 3 files changed, 73 insertions(+), 50 deletions(-) diff --git a/kotlin-native/konan/konan.properties b/kotlin-native/konan/konan.properties index e8ec08f0d95..1a85fd4d00e 100644 --- a/kotlin-native/konan/konan.properties +++ b/kotlin-native/konan/konan.properties @@ -77,6 +77,18 @@ llvmVersion.mingw_x64 = 11.1.0 llvmVersion.macos_x64 = 11.1.0 llvmVersion.macos_arm64 = 11.1.0 +sdkVersion.ios = 16.1 +sdkVersion.macos = 13.1 +sdkVersion.tvos = 16.1 +sdkVersion.watchos = 9.1 + +minVersion.ios = 9.0 +minVersion.macos = 11.0 +minVersion.tvos = 9.0 +# 9.0 for watchos_device_arm64 +# 7.0 for watchos_x64, watchos_simulator_arm64 +minVersion.watchos = 5.0 + toolchainDependency.mingw_x64 = msys2-mingw-w64-x86_64-2 toolchainDependency.mingw_x86 = msys2-mingw-w64-i686-2 toolchainDependency.linux_x64 = x86_64-unknown-linux-gnu-gcc-8.3.0-glibc-2.19-kernel-4.9-2 @@ -122,14 +134,13 @@ clangNooptFlags.macos_x64 = -O1 clangOptFlags.macos_x64 = -O3 clangDebugFlags.macos_x64 = -O0 -linkerKonanFlags.macos_x64 = -lSystem -lc++ -lobjc -framework Foundation -sdk_version 13.0.0 +linkerKonanFlags.macos_x64 = -lSystem -lc++ -lobjc -framework Foundation linkerOptimizationFlags.macos_x64 = -dead_strip linkerNoDebugFlags.macos_x64 = -S stripFlags.macos_x64 = -S linkerDynamicFlags.macos_x64 = -dylib - -osVersionMinFlagLd.macos_x64 = -macosx_version_min -osVersionMin.macos_x64 = 10.13 +osVersionMin.macos_x64 = $minVersion.macos +sdkVersion.macos_x64 = $sdkVersion.macos dependencies.macos_x64 = \ lldb-4-macos @@ -161,14 +172,13 @@ clangOptFlags.macos_arm64 = -O3 # TODO: Is it still necessary? clangDebugFlags.macos_arm64 = -O0 -mllvm -fast-isel=false -mllvm -global-isel=false -linkerKonanFlags.macos_arm64 = -lSystem -lc++ -lobjc -framework Foundation -sdk_version 13.0.0 +linkerKonanFlags.macos_arm64 = -lSystem -lc++ -lobjc -framework Foundation linkerOptimizationFlags.macos_arm64 = -dead_strip linkerNoDebugFlags.macos_arm64 = -S stripFlags.macos_arm64 = -S linkerDynamicFlags.macos_arm64 = -dylib - -osVersionMinFlagLd.macos_arm64 = -macosx_version_min -osVersionMin.macos_arm64 = 11.0 +osVersionMin.macos_arm64 = $minVersion.macos +sdkVersion.macos_arm64 = $sdkVersion.macos dependencies.macos_arm64 = \ lldb-4-macos @@ -202,13 +212,10 @@ llvmInlineThreshold.ios_arm32 = 50 linkerNoDebugFlags.ios_arm32 = -S stripFlags.ios_arm32 = -S linkerDynamicFlags.ios_arm32 = -dylib -linkerKonanFlags.ios_arm32 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit -sdk_version 15.0 +linkerKonanFlags.ios_arm32 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit linkerOptimizationFlags.ios_arm32 = -dead_strip -osVersionMinFlagLd.ios_arm32 = -iphoneos_version_min osVersionMin.ios_arm32 = 9.0 - - # Apple's 64-bit iOS. targetToolchain.macos_x64-ios_arm64 = target-toolchain-xcode_14_1_rc2 targetToolchain.macos_arm64-ios_arm64 = target-toolchain-xcode_14_1_rc2 @@ -230,10 +237,10 @@ clangDebugFlags.ios_arm64 = -O0 -mllvm -fast-isel=false -mllvm -global-isel=fals linkerNoDebugFlags.ios_arm64 = -S stripFlags.ios_arm64 = -S linkerDynamicFlags.ios_arm64 = -dylib -linkerKonanFlags.ios_arm64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit -sdk_version 16.1 +linkerKonanFlags.ios_arm64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit linkerOptimizationFlags.ios_arm64 = -dead_strip -osVersionMinFlagLd.ios_arm64 = -iphoneos_version_min -osVersionMin.ios_arm64 = 9.0 +osVersionMin.ios_arm64 = $minVersion.ios +sdkVersion.ios_arm64 = $sdkVersion.ios additionalCacheFlags.ios_arm64 = -Xembed-bitcode-marker @@ -252,13 +259,13 @@ clangNooptFlags.ios_x64 = -O1 clangOptFlags.ios_x64 = -O3 clangDebugFlags.ios_x64 = -O0 -linkerKonanFlags.ios_x64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit -sdk_version 16.1 +linkerKonanFlags.ios_x64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit linkerOptimizationFlags.ios_x64 = -dead_strip linkerNoDebugFlags.ios_x64 = -S stripFlags.ios_x64 = -S linkerDynamicFlags.ios_x64 = -dylib -osVersionMinFlagLd.ios_x64 = -ios_simulator_version_min -osVersionMin.ios_x64 = 9.0 +osVersionMin.ios_x64 = $minVersion.ios +sdkVersion.ios_x64 = $sdkVersion.ios # iOS simulator on Apple Silicon @@ -277,13 +284,13 @@ clangNooptFlags.ios_simulator_arm64 = -O1 clangOptFlags.ios_simulator_arm64 = -O3 clangDebugFlags.ios_simulator_arm64 = -O0 -mllvm -fast-isel=false -mllvm -global-isel=false -linkerKonanFlags.ios_simulator_arm64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit -sdk_version 16.1 +linkerKonanFlags.ios_simulator_arm64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit linkerOptimizationFlags.ios_simulator_arm64 = -dead_strip linkerNoDebugFlags.ios_simulator_arm64 = -S stripFlags.ios_simulator_arm64 = -S linkerDynamicFlags.ios_simulator_arm64 = -dylib -osVersionMinFlagLd.ios_simulator_arm64 = -ios_simulator_version_min -osVersionMin.ios_simulator_arm64 = 9.0 +osVersionMin.ios_simulator_arm64 = $minVersion.ios +sdkVersion.ios_simulator_arm64 = $sdkVersion.ios # Apple's tvOS simulator. @@ -301,13 +308,13 @@ clangNooptFlags.tvos_x64 = -O1 clangOptFlags.tvos_x64 = -O3 clangDebugFlags.tvos_x64 = -O0 -linkerKonanFlags.tvos_x64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit -sdk_version 16.1 +linkerKonanFlags.tvos_x64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit linkerOptimizationFlags.tvos_x64 = -dead_strip linkerNoDebugFlags.tvos_x64 = -S stripFlags.tvos_x64 = -S linkerDynamicFlags.tvos_x64 = -dylib -osVersionMinFlagLd.tvos_x64 = -tvos_simulator_version_min -osVersionMin.tvos_x64 = 9.0 +osVersionMin.tvos_x64 = $minVersion.tvos +sdkVersion.tvos_x64 = $sdkVersion.tvos # Apple's tvOS simulator. @@ -325,13 +332,13 @@ clangNooptFlags.tvos_simulator_arm64 = -O1 clangOptFlags.tvos_simulator_arm64 = -O3 clangDebugFlags.tvos_simulator_arm64 = -O0 -mllvm -fast-isel=false -mllvm -global-isel=false -linkerKonanFlags.tvos_simulator_arm64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit -sdk_version 16.1 +linkerKonanFlags.tvos_simulator_arm64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit linkerOptimizationFlags.tvos_simulator_arm64 = -dead_strip linkerNoDebugFlags.tvos_simulator_arm64 = -S stripFlags.tvos_simulator_arm64 = -S linkerDynamicFlags.tvos_simulator_arm64 = -dylib -osVersionMinFlagLd.tvos_simulator_arm64 = -tvos_simulator_version_min -osVersionMin.tvos_simulator_arm64 = 9.0 +osVersionMin.tvos_simulator_arm64 = $minVersion.tvos +sdkVersion.tvos_simulator_arm64 = $sdkVersion.tvos # Apple's 64-bit tvOS. @@ -352,10 +359,10 @@ clangDebugFlags.tvos_arm64 = -O0 -mllvm -fast-isel=false -mllvm -global-isel=fal linkerNoDebugFlags.tvos_arm64 = -S stripFlags.tvos_arm64 = -S linkerDynamicFlags.tvos_arm64 = -dylib -linkerKonanFlags.tvos_arm64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit -sdk_version 16.1 +linkerKonanFlags.tvos_arm64 = -lSystem -lc++ -lobjc -framework Foundation -framework UIKit linkerOptimizationFlags.tvos_arm64 = -dead_strip -osVersionMinFlagLd.tvos_arm64 = -tvos_version_min -osVersionMin.tvos_arm64 = 9.0 +osVersionMin.tvos_arm64 = $minVersion.tvos +sdkVersion.tvos_arm64 = $sdkVersion.tvos # watchOS armv7k @@ -374,13 +381,13 @@ clangOptFlags.watchos_arm32 = -O3 clangDebugFlags.watchos_arm32 = -O0 llvmInlineThreshold.watchos_arm32 = 50 -linkerKonanFlags.watchos_arm32 = -lSystem -lc++ -lobjc -framework Foundation -sdk_version 9.1 +linkerKonanFlags.watchos_arm32 = -lSystem -lc++ -lobjc -framework Foundation linkerOptimizationFlags.watchos_arm32 = -dead_strip linkerNoDebugFlags.watchos_arm32 = -S stripFlags.watchos_arm32 = -S linkerDynamicFlags.watchos_arm32 = -dylib -osVersionMinFlagLd.watchos_arm32 = -watchos_version_min -osVersionMin.watchos_arm32 = 5.0 +osVersionMin.watchos_arm32 = $minVersion.watchos +sdkVersion.watchos_arm32 = $sdkVersion.watchos # watchOS arm64_32 @@ -396,13 +403,13 @@ clangNooptFlags.watchos_arm64 = -O1 clangOptFlags.watchos_arm64 = -O3 clangDebugFlags.watchos_arm64 = -O0 -mllvm -fast-isel=false -mllvm -global-isel=false -linkerKonanFlags.watchos_arm64 = -lSystem -lc++ -lobjc -framework Foundation -sdk_version 9.1 +linkerKonanFlags.watchos_arm64 = -lSystem -lc++ -lobjc -framework Foundation linkerOptimizationFlags.watchos_arm64 = -dead_strip linkerNoDebugFlags.watchos_arm64 = -S stripFlags.watchos_arm64 = -S linkerDynamicFlags.watchos_arm64 = -dylib -osVersionMinFlagLd.watchos_arm64 = -watchos_version_min osVersionMin.watchos_arm64 = 5.0 +sdkVersion.watchos_arm64 = $sdkVersion.watchos # watchOS arm64 targetToolchain.macos_x64-watchos_device_arm64 = target-toolchain-xcode_14_1_rc2 @@ -416,13 +423,13 @@ clangNooptFlags.watchos_device_arm64 = -O1 clangOptFlags.watchos_device_arm64 = -O3 clangDebugFlags.watchos_device_arm64 = -O0 -mllvm -fast-isel=false -mllvm -global-isel=false -linkerKonanFlags.watchos_device_arm64 = -lSystem -lc++ -lobjc -framework Foundation -sdk_version 9.1 +linkerKonanFlags.watchos_device_arm64 = -lSystem -lc++ -lobjc -framework Foundation linkerOptimizationFlags.watchos_device_arm64 = -dead_strip linkerNoDebugFlags.watchos_device_arm64 = -S stripFlags.watchos_device_arm64 = -S linkerDynamicFlags.watchos_device_arm64 = -dylib -osVersionMinFlagLd.watchos_device_arm64 = -watchos_version_min osVersionMin.watchos_device_arm64 = 9.0 +sdkVersion.watchos_device_arm64 = $sdkVersion.watchos # Apple's watchOS i386 simulator. @@ -441,15 +448,13 @@ clangNooptFlags.watchos_x86 = -O1 clangOptFlags.watchos_x86 = -O3 clangDebugFlags.watchos_x86 = -O0 -linkerKonanFlags.watchos_x86 = -lSystem -lc++ -lobjc -framework Foundation -sdk_version 8.0 +linkerKonanFlags.watchos_x86 = -lSystem -lc++ -lobjc -framework Foundation linkerOptimizationFlags.watchos_x86 = -dead_strip linkerNoDebugFlags.watchos_x86 = -S stripFlags.watchos_x86 = -S linkerDynamicFlags.watchos_x86 = -dylib -osVersionMinFlagLd.watchos_x86 = -watchos_simulator_version_min osVersionMin.watchos_x86 = 5.0 - # watchOS x86_64 simulator. targetToolchain.macos_x64-watchos_x64 = target-toolchain-xcode_14_1_rc2 targetToolchain.macos_arm64-watchos_x64 = target-toolchain-xcode_14_1_rc2 @@ -465,13 +470,13 @@ clangNooptFlags.watchos_x64 = -O1 clangOptFlags.watchos_x64 = -O3 clangDebugFlags.watchos_x64 = -O0 -linkerKonanFlags.watchos_x64 = -lSystem -lc++ -lobjc -framework Foundation -sdk_version 9.1 +linkerKonanFlags.watchos_x64 = -lSystem -lc++ -lobjc -framework Foundation linkerOptimizationFlags.watchos_x64 = -dead_strip linkerNoDebugFlags.watchos_x64 = -S stripFlags.watchos_x64 = -S linkerDynamicFlags.watchos_x64 = -dylib -osVersionMinFlagLd.watchos_x64 = -watchos_simulator_version_min osVersionMin.watchos_x64 = 7.0 +sdkVersion.watchos_x64 = $sdkVersion.watchos # watchOS Apple Silicon simulator. @@ -489,13 +494,13 @@ clangNooptFlags.watchos_simulator_arm64 = -O1 clangOptFlags.watchos_simulator_arm64 = -O3 clangDebugFlags.watchos_simulator_arm64 = -O0 -mllvm -fast-isel=false -mllvm -global-isel=false -linkerKonanFlags.watchos_simulator_arm64 = -lSystem -lc++ -lobjc -framework Foundation -sdk_version 9.1 +linkerKonanFlags.watchos_simulator_arm64 = -lSystem -lc++ -lobjc -framework Foundation linkerOptimizationFlags.watchos_simulator_arm64 = -dead_strip linkerNoDebugFlags.watchos_simulator_arm64 = -S stripFlags.watchos_simulator_arm64 = -S linkerDynamicFlags.watchos_simulator_arm64 = -dylib -osVersionMinFlagLd.watchos_simulator_arm64 = -watchos_simulator_version_min osVersionMin.watchos_simulator_arm64 = 7.0 +sdkVersion.watchos_simulator_arm64 = $sdkVersion.watchos diff --git a/native/utils/src/org/jetbrains/kotlin/konan/target/Configurables.kt b/native/utils/src/org/jetbrains/kotlin/konan/target/Configurables.kt index 47c6b79cbee..eb95363e50d 100644 --- a/native/utils/src/org/jetbrains/kotlin/konan/target/Configurables.kt +++ b/native/utils/src/org/jetbrains/kotlin/konan/target/Configurables.kt @@ -98,7 +98,7 @@ interface ConfigurablesWithEmulator : Configurables { interface AppleConfigurables : Configurables, ClangFlags { val arch get() = targetTriple.architecture val osVersionMin get() = targetString("osVersionMin")!! - val osVersionMinFlagLd get() = targetString("osVersionMinFlagLd")!! + val sdkVersion get() = targetString("sdkVersion")!! val stripFlags get() = targetList("stripFlags") val additionalToolsDir get() = hostString("additionalToolsDir") val absoluteAdditionalToolsDir get() = absolute(additionalToolsDir) diff --git a/native/utils/src/org/jetbrains/kotlin/konan/target/Linker.kt b/native/utils/src/org/jetbrains/kotlin/konan/target/Linker.kt index a8eede16f4a..82e1a2b1f67 100644 --- a/native/utils/src/org/jetbrains/kotlin/konan/target/Linker.kt +++ b/native/utils/src/org/jetbrains/kotlin/konan/target/Linker.kt @@ -202,10 +202,6 @@ class MacOSBasedLinker(targetProperties: AppleConfigurables) return if (dir != null) "$dir/libclang_rt.$mangledLibraryName$prefix$suffix$extension" else null } - private val osVersionMinFlags: List by lazy { - listOf(osVersionMinFlagLd, osVersionMin + ".0") - } - override fun filterStaticLibraries(binaries: List) = binaries.filter { it.isUnixStaticLib } // Note that may break in case of 32-bit Mach-O. See KT-37368. @@ -218,6 +214,28 @@ class MacOSBasedLinker(targetProperties: AppleConfigurables) +listOf("-o", output) }.let(::listOf) + /** + * Construct -platform_version ld64 argument which contains info about + * - SDK + * - minimal OS version + * - SDK version + */ + private fun platformVersionFlags(): List = mutableListOf().apply { + add("-platform_version") + + val platformName = when (target.family) { + Family.OSX -> "macos" + Family.IOS -> "ios" + Family.TVOS -> "tvos" + Family.WATCHOS -> "watchos" + else -> error("Unexpected Apple target family: ${target.family}") + } + if (targetTriple.isSimulator) "-simulator" else "" + add(platformName) + + add("$osVersionMin.0") + add(sdkVersion) + }.toList() + override fun finalLinkCommands(objectFiles: List, executable: ExecutableFile, libraries: List, linkerArgs: List, optimize: Boolean, debug: Boolean, kind: LinkerOutputKind, @@ -242,7 +260,7 @@ class MacOSBasedLinker(targetProperties: AppleConfigurables) result += Command(linker).apply { +"-demangle" +listOf("-dynamic", "-arch", arch) - +osVersionMinFlags + +platformVersionFlags() +listOf("-syslibroot", absoluteTargetSysRoot, "-o", executable) +objectFiles if (optimize) +linkerOptimizationFlags