From a2276f9c21dc23e07dbc7f1dc40613711d095d5a Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Wed, 18 Jan 2023 10:33:26 +0100 Subject: [PATCH] [Gradle] Create separate `hostSpecificMetadataConfiguration` for Native Previously this configuration was created on ad-hoc basis by copying the compileDependenciesConfiguration. This creates bunch of copies which are practically doing the same thing. Extracting it on compilation level makes it more controllable and prevents any duplicates ^KT-49933 --- .../plugin/mpp/SourceSetVisibilityProvider.kt | 8 ++--- ...lationDependencyConfigurationsFactories.kt | 30 +++++++++++++++++-- .../targets/native/KotlinNativeCompilation.kt | 7 +++++ 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt index 704e96c2336..1f7560321d1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt @@ -41,11 +41,9 @@ private fun Project.collectAllPlatformCompilationData(): List.toPlatformCompilationData() = SourceSetVisibilityProvider.PlatformCompilationData( allSourceSets = allKotlinSourceSets.map { it.name }.toSet(), resolvedDependenciesConfiguration = LazyResolvedConfiguration(project.configurations.getByName(compileDependencyConfigurationName)), - hostSpecificMetadataConfiguration = project - .configurations - .getByName(compileDependencyConfigurationName) - .copyRecursive().apply { attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_METADATA)) } - .let(::LazyResolvedConfiguration) + hostSpecificMetadataConfiguration = (this as? KotlinNativeCompilation) + ?.hostSpecificMetadataConfiguration + ?.let(::LazyResolvedConfiguration) ) internal class SourceSetVisibilityProvider( diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationDependencyConfigurationsFactories.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationDependencyConfigurationsFactories.kt index 2b0547cb3ce..0799c89f54c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationDependencyConfigurationsFactories.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationDependencyConfigurationsFactories.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory +import org.gradle.api.artifacts.Configuration import org.gradle.api.attributes.Category import org.gradle.api.attributes.Usage import org.jetbrains.kotlin.gradle.plugin.* @@ -13,6 +14,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationConfigurationsContainer import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationConfigurationsContainer import org.jetbrains.kotlin.gradle.plugin.mpp.javaSourceSets +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes +import org.jetbrains.kotlin.gradle.plugin.sources.METADATA_CONFIGURATION_NAME_SUFFIX import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.utils.* @@ -36,16 +39,39 @@ internal sealed class DefaultKotlinCompilationDependencyConfigurationsFactory : internal object NativeKotlinCompilationDependencyConfigurationsFactory : KotlinCompilationImplFactory.KotlinCompilationDependencyConfigurationsFactory { - override fun create(target: KotlinTarget, compilationName: String): KotlinCompilationConfigurationsContainer { + override fun create(target: KotlinTarget, compilationName: String): NativeCompilationDependencyConfigurationsContainer { val naming = ConfigurationNaming.Default(target, compilationName) - return KotlinCompilationDependencyConfigurationsContainer( + val baseContainer = KotlinCompilationDependencyConfigurationsContainer( target = target, compilationName = compilationName, naming = naming, withRuntime = false, compileClasspathConfigurationName = naming.name("compileKlibraries") ) + + val compilationCoordinates = "${target.disambiguationClassifier}/$compilationName" + val project = target.project + val hostSpecificMetadataConfiguration: Configuration = project + .configurations + .maybeCreate(naming.name(compilation, METADATA_CONFIGURATION_NAME_SUFFIX)) + .apply { + markResolvable() + isVisible = false + description = "Host-specific Metadata dependencies for $compilationCoordinates" + extendsFrom(baseContainer.compileDependencyConfiguration) + copyAttributes(from = baseContainer.compileDependencyConfiguration.attributes, to = attributes) + attributes { + it.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_METADATA)) + } + } + + return NativeCompilationDependencyConfigurationsContainer(baseContainer, hostSpecificMetadataConfiguration) } + + class NativeCompilationDependencyConfigurationsContainer( + baseContainer: KotlinCompilationConfigurationsContainer, + val hostSpecificMetadataConfiguration: Configuration? + ) : KotlinCompilationConfigurationsContainer by baseContainer } internal object JsKotlinCompilationDependencyConfigurationsFactory : diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index 34f66a19976..539e527cfb3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -9,10 +9,12 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Action import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project +import org.gradle.api.artifacts.Configuration import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationImpl +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.NativeKotlinCompilationDependencyConfigurationsFactory.NativeCompilationDependencyConfigurationsContainer import org.jetbrains.kotlin.gradle.targets.native.NativeCompilerOptions import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName @@ -67,6 +69,11 @@ open class KotlinNativeCompilation @Inject internal constructor( val binariesTaskName: String get() = lowerCamelCaseName(target.disambiguationClassifier, compilation.compilationName, "binaries") + + internal val hostSpecificMetadataConfiguration: Configuration? get() { + val container = compilation.configurations as? NativeCompilationDependencyConfigurationsContainer + return container?.hostSpecificMetadataConfiguration + } } open class KotlinSharedNativeCompilation @Inject internal constructor(