From 1990f8dfb37aac2a7ab5c1f5eb86c4059be17907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Doln=C3=ADk?= Date: Wed, 15 May 2024 09:24:01 +0200 Subject: [PATCH] Fix support for original XCFramework API. --- .../analytics/GradleAnalyticsManager.kt | 2 +- .../CreateSkieConfigurationTask.kt | 2 +- .../configuration/SkieExtensionInternals.kt | 19 ++++------ .../co/touchlab/skie/plugin/SkieTarget.kt | 3 ++ .../skie/plugin/ActualSkieArtifactTarget.kt | 5 +++ .../skie/plugin/ActualSkieBinaryTarget.kt | 9 ++++- .../skie/plugin/shim/ActualKgpShim.kt | 37 ++++++++++++++----- 7 files changed, 52 insertions(+), 25 deletions(-) diff --git a/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/analytics/GradleAnalyticsManager.kt b/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/analytics/GradleAnalyticsManager.kt index 102c1283..7c01c3e1 100644 --- a/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/analytics/GradleAnalyticsManager.kt +++ b/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/analytics/GradleAnalyticsManager.kt @@ -26,7 +26,7 @@ class GradleAnalyticsManager( val analyticsCollectorProvider = target.skieDirectories.map { skieDirectories -> AnalyticsCollector( skieBuildDirectory = skieDirectories.buildDirectory, - skieConfiguration = project.skieExtension.buildConfiguration(target.outputKind), + skieConfiguration = project.skieExtension.buildConfiguration(target), ) } diff --git a/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/configuration/CreateSkieConfigurationTask.kt b/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/configuration/CreateSkieConfigurationTask.kt index b44ae671..bda1a3cc 100644 --- a/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/configuration/CreateSkieConfigurationTask.kt +++ b/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/configuration/CreateSkieConfigurationTask.kt @@ -44,7 +44,7 @@ abstract class CreateSkieConfigurationTask : DefaultTask() { val createConfiguration = target.registerSkieTargetBasedTask("createConfiguration") { val skieExtension = project.skieExtension configurationFile.set(target.skieBuildDirectory.skieConfiguration) - configuration.set(project.provider { skieExtension.buildConfiguration(target.outputKind) }) + configuration.set(project.provider { skieExtension.buildConfiguration(target) }) dependsOn(target.createSkieBuildDirectoryTask) } diff --git a/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/configuration/SkieExtensionInternals.kt b/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/configuration/SkieExtensionInternals.kt index 37ca152e..a2b11c11 100644 --- a/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/configuration/SkieExtensionInternals.kt +++ b/SKIE/skie-gradle/plugin-impl/src/common/kotlin/co/touchlab/skie/plugin/configuration/SkieExtensionInternals.kt @@ -12,26 +12,21 @@ fun SkieExtension.Companion.createExtension(project: Project): SkieExtension = val Project.skieExtension: SkieExtension get() = project.extensions.getByType(SkieExtension::class.java) -fun SkieExtension.buildConfiguration(outputKind: SkieTarget.OutputKind): GradleSkieConfigurationData = +fun SkieExtension.buildConfiguration(target: SkieTarget): GradleSkieConfigurationData = GradleSkieConfigurationData( - enabledConfigurationFlags = (mergeConfigurationSetsFromConfigurations(outputKind) + additionalConfigurationFlags.get()) - suppressedConfigurationFlags.get(), + enabledConfigurationFlags = getUserConfiguredFlags() + target.requiredConfigurationFlags, groups = features.buildGroups(), ) -private fun SkieExtension.mergeConfigurationSetsFromConfigurations(outputKind: SkieTarget.OutputKind): Set = +private fun SkieExtension.getUserConfiguredFlags(): Set = + (mergeConfigurationSetsFromConfigurations() + additionalConfigurationFlags.get()) - suppressedConfigurationFlags.get() + +private fun SkieExtension.mergeConfigurationSetsFromConfigurations(): Set = analytics.buildConfigurationFlags() + build.buildConfigurationFlags() + debug.buildConfigurationFlags() + features.buildConfigurationFlags() + - migration.buildConfigurationFlags() + - addSwiftLibraryEvolutionFlagIfNeeded(outputKind) - -private fun addSwiftLibraryEvolutionFlagIfNeeded(outputKind: SkieTarget.OutputKind): Set = - if (outputKind == SkieTarget.OutputKind.XCFramework) { - setOf(SkieConfigurationFlag.Build_SwiftLibraryEvolution) - } else { - emptySet() - } + migration.buildConfigurationFlags() private fun SkieFeatureConfiguration.buildGroups(): List = groupConfigurations.map { it.build() } diff --git a/SKIE/skie-gradle/plugin-shim-api/src/common/kotlin/co/touchlab/skie/plugin/SkieTarget.kt b/SKIE/skie-gradle/plugin-shim-api/src/common/kotlin/co/touchlab/skie/plugin/SkieTarget.kt index ddfa2e5b..0d32ce08 100644 --- a/SKIE/skie-gradle/plugin-shim-api/src/common/kotlin/co/touchlab/skie/plugin/SkieTarget.kt +++ b/SKIE/skie-gradle/plugin-shim-api/src/common/kotlin/co/touchlab/skie/plugin/SkieTarget.kt @@ -1,5 +1,6 @@ package co.touchlab.skie.plugin +import co.touchlab.skie.configuration.SkieConfigurationFlag import co.touchlab.skie.plugin.shim.KonanTargetShim import co.touchlab.skie.plugin.shim.KotlinSourceSetShim import co.touchlab.skie.plugin.util.KotlinCompilerPluginOption @@ -23,6 +24,8 @@ sealed interface SkieTarget { val outputKind: OutputKind + val requiredConfigurationFlags: Set + val skieDirectories: Provider val freeCompilerArgs: Provider> diff --git a/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/ActualSkieArtifactTarget.kt b/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/ActualSkieArtifactTarget.kt index 76ebdf30..29bb644f 100644 --- a/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/ActualSkieArtifactTarget.kt +++ b/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/ActualSkieArtifactTarget.kt @@ -1,5 +1,6 @@ package co.touchlab.skie.plugin +import co.touchlab.skie.configuration.SkieConfigurationFlag import co.touchlab.skie.plugin.shim.ActualKonanTargetShim import co.touchlab.skie.plugin.shim.KonanTargetShim import co.touchlab.skie.plugin.util.KotlinCompilerPluginOption @@ -35,6 +36,10 @@ class ActualSkieArtifactTarget( override val fullArtifactName: String get() = artifact.artifactName + artifactNameSuffix + override val requiredConfigurationFlags: Set = setOfNotNull( + SkieConfigurationFlag.Build_SwiftLibraryEvolution.takeIf { outputKind == SkieTarget.OutputKind.XCFramework }, + ) + private val artifactNameSuffix = when (artifact) { is KotlinNativeFatFramework -> "ForFat" is KotlinNativeXCFramework -> "ForXCF" diff --git a/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/ActualSkieBinaryTarget.kt b/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/ActualSkieBinaryTarget.kt index 86964d91..6db77355 100644 --- a/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/ActualSkieBinaryTarget.kt +++ b/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/ActualSkieBinaryTarget.kt @@ -1,5 +1,6 @@ package co.touchlab.skie.plugin +import co.touchlab.skie.configuration.SkieConfigurationFlag import co.touchlab.skie.plugin.shim.ActualKonanTargetShim import co.touchlab.skie.plugin.shim.ActualKotlinSourceSetShim import co.touchlab.skie.plugin.shim.KonanTargetShim @@ -20,7 +21,7 @@ class ActualSkieBinaryTarget( override val project: Project, target: KotlinNativeTarget, private val binary: NativeBinary, - override val outputKind: SkieTarget.OutputKind, + private val isForXCFramework: Boolean, ) : SkieTarget.Binary { override val konanTarget: KonanTargetShim = ActualKonanTargetShim(target.konanTarget) @@ -29,6 +30,8 @@ class ActualSkieBinaryTarget( override val name: String = "binary: ${binary.name}, target: ${target.targetName}, buildType: $buildType" + override val outputKind: SkieTarget.OutputKind = SkieTarget.OutputKind.Framework + override val task: TaskProvider = binary.linkTaskProvider override val compileDependencyConfigurationName: String @@ -46,6 +49,10 @@ class ActualSkieBinaryTarget( it.binary.freeCompilerArgs } + override val requiredConfigurationFlags: Set = setOfNotNull( + SkieConfigurationFlag.Build_SwiftLibraryEvolution.takeIf { isForXCFramework }, + ) + override fun addPluginArgument(pluginId: String, option: KotlinCompilerPluginOption) { task.configure { compilerPluginOptions.addPluginArgument( diff --git a/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/shim/ActualKgpShim.kt b/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/shim/ActualKgpShim.kt index 1e56c318..4e75074b 100644 --- a/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/shim/ActualKgpShim.kt +++ b/SKIE/skie-gradle/plugin-shim-impl/src/kgp_common/gradle_common/kotlin/co/touchlab/skie/plugin/shim/ActualKgpShim.kt @@ -17,8 +17,10 @@ import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion import org.jetbrains.kotlin.gradle.plugin.mpp.Framework import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages +import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFrameworkTask import org.jetbrains.kotlin.gradle.targets.native.tasks.artifact.kotlinArtifactsExtension import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask +import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader import org.jetbrains.kotlin.konan.properties.resolvablePropertyString import org.jetbrains.kotlin.konan.target.Distribution @@ -53,24 +55,39 @@ class ActualKgpShim( } private fun initializeBinaryTargets() { + val frameworksUsedInXCFrameworks = getFrameworksUsedInXCFrameworks() + project.kotlinMultiplatformExtension?.appleTargets?.configureEach { val target = this binaries.withType().configureEach { - val binary = this - - val binaryTarget = ActualSkieBinaryTarget( - project = project, - target = target, - binary = binary, - outputKind = SkieTarget.OutputKind.Framework, - ) - - targets.add(binaryTarget) + registerBinaryTarget(target, this, frameworksUsedInXCFrameworks) } } } + // Must be done eagerly because we need to go through all potential tasks even those that will not be executed. + // This is to ensure the Link task configuration will be the same when executed separately or as part of the XCFramework task. + private fun getFrameworksUsedInXCFrameworks(): Set = + project.tasks.withType() + .toList() + .flatMap { xcFrameworkTask -> + xcFrameworkTask.taskDependencies.getDependencies(xcFrameworkTask).filterIsInstance().map { it.binary } + } + .filterIsInstance() + .toSet() + + private fun registerBinaryTarget(target: KotlinNativeTarget, binary: Framework, frameworksUsedInXCFrameworks: Set) { + val binaryTarget = ActualSkieBinaryTarget( + project = project, + target = target, + binary = binary, + isForXCFramework = binary in frameworksUsedInXCFrameworks, + ) + + targets.add(binaryTarget) + } + private fun initializeArtifactTargets() { project.kotlinArtifactsExtension.artifacts.withType().configureEach { val artifactTargets = ActualSkieArtifactTarget.createFromArtifact(this, project)