From 3a234d46ed6554053fb6a263a017013f0871abea Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 16 Oct 2019 13:57:25 +0300 Subject: [PATCH] Gradle, native: Support watchOS and tvOS in CocoaPods plugin Issue #KT-34329 fixed --- .../jetbrains/kotlin/gradle/CocoaPodsIT.kt | 4 ++ .../native/cocoapods/KotlinCocoapodsPlugin.kt | 42 +++++++++---------- .../targets/native/tasks/CocoapodsTasks.kt | 9 +++- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CocoaPodsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CocoaPodsIT.kt index 21860022f6f..97ead78b3ce 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CocoaPodsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CocoaPodsIT.kt @@ -62,6 +62,10 @@ class CocoaPodsIT : BaseGradleIT() { spec.pod_target_xcconfig = { 'KOTLIN_TARGET[sdk=iphonesimulator*]' => 'ios_x64', 'KOTLIN_TARGET[sdk=iphoneos*]' => 'ios_arm', + 'KOTLIN_TARGET[sdk=watchsimulator*]' => 'watchos_x86', + 'KOTLIN_TARGET[sdk=watchos*]' => 'watchos_arm', + 'KOTLIN_TARGET[sdk=appletvsimulator*]' => 'tvos_x64', + 'KOTLIN_TARGET[sdk=appletvos*]' => 'tvos_arm64', 'KOTLIN_TARGET[sdk=macosx*]' => 'macos_x64' } 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 f8bbb7906a2..dc206cb1ec6 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 @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.gradle.plugin.whenEvaluated import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.utils.asValidTaskName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName -import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import java.io.File @@ -88,7 +87,10 @@ open class KotlinCocoapodsPlugin: Plugin { ) { val fatTargets = requestedPlatforms.associate { it to kotlinExtension.targetsForPlatform(it) } - check(fatTargets.values.any { it.isNotEmpty() }) { "The project doesn't contain a target for iOS device" } + check(fatTargets.values.any { it.isNotEmpty() }) { + "The project must have a target for at least one of the following platforms: " + + "${requestedPlatforms.joinToString { it.visibleName }}." + } fatTargets.forEach { platform, targets -> check(targets.size <= 1) { "The project has more than one target for the requested platform: `${platform.visibleName}`" @@ -132,27 +134,21 @@ open class KotlinCocoapodsPlugin: Plugin { val requestedTargetName = project.findProperty(TARGET_PROPERTY)?.toString() ?: return@whenEvaluated 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, 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) } + // We create a fat framework only for device platforms which have several + // device architectures: iosArm64, iosArm32, watchosArm32 and watchosArm64. + val frameworkPlatforms: List = when (requestedTargetName) { + KOTLIN_TARGET_FOR_IOS_DEVICE -> listOf(KonanTarget.IOS_ARM64, KonanTarget.IOS_ARM32) + KOTLIN_TARGET_FOR_WATCHOS_DEVICE -> listOf(KonanTarget.WATCHOS_ARM32, KonanTarget.WATCHOS_ARM64) + else -> listOf(HostManager().targetByName(requestedTargetName)) // A requested target doesn't require building a fat framework. + } - if (deviceTargets.size == 1) { - // Fast path: there is only one device target. There is no need to build a fat framework. - createSyncForRegularFramework(project, kotlinExtension, requestedBuildType, deviceTargets.single().konanTarget) - } else { - // There are several device targets so we need to build a fat framework. - createSyncForFatFramework(project, kotlinExtension, requestedBuildType, devicePlatforms) - } + val frameworkTargets = frameworkPlatforms.flatMap { kotlinExtension.targetsForPlatform(it) } + if (frameworkTargets.size == 1) { + // Fast path: there is only one device target. There is no need to build a fat framework. + createSyncForRegularFramework(project, kotlinExtension, requestedBuildType, frameworkTargets.single().konanTarget) } else { - // A requested target doesn't require building a fat framework. - createSyncForRegularFramework(project, kotlinExtension, requestedBuildType, HostManager().targetByName(requestedTargetName)) + // There are several device targets so we need to build a fat framework. + createSyncForFatFramework(project, kotlinExtension, requestedBuildType, frameworkPlatforms) } } @@ -266,7 +262,7 @@ open class KotlinCocoapodsPlugin: Plugin { // Used in Xcode script phase to indicate that the framework is being built for a device // so we should generate a fat framework with arm32 and arm64 binaries. - const val KOTLIN_TARGET_FOR_DEVICE = "ios_arm" - + const val KOTLIN_TARGET_FOR_IOS_DEVICE = "ios_arm" + const val KOTLIN_TARGET_FOR_WATCHOS_DEVICE = "watchos_arm" } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt index af06bc19e17..28ea5c15988 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt @@ -12,7 +12,8 @@ import org.gradle.api.tasks.wrapper.Wrapper import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.GENERATE_WRAPPER_PROPERTY -import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.KOTLIN_TARGET_FOR_DEVICE +import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.KOTLIN_TARGET_FOR_IOS_DEVICE +import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.KOTLIN_TARGET_FOR_WATCHOS_DEVICE import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.SYNC_TASK_NAME import org.jetbrains.kotlin.gradle.plugin.cocoapods.asValidFrameworkName import org.jetbrains.kotlin.gradle.plugin.cocoapods.cocoapodsBuildDirs @@ -75,7 +76,11 @@ open class PodspecTask : DefaultTask() { | | spec.pod_target_xcconfig = { | 'KOTLIN_TARGET[sdk=iphonesimulator*]' => 'ios_x64', - | 'KOTLIN_TARGET[sdk=iphoneos*]' => '$KOTLIN_TARGET_FOR_DEVICE', + | 'KOTLIN_TARGET[sdk=iphoneos*]' => '$KOTLIN_TARGET_FOR_IOS_DEVICE', + | 'KOTLIN_TARGET[sdk=watchsimulator*]' => 'watchos_x86', + | 'KOTLIN_TARGET[sdk=watchos*]' => '$KOTLIN_TARGET_FOR_WATCHOS_DEVICE', + | 'KOTLIN_TARGET[sdk=appletvsimulator*]' => 'tvos_x64', + | 'KOTLIN_TARGET[sdk=appletvos*]' => 'tvos_arm64', | 'KOTLIN_TARGET[sdk=macosx*]' => 'macos_x64' | } |