diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index 9c4941cb0bc..be99731866f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -194,44 +194,50 @@ open class KotlinNativeTargetConfigurator( } } + fun configureFatFramework() { + val fatFrameworkConfigurationName = lowerCamelCaseName(binary.name, binary.target.konanTarget.family.name.toLowerCase(), "fat") + val fatFrameworkTaskName = "link${fatFrameworkConfigurationName.capitalize()}" + + val fatFrameworkTask = if (fatFrameworkTaskName in tasks.names) { + tasks.named(fatFrameworkTaskName, FatFrameworkTask::class.java) + } else { + tasks.register(fatFrameworkTaskName, FatFrameworkTask::class.java) { + it.baseName = binary.baseName + it.destinationDir = it.destinationDir.resolve(binary.buildType.name.toLowerCase()) + } + } + + fatFrameworkTask.configure { + try { + it.from(binary) + } catch (e: Exception) { + logger.warn("Cannot add binary ${binary.name} dependency to default fat framework", e) + } + } + + // maybeCreate is not used as it does not provide way to configure once + val fatConfiguration = + configurations.findByName(fatFrameworkConfigurationName) ?: configurations.create(fatFrameworkConfigurationName) { + it.isCanBeConsumed = true + it.isCanBeResolved = false + it.configureConfiguration(fatFrameworkTask) + } + + fatConfiguration.attributes.attribute( + Framework.frameworkTargets, + (fatConfiguration.attributes.getAttribute(Framework.frameworkTargets) ?: setOf()) + binary.target.konanTarget.name + ) + } + configurations.create(lowerCamelCaseName(binary.name, binary.target.name)) { it.isCanBeConsumed = true it.isCanBeResolved = false it.configureConfiguration(linkTask) } - val fatFrameworkConfigurationName = lowerCamelCaseName(binary.name, binary.target.konanTarget.family.name.toLowerCase(), "fat") - val fatFrameworkTaskName = "link${fatFrameworkConfigurationName.capitalize()}" - - val fatFrameworkTask = try { - tasks.named(fatFrameworkTaskName, FatFrameworkTask::class.java) - } catch (e: UnknownDomainObjectException) { - tasks.register(fatFrameworkTaskName, FatFrameworkTask::class.java) { - it.baseName = binary.baseName - it.destinationDir = it.destinationDir.resolve(binary.buildType.name.toLowerCase()) - } + if (FatFrameworkTask.isSupportedTarget(binary.target)) { + configureFatFramework() } - - fatFrameworkTask.configure { - try { - it.from(binary) - } catch (e: Exception) { - logger.warn("Cannot add binary ${binary.name} dependency to fat framework", e) - } - } - - // maybeCreate is not used as it does not provide way to configure once - val fatConfiguration = - configurations.findByName(fatFrameworkConfigurationName) ?: configurations.create(fatFrameworkConfigurationName) { - it.isCanBeConsumed = true - it.isCanBeResolved = false - it.configureConfiguration(fatFrameworkTask) - } - - fatConfiguration.attributes.attribute( - Framework.frameworkTargets, - (fatConfiguration.attributes.getAttribute(Framework.frameworkTargets) ?: setOf()) + binary.target.konanTarget.name - ) } private fun Project.createRunTask(binary: Executable) { 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 35c6b5b1b23..7e106fe9338 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 @@ -11,6 +11,7 @@ import org.gradle.api.file.FileTree import org.gradle.api.tasks.* import org.jetbrains.kotlin.gradle.plugin.cocoapods.asValidFrameworkName import org.jetbrains.kotlin.gradle.plugin.mpp.Framework +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.konan.target.Architecture import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.KonanTarget.* @@ -63,7 +64,7 @@ private class IosFrameworkFiles(val rootDir: File) { /** * Task running lipo to create a fat framework from several simple frameworks. It also merges headers, plists and module files. */ -open class FatFrameworkTask: DefaultTask() { +open class FatFrameworkTask : DefaultTask() { //region DSL properties. /** @@ -335,4 +336,16 @@ open class FatFrameworkTask: DefaultTask() { mergePlists(fatFramework.infoPlist, frameworkName) mergeDSYM() } + + companion object { + private val supportedTargets = listOf( + IOS_ARM32, IOS_ARM64, IOS_X64, + WATCHOS_ARM32, WATCHOS_ARM64, WATCHOS_X86, WATCHOS_X64, + TVOS_ARM64, TVOS_X64 + ) + + fun isSupportedTarget(target: KotlinNativeTarget): Boolean { + return target.konanTarget in supportedTargets + } + } }