From ac3864543cc5a30bfe5a35db5acee722e070dd97 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Tue, 3 Sep 2019 18:44:02 +0700 Subject: [PATCH] Add Family.TVOS, Family.WATCHOS and KonanTarget.ANDROID_X86, KonanTarget.WATCHOS_X86, KonanTarget.WATCHOS_ARM32. --- .../kotlin/konan/target/KonanTarget.kt | 34 ++++++++++---- ...otlinTargetContainerWithPresetFunctions.kt | 45 +++++++++++++++++++ .../targets/native/NativeBinaryTypes.kt | 2 +- .../native/cocoapods/KotlinCocoapodsPlugin.kt | 13 ++++-- .../targets/native/tasks/FatFrameworkTask.kt | 4 +- 5 files changed, 83 insertions(+), 15 deletions(-) diff --git a/konan/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt b/konan/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt index bdeb32550a6..9a57b391b42 100644 --- a/konan/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt +++ b/konan/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt @@ -14,11 +14,19 @@ enum class Family(val exeSuffix:String, val dynamicPrefix: String, val dynamicSu val staticPrefix: String, val staticSuffix: String) { OSX ("kexe", "lib", "dylib", "lib", "a"), IOS ("kexe", "lib", "dylib", "lib", "a"), + TVOS ("kexe", "lib", "dylib", "lib", "a"), + WATCHOS ("kexe", "lib", "dylib", "lib", "a"), LINUX ("kexe", "lib", "so" , "lib", "a"), MINGW ("exe" , "" , "dll" , "lib", "a"), ANDROID ("so" , "lib", "so" , "lib", "a"), WASM ("wasm", "" , "wasm" , "", "wasm"), - ZEPHYR ("o" , "lib", "a" , "lib", "a") + ZEPHYR ("o" , "lib", "a" , "lib", "a"); + + val isAppleFamily: Boolean + get() = this == OSX + || this == IOS + || this == TVOS + || this == WATCHOS } enum class Architecture(val bitness: Int) { @@ -33,15 +41,18 @@ enum class Architecture(val bitness: Int) { sealed class KonanTarget(override val name: String, val family: Family, val architecture: Architecture) : Named { object ANDROID_X64 : KonanTarget( "android_x64", Family.ANDROID, Architecture.X64) + object ANDROID_X86 : KonanTarget( "android_x86", Family.ANDROID, Architecture.X86) object ANDROID_ARM32 : KonanTarget( "android_arm32", Family.ANDROID, Architecture.ARM32) object ANDROID_ARM64 : KonanTarget( "android_arm64", Family.ANDROID, Architecture.ARM64) object IOS_ARM32 : KonanTarget( "ios_arm32", Family.IOS, Architecture.ARM32) object IOS_ARM64 : KonanTarget( "ios_arm64", Family.IOS, Architecture.ARM64) object IOS_X64 : KonanTarget( "ios_x64", Family.IOS, Architecture.X64) - object WATCHOS_ARM64 : KonanTarget( "watchos_arm64", Family.IOS, Architecture.ARM64) - object WATCHOS_X64 : KonanTarget( "watchos_x64", Family.IOS, Architecture.X64) - object TVOS_ARM64 : KonanTarget( "tvos_arm64", Family.IOS, Architecture.ARM64) - object TVOS_X64 : KonanTarget( "tvos_x64", Family.IOS, Architecture.X64) + object WATCHOS_ARM32 : KonanTarget( "watchos_arm32", Family.WATCHOS, Architecture.ARM32) + object WATCHOS_ARM64 : KonanTarget( "watchos_arm64", Family.WATCHOS, Architecture.ARM64) + object WATCHOS_X86 : KonanTarget( "watchos_x86", Family.WATCHOS, Architecture.X86) + object WATCHOS_X64 : KonanTarget( "watchos_x64", Family.WATCHOS, Architecture.X64) + object TVOS_ARM64 : KonanTarget( "tvos_arm64", Family.TVOS, Architecture.ARM64) + object TVOS_X64 : KonanTarget( "tvos_x64", Family.TVOS, Architecture.X64) object LINUX_X64 : KonanTarget( "linux_x64", Family.LINUX, Architecture.X64) object MINGW_X86 : KonanTarget( "mingw_x86", Family.MINGW, Architecture.X86) object MINGW_X64 : KonanTarget( "mingw_x64", Family.MINGW, Architecture.X64) @@ -127,11 +138,12 @@ open class HostManager(protected val distribution: Distribution = Distribution() // TODO: need a better way to enumerated predefined targets. private val predefinedTargets = listOf( - ANDROID_ARM32, ANDROID_ARM64, ANDROID_X64, + ANDROID_ARM32, ANDROID_ARM64, ANDROID_X86, ANDROID_X64, IOS_ARM32, IOS_ARM64, IOS_X64, - WATCHOS_ARM64, WATCHOS_X64, + WATCHOS_ARM32, WATCHOS_ARM64, + WATCHOS_X86, WATCHOS_X64, TVOS_ARM64, TVOS_X64, - LINUX_X64, LINUX_ARM32_HFP, LINUX_ARM64, LINUX_MIPS32, LINUX_MIPSEL32, + LINUX_X64, LINUX_ARM32_HFP, LINUX_ARM64, LINUX_MIPS32, LINUX_MIPSEL32, MINGW_X64, MINGW_X86, MACOS_X64, WASM32) @@ -176,6 +188,7 @@ open class HostManager(protected val distribution: Distribution = Distribution() LINUX_ARM64, LINUX_MIPS32, LINUX_MIPSEL32, + ANDROID_X86, ANDROID_X64, ANDROID_ARM32, ANDROID_ARM64, @@ -187,6 +200,7 @@ open class HostManager(protected val distribution: Distribution = Distribution() LINUX_X64, LINUX_ARM32_HFP, LINUX_ARM64, + ANDROID_X86, ANDROID_X64, ANDROID_ARM32, ANDROID_ARM64, @@ -197,13 +211,16 @@ open class HostManager(protected val distribution: Distribution = Distribution() IOS_ARM32, IOS_ARM64, IOS_X64, + WATCHOS_ARM32, WATCHOS_ARM64, + WATCHOS_X86, WATCHOS_X64, TVOS_ARM64, TVOS_X64, LINUX_X64, LINUX_ARM32_HFP, LINUX_ARM64, + ANDROID_X86, ANDROID_X64, ANDROID_ARM32, ANDROID_ARM64, @@ -331,6 +348,7 @@ val KonanTarget.presetName: String get() = when (this) { ANDROID_ARM32 -> "androidNativeArm32" ANDROID_ARM64 -> "androidNativeArm64" + ANDROID_X86 -> "androidNativeX86" ANDROID_X64 -> "androidNativeX64" else -> evaluatePresetName(this.name) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt index c8f43a8ea74..c350ffe7117 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt @@ -91,6 +91,21 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP fun androidNativeArm64(name: String, configure: Closure<*>) = androidNativeArm64(name) { ConfigureUtil.configure(configure, this) } fun androidNativeArm64(configure: Closure<*>) = androidNativeArm64 { ConfigureUtil.configure(configure, this) } + fun androidNativeX86( + name: String = "androidNativeX86", + configure: KotlinNativeTarget.() -> Unit = { } + ): KotlinNativeTarget = + configureOrCreate( + name, + presets.getByName("androidNativeX86") as KotlinNativeTargetPreset, + configure + ) + + fun androidNativeX86() = androidNativeX86("androidNativeX86") { } + fun androidNativeX86(name: String) = androidNativeX86(name) { } + fun androidNativeX86(name: String, configure: Closure<*>) = androidNativeX86(name) { ConfigureUtil.configure(configure, this) } + fun androidNativeX86(configure: Closure<*>) = androidNativeX86 { ConfigureUtil.configure(configure, this) } + fun androidNativeX64( name: String = "androidNativeX64", configure: KotlinNativeTarget.() -> Unit = { } @@ -151,6 +166,21 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP fun iosX64(name: String, configure: Closure<*>) = iosX64(name) { ConfigureUtil.configure(configure, this) } fun iosX64(configure: Closure<*>) = iosX64 { ConfigureUtil.configure(configure, this) } + fun watchosArm32( + name: String = "watchosArm32", + configure: KotlinNativeTarget.() -> Unit = { } + ): KotlinNativeTarget = + configureOrCreate( + name, + presets.getByName("watchosArm32") as KotlinNativeTargetPreset, + configure + ) + + fun watchosArm32() = watchosArm32("watchosArm32") { } + fun watchosArm32(name: String) = watchosArm32(name) { } + fun watchosArm32(name: String, configure: Closure<*>) = watchosArm32(name) { ConfigureUtil.configure(configure, this) } + fun watchosArm32(configure: Closure<*>) = watchosArm32 { ConfigureUtil.configure(configure, this) } + fun watchosArm64( name: String = "watchosArm64", configure: KotlinNativeTarget.() -> Unit = { } @@ -166,6 +196,21 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP fun watchosArm64(name: String, configure: Closure<*>) = watchosArm64(name) { ConfigureUtil.configure(configure, this) } fun watchosArm64(configure: Closure<*>) = watchosArm64 { ConfigureUtil.configure(configure, this) } + fun watchosX86( + name: String = "watchosX86", + configure: KotlinNativeTarget.() -> Unit = { } + ): KotlinNativeTarget = + configureOrCreate( + name, + presets.getByName("watchosX86") as KotlinNativeTargetPreset, + configure + ) + + fun watchosX86() = watchosX86("watchosX86") { } + fun watchosX86(name: String) = watchosX86(name) { } + fun watchosX86(name: String, configure: Closure<*>) = watchosX86(name) { ConfigureUtil.configure(configure, this) } + fun watchosX86(configure: Closure<*>) = watchosX86 { ConfigureUtil.configure(configure, this) } + fun watchosX64( name: String = "watchosX64", configure: KotlinNativeTarget.() -> Unit = { } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaryTypes.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaryTypes.kt index 5d3a6068d71..e7c70d8161a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaryTypes.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaryTypes.kt @@ -57,7 +57,7 @@ enum class NativeOutputKind( description = "a framework" ) { override fun availableFor(target: KonanTarget) = - target.family == Family.OSX || target.family == Family.IOS + target.family.isAppleFamily }; open fun availableFor(target: KonanTarget) = true diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt index f53e1820307..f8bbb7906a2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt @@ -47,7 +47,7 @@ open class KotlinCocoapodsPlugin: Plugin { private fun KotlinMultiplatformExtension.supportedTargets() = targets .withType(KotlinNativeTarget::class.java) - .matching { it.konanTarget.family == Family.IOS || it.konanTarget.family == Family.OSX } + .matching { it.konanTarget.family.isAppleFamily } /** * Splits a string using a whitespace characters as delimiters. @@ -133,9 +133,14 @@ open class KotlinCocoapodsPlugin: Plugin { val requestedBuildType = project.findProperty(CONFIGURATION_PROPERTY)?.toString()?.toUpperCase() ?: return@whenEvaluated if (requestedTargetName == KOTLIN_TARGET_FOR_DEVICE) { - // We create a fat framework only for device platforms: iosArm64, iosArm32, watchosArm64 and tvosArm64. - val devicePlatforms = listOf(KonanTarget.IOS_ARM64, KonanTarget.IOS_ARM32, - KonanTarget.WATCHOS_ARM64, KonanTarget.TVOS_ARM64) + // We create a fat framework only for device platforms: iosArm64, iosArm32, watchosArm32, watchosArm64 and tvosArm64. + val devicePlatforms = listOf( + KonanTarget.IOS_ARM64, + KonanTarget.IOS_ARM32, + KonanTarget.WATCHOS_ARM32, + KonanTarget.WATCHOS_ARM64, + KonanTarget.TVOS_ARM64 + ) val deviceTargets = devicePlatforms.flatMap { kotlinExtension.targetsForPlatform(it) } if (deviceTargets.size == 1) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/FatFrameworkTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/FatFrameworkTask.kt index 20cff949af3..c02bd5a599b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/FatFrameworkTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/FatFrameworkTask.kt @@ -170,8 +170,8 @@ open class FatFrameworkTask: DefaultTask() { KonanTarget.IOS_X64 -> "iPhoneSimulator" KonanTarget.TVOS_ARM64 -> "appletvos" KonanTarget.TVOS_X64 -> "appletvsimulator" - KonanTarget.WATCHOS_ARM64 -> "watchos" - KonanTarget.WATCHOS_X64 -> "watchsimulator" + KonanTarget.WATCHOS_ARM32, KonanTarget.WATCHOS_ARM64 -> "watchos" + KonanTarget.WATCHOS_X86, KonanTarget.WATCHOS_X64 -> "watchsimulator" else -> error("Fat frameworks are not supported for target `${target.konanTarget.visibleName}`") }