From a2e5fa64dc9e76d34f8b301685148bc62ca897dc Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Wed, 15 Mar 2023 17:18:09 +0700 Subject: [PATCH] [Gradle] Use `SingleActionPerProject` instead `runOnceAfterEvaluated` To create fat frameworks for all targets. That should be called only single time KT-55751 Verification Pending KT-56450 Verification Pending --- .../targets/native/KotlinNativeTargetConfigurator.kt | 7 +++++-- .../gradle/targets/native/configureBinaryFrameworks.kt | 7 +++++-- .../kotlin/gradle/unitTests/FatFrameworksTest.kt | 9 +++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index 9dbccaa4178..87b7cc5b702 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -47,6 +47,7 @@ import org.jetbrains.kotlin.gradle.testing.internal.configureConventions import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.utils.Xcode +import org.jetbrains.kotlin.gradle.utils.SingleActionPerProject import org.jetbrains.kotlin.gradle.utils.klibModuleName import org.jetbrains.kotlin.gradle.utils.newInstance import org.jetbrains.kotlin.konan.target.HostManager @@ -236,8 +237,10 @@ open class KotlinNativeTargetConfigurator : AbstractKotl target.binaries.all { project.createLinkTask(it) } - project.runOnceAfterEvaluated("Create fat frameworks") { - project.multiplatformExtensionOrNull?.createFatFrameworks() + SingleActionPerProject.run(project, "Create fat frameworks") { + project.whenEvaluated { + project.multiplatformExtensionOrNull?.createFatFrameworks() + } } project.runOnceAfterEvaluated("Sync language settings for NativeLinkTask") { target.binaries.all { binary -> diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/configureBinaryFrameworks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/configureBinaryFrameworks.kt index e67f8596a3d..3e5d2a1c4cb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/configureBinaryFrameworks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/configureBinaryFrameworks.kt @@ -53,14 +53,17 @@ internal fun Project.createFrameworkArtifact(binaryFramework: Framework, linkTas } internal fun KotlinMultiplatformExtension.createFatFrameworks() { - targets + val frameworkGroups = targets .filterIsInstance() .filter { FatFrameworkTask.isSupportedTarget(it) } .flatMap { it.binaries } .filterIsInstance() .groupBy { it.frameworkGroupDescription } .filter { (_, frameworks) -> frameworks.size > 1 } - .forEach { (groupDescription, frameworks) -> project.createFatFramework(groupDescription, frameworks) } + + for ((groupDescription, frameworkGroup) in frameworkGroups) { + project.createFatFramework(groupDescription, frameworkGroup) + } } private val Framework.binaryFrameworkConfigurationName get() = lowerCamelCaseName(name, target.name) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/FatFrameworksTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/FatFrameworksTest.kt index f9c360b234c..33cb4b3beb8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/FatFrameworksTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/FatFrameworksTest.kt @@ -68,6 +68,15 @@ class FatFrameworksTest { iosArm64 { binaries.framework("foo", listOf(DEBUG, RELEASE)) } } + @Test + fun `fat framework grouping -- multiple build types`() = testFatFrameworkGrouping( + "fooReleaseFrameworkIosFat", + "fooDebugFrameworkIosFat", + ) { + iosX64 { binaries.framework("foo", listOf(DEBUG, RELEASE)) } + iosArm64 { binaries.framework("foo", listOf(DEBUG, RELEASE)) } + } + private fun testFatFrameworkGrouping( vararg allExpectedFatFrameworks: String, configureTargets: KotlinMultiplatformExtension.() -> Unit,