[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.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<T : KotlinNativeTarget> : 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 ->
@@ -53,14 +53,17 @@ internal fun Project.createFrameworkArtifact(binaryFramework: Framework, linkTas
}
internal fun KotlinMultiplatformExtension.createFatFrameworks() {
targets
val frameworkGroups = targets
.filterIsInstance<KotlinNativeTarget>()
.filter { FatFrameworkTask.isSupportedTarget(it) }
.flatMap { it.binaries }
.filterIsInstance<Framework>()
.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)
@@ -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,