From 1c79e5a71ad996f6d121c2344ed748db8f523ae8 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Wed, 11 Jan 2023 15:36:16 +0200 Subject: [PATCH] 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 --- .../kotlin/gradle/native/GeneralNativeIT.kt | 4 ++-- .../native/KotlinNativeTargetConfigurator.kt | 2 +- .../native/internal/CInteropConfigurations.kt | 19 +++++++++---------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt index 0e07ca70ea4..f4d7d296573 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt @@ -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") } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index df8deb20dad..0cce26e40c1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -327,7 +327,7 @@ open class KotlinNativeTargetConfigurator : AbstractKotl target.compilations.all { compilation -> createCInteropTasks(compilation, compilation.cinterops) compilation.cinterops.all { cinterop -> - cinterop.dependencyFiles += locateOrCreateCInteropDependencyConfiguration(compilation, cinterop, target) + cinterop.dependencyFiles += locateOrCreateCInteropDependencyConfiguration(compilation) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt index aefd58d1e07..c74a73f7154 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt @@ -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 }