[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
This commit is contained in:
Anton Lakotka
2023-03-15 17:18:09 +07:00
committed by Space Team
parent 92cc13961f
commit a2e5fa64dc
3 changed files with 19 additions and 4 deletions
@@ -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.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.testing.testTaskName
import org.jetbrains.kotlin.gradle.utils.Xcode 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.klibModuleName
import org.jetbrains.kotlin.gradle.utils.newInstance import org.jetbrains.kotlin.gradle.utils.newInstance
import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.HostManager
@@ -236,8 +237,10 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
target.binaries.all { target.binaries.all {
project.createLinkTask(it) project.createLinkTask(it)
} }
project.runOnceAfterEvaluated("Create fat frameworks") { SingleActionPerProject.run(project, "Create fat frameworks") {
project.multiplatformExtensionOrNull?.createFatFrameworks() project.whenEvaluated {
project.multiplatformExtensionOrNull?.createFatFrameworks()
}
} }
project.runOnceAfterEvaluated("Sync language settings for NativeLinkTask") { project.runOnceAfterEvaluated("Sync language settings for NativeLinkTask") {
target.binaries.all { binary -> target.binaries.all { binary ->
@@ -53,14 +53,17 @@ internal fun Project.createFrameworkArtifact(binaryFramework: Framework, linkTas
} }
internal fun KotlinMultiplatformExtension.createFatFrameworks() { internal fun KotlinMultiplatformExtension.createFatFrameworks() {
targets val frameworkGroups = targets
.filterIsInstance<KotlinNativeTarget>() .filterIsInstance<KotlinNativeTarget>()
.filter { FatFrameworkTask.isSupportedTarget(it) } .filter { FatFrameworkTask.isSupportedTarget(it) }
.flatMap { it.binaries } .flatMap { it.binaries }
.filterIsInstance<Framework>() .filterIsInstance<Framework>()
.groupBy { it.frameworkGroupDescription } .groupBy { it.frameworkGroupDescription }
.filter { (_, frameworks) -> frameworks.size > 1 } .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) private val Framework.binaryFrameworkConfigurationName get() = lowerCamelCaseName(name, target.name)
@@ -68,6 +68,15 @@ class FatFrameworksTest {
iosArm64 { binaries.framework("foo", listOf(DEBUG, RELEASE)) } 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( private fun testFatFrameworkGrouping(
vararg allExpectedFatFrameworks: String, vararg allExpectedFatFrameworks: String,
configureTargets: KotlinMultiplatformExtension.() -> Unit, configureTargets: KotlinMultiplatformExtension.() -> Unit,