Don't create individual Gradle configurations for every cinterop

Common configuration serves two purposes:
* Dependencies are the same for all cinterops of a single compilation
and can therefore be resolved only once in the single configuration
* Compilations without cinterops should be able to receive cinterop
dependencies from other projects, the updated configuration can be used
for that

KT-54975
This commit is contained in:
Pavel Kirpichenkov
2023-01-11 15:36:16 +02:00
committed by Space Team
parent 0e195b3ad0
commit 1c79e5a71a
3 changed files with 12 additions and 13 deletions
@@ -1123,7 +1123,7 @@ class GeneralNativeIT : BaseGradleIT() {
} }
} }
build(":dependencyInsight", "--configuration", "hostTestTestNumberCInterop", "--dependency", "org.example:publishedLibrary") { build(":dependencyInsight", "--configuration", "hostTestCInterop", "--dependency", "org.example:publishedLibrary") {
assertSuccessful() assertSuccessful()
assertVariantInDependencyInsight("hostApiElements-published") assertVariantInDependencyInsight("hostApiElements-published")
} }
@@ -1137,7 +1137,7 @@ class GeneralNativeIT : BaseGradleIT() {
""".trimIndent() """.trimIndent()
) )
build(":dependencyInsight", "--configuration", "hostTestTestNumberCInterop", "--dependency", ":projectLibrary") { build(":dependencyInsight", "--configuration", "hostTestCInterop", "--dependency", ":projectLibrary") {
assertSuccessful() assertSuccessful()
assertVariantInDependencyInsight("hostCInteropApiElements") assertVariantInDependencyInsight("hostCInteropApiElements")
} }
@@ -327,7 +327,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
target.compilations.all { compilation -> target.compilations.all { compilation ->
createCInteropTasks(compilation, compilation.cinterops) createCInteropTasks(compilation, compilation.cinterops)
compilation.cinterops.all { cinterop -> compilation.cinterops.all { cinterop ->
cinterop.dependencyFiles += locateOrCreateCInteropDependencyConfiguration(compilation, cinterop, target) cinterop.dependencyFiles += locateOrCreateCInteropDependencyConfiguration(compilation)
} }
} }
} }
@@ -10,14 +10,10 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.attributes.* import org.gradle.api.attributes.*
import org.gradle.api.internal.artifacts.ArtifactAttributes import org.gradle.api.internal.artifacts.ArtifactAttributes
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.plugin.CInteropSettings
import org.jetbrains.kotlin.gradle.plugin.KotlinNativeTargetConfigurator.NativeArtifactFormat import org.jetbrains.kotlin.gradle.plugin.KotlinNativeTargetConfigurator.NativeArtifactFormat
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.categoryByName import org.jetbrains.kotlin.gradle.plugin.categoryByName
import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultCInteropSettings import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropKlibLibraryElements.cinteropKlibLibraryElements import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropKlibLibraryElements.cinteropKlibLibraryElements
import org.jetbrains.kotlin.gradle.tasks.CInteropProcess import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
@@ -40,26 +36,29 @@ internal fun createCInteropApiElementsKlibArtifact(
internal fun Project.locateOrCreateCInteropDependencyConfiguration( internal fun Project.locateOrCreateCInteropDependencyConfiguration(
compilation: KotlinNativeCompilation, compilation: KotlinNativeCompilation,
cinterop: CInteropSettings,
target: KotlinTarget
): Configuration { ): Configuration {
configurations.findByName(compilation.cInteropDependencyConfigurationName)?.let { return it }
val compileOnlyConfiguration = configurations.getByName(compilation.compileOnlyConfigurationName) val compileOnlyConfiguration = configurations.getByName(compilation.compileOnlyConfigurationName)
val implementationConfiguration = configurations.getByName(compilation.implementationConfigurationName) val implementationConfiguration = configurations.getByName(compilation.implementationConfigurationName)
return configurations.maybeCreate(cinterop.dependencyConfigurationName).apply { return configurations.create(compilation.cInteropDependencyConfigurationName).apply {
extendsFrom(compileOnlyConfiguration, implementationConfiguration) extendsFrom(compileOnlyConfiguration, implementationConfiguration)
isVisible = false isVisible = false
isCanBeResolved = true isCanBeResolved = true
isCanBeConsumed = false isCanBeConsumed = false
usesPlatformOf(target) usesPlatformOf(compilation.target)
attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, cinteropKlibLibraryElements()) attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, cinteropKlibLibraryElements())
attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, KotlinUsages.KOTLIN_CINTEROP)) attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, KotlinUsages.KOTLIN_CINTEROP))
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
description = "Dependencies for cinterop '${cinterop.name}' (compilation '${compilation.name}')." description = "CInterop dependencies for compilation '${compilation.name}')."
} }
} }
internal val KotlinNativeCompilation.cInteropDependencyConfigurationName: String
get() = compilation.disambiguateName("CInterop")
internal fun Project.locateOrCreateCInteropApiElementsConfiguration(target: KotlinTarget): Configuration { internal fun Project.locateOrCreateCInteropApiElementsConfiguration(target: KotlinTarget): Configuration {
val configurationName = cInteropApiElementsConfigurationName(target) val configurationName = cInteropApiElementsConfigurationName(target)
configurations.findByName(configurationName)?.let { return it } configurations.findByName(configurationName)?.let { return it }