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()
assertVariantInDependencyInsight("hostApiElements-published")
}
@@ -1137,7 +1137,7 @@ class GeneralNativeIT : BaseGradleIT() {
""".trimIndent()
)
build(":dependencyInsight", "--configuration", "hostTestTestNumberCInterop", "--dependency", ":projectLibrary") {
build(":dependencyInsight", "--configuration", "hostTestCInterop", "--dependency", ":projectLibrary") {
assertSuccessful()
assertVariantInDependencyInsight("hostCInteropApiElements")
}
@@ -327,7 +327,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
target.compilations.all { compilation ->
createCInteropTasks(compilation, compilation.cinterops)
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.internal.artifacts.ArtifactAttributes
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.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.categoryByName
import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultCInteropSettings
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.mpp.*
import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropKlibLibraryElements.cinteropKlibLibraryElements
import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
@@ -40,26 +36,29 @@ internal fun createCInteropApiElementsKlibArtifact(
internal fun Project.locateOrCreateCInteropDependencyConfiguration(
compilation: KotlinNativeCompilation,
cinterop: CInteropSettings,
target: KotlinTarget
): Configuration {
configurations.findByName(compilation.cInteropDependencyConfigurationName)?.let { return it }
val compileOnlyConfiguration = configurations.getByName(compilation.compileOnlyConfigurationName)
val implementationConfiguration = configurations.getByName(compilation.implementationConfigurationName)
return configurations.maybeCreate(cinterop.dependencyConfigurationName).apply {
return configurations.create(compilation.cInteropDependencyConfigurationName).apply {
extendsFrom(compileOnlyConfiguration, implementationConfiguration)
isVisible = false
isCanBeResolved = true
isCanBeConsumed = false
usesPlatformOf(target)
usesPlatformOf(compilation.target)
attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, cinteropKlibLibraryElements())
attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, KotlinUsages.KOTLIN_CINTEROP))
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 {
val configurationName = cInteropApiElementsConfigurationName(target)
configurations.findByName(configurationName)?.let { return it }