diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt index c843c75b225..721db65f36b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt @@ -16,6 +16,7 @@ import org.gradle.api.component.ComponentWithVariants import org.gradle.api.component.SoftwareComponent import org.gradle.api.internal.component.SoftwareComponentInternal import org.gradle.api.internal.component.UsageContext +import org.gradle.api.provider.ListProperty import org.gradle.api.publish.maven.MavenPublication import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension @@ -27,6 +28,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.COMMON_MAIN_ELEMENTS_CONFIGU import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled +import org.jetbrains.kotlin.gradle.utils.listProperty abstract class KotlinSoftwareComponent( private val project: Project, @@ -67,7 +69,7 @@ abstract class KotlinSoftwareComponent( compilation = metadataTarget.compilations.getByName(MAIN_COMPILATION_NAME), usage = javaApiUsage, dependencyConfigurationName = metadataTarget.apiElementsConfigurationName, - overrideConfigurationArtifacts = setOf(allMetadataArtifact) + overrideConfigurationArtifacts = project.listProperty { listOf(allMetadataArtifact) } ) @@ -126,8 +128,8 @@ class DefaultKotlinUsageContext( override val compilation: KotlinCompilation<*>, private val usage: Usage, override val dependencyConfigurationName: String, - private val overrideConfigurationArtifacts: Set? = null, - private val overrideConfigurationAttributes: AttributeContainer? = null, + internal val overrideConfigurationArtifacts: ListProperty? = null, + internal val overrideConfigurationAttributes: AttributeContainer? = null, override val includeIntoProjectStructureMetadata: Boolean = true ) : KotlinUsageContext { @@ -148,7 +150,7 @@ class DefaultKotlinUsageContext( configuration.incoming.dependencyConstraints override fun getArtifacts(): Set = - overrideConfigurationArtifacts ?: + overrideConfigurationArtifacts?.get()?.toSet() ?: // TODO Gradle Java plugin does that in a different way; check whether we can improve this configuration.artifacts diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/LegacyMappedVariant.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/LegacyMappedVariant.kt index a29fe20e643..ec6239b4a4c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/LegacyMappedVariant.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/LegacyMappedVariant.kt @@ -61,10 +61,20 @@ internal open class LegacyMappedVariant( } override val gradleVariantNames: Set - get() = if (compilation.isMain()) { - val apiElements = compilation.target.apiElementsConfigurationName - setOf(apiElements, publishedConfigurationName(apiElements)) - } else emptySet() + get() { + val allTargetComponents = (compilation.target as AbstractKotlinTarget).kotlinComponents + val allTargetUsages = allTargetComponents.flatMap { + when (it) { + is KotlinVariant -> it.usages + is JointAndroidKotlinTargetComponent -> it.usages + else -> emptyList() + } + } + val compilationUsages = allTargetUsages.filterIsInstance().filter { it.compilation == compilation } + return compilationUsages.filter { it.includeIntoProjectStructureMetadata } + .flatMap { listOf(it.dependencyConfigurationName, publishedConfigurationName(it.dependencyConfigurationName)) } + .toSet() + } override val kotlinSourceRoots: SourceDirectorySet get() = compilation.defaultSourceSet.kotlin @@ -184,15 +194,11 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu mainModule, kotlinComponent.defaultArtifactId.removePrefix(target.project.name.toLowerCase() + "-") ) - val variant = mainModule.variants.withType().single { - it.compilation == target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) - } val usages = when (kotlinComponent) { // unfortunately, there's no common supertype with `usages` is KotlinVariant -> kotlinComponent.usages is JointAndroidKotlinTargetComponent -> kotlinComponent.usages else -> error("unexpected type of kotlinComponent in legacy variant mapping: ${kotlinComponent.javaClass}") } - val configurations = usages.map { target.project.configurations.getByName(it.dependencyConfigurationName) } // Include Sources moduleHolder.whenPublicationAssigned { publication -> @@ -201,14 +207,28 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu } } - // FIXME: apply overrides for attributes and artifacts from the DefaultKotlinUsageContext! // FIXME: include additional variants into project structure metadata? - VariantPublishingConfigurator.get(target.project).configureSingleVariantPublishing( - variant, + val request = BasicPlatformPublicationToMavenRequest( + kotlinComponent.name, + mainModule, moduleHolder, - configurations + usages.map { usage -> + val variant = mainModule.variants.withType().single { + it.compilation == usage.compilation + } + (usage as? DefaultKotlinUsageContext) ?: error("unexpected KotlinUsageContext type: ${usage.javaClass}") + AdvancedVariantPublicationRequest( + variant, + target.project.configurations.getByName(usage.dependencyConfigurationName), + usage.overrideConfigurationAttributes, + usage.overrideConfigurationArtifacts, + usage.includeIntoProjectStructureMetadata + ) + } ) + + VariantPublishingConfigurator.get(target.project).configurePublishing(request) } } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt index 6957ac1af87..9ac013fbcf2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt @@ -15,6 +15,7 @@ import org.gradle.api.attributes.Attribute import org.gradle.api.attributes.Usage.JAVA_RUNTIME_JARS import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.utils.dashSeparatedName +import org.jetbrains.kotlin.gradle.utils.listProperty import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName open class KotlinAndroidTarget( @@ -205,7 +206,7 @@ open class KotlinAndroidTarget( compilation, project.usageByName(usageName), dependencyConfigurationName, - overrideConfigurationArtifacts = setOf(artifact), + overrideConfigurationArtifacts = project.listProperty { listOf(artifact) }, overrideConfigurationAttributes = HierarchyAttributeContainer(configuration.attributes) { val valueString = run { val value = configuration.attributes.getAttribute(it) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt index 158fbd76b03..339b606cf1b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestReport import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.utils.dashSeparatedName +import org.jetbrains.kotlin.gradle.utils.listProperty import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import javax.inject.Inject @@ -101,7 +102,7 @@ constructor( compilation = compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME), usage = project.usageByName("java-api-jars"), dependencyConfigurationName = commonFakeApiElementsConfigurationName, - overrideConfigurationArtifacts = emptySet() + overrideConfigurationArtifacts = project.listProperty { emptyList() } ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt index 228f4811606..158908e7423 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.registerTask +import org.jetbrains.kotlin.gradle.utils.listProperty import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import javax.inject.Inject @@ -67,7 +68,7 @@ constructor( compilation = compilations.getByName(MAIN_COMPILATION_NAME), usage = project.usageByName("java-api-jars"), dependencyConfigurationName = commonFakeApiElementsConfigurationName, - overrideConfigurationArtifacts = emptySet() + overrideConfigurationArtifacts = project.listProperty { emptyList() } ) }