diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleVariant.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleVariant.kt index f2032fd4c1f..ea5e6c8d94c 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleVariant.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleVariant.kt @@ -56,6 +56,7 @@ interface KotlinNativeVariant : KotlinGradleVariant { interface SingleMavenPublishedModuleHolder { fun assignMavenPublication(publication: MavenPublication) + fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit) val defaultPublishedModuleSuffix: String? val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider } 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 003f24b5529..118ed750d5a 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 @@ -16,7 +16,9 @@ import org.gradle.api.artifacts.Configuration import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection import org.gradle.api.file.SourceDirectorySet +import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.isMain import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName @@ -27,7 +29,7 @@ import org.jetbrains.kotlin.project.model.KotlinModuleDependency import org.jetbrains.kotlin.project.model.KotlinModuleFragment internal open class LegacyMappedVariant( - private val compilation: KotlinCompilation<*>, + internal val compilation: KotlinCompilation<*>, ) : KotlinGradleVariant { private val fragmentForDefaultSourceSet = (compilation.defaultSourceSet as FragmentMappedKotlinSourceSet).underlyingFragment @@ -149,7 +151,11 @@ internal class LegacyMappedVariantWithRuntime(private val compilationWithRuntime else project.configurations.maybeCreate(disambiguateName("runtimeElements")) } -internal fun mapTargetCompilationsToKpmVariants(target: KotlinTarget) { +internal enum class PublicationRegistrationMode { + IMMEDIATE, AFTER_EVALUATE +} + +internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, publicationRegistration: PublicationRegistrationMode) { target.compilations.all { compilation -> val variant = if (compilation is KotlinCompilationToRunnableFiles) LegacyMappedVariantWithRuntime(compilation) @@ -160,17 +166,39 @@ internal fun mapTargetCompilationsToKpmVariants(target: KotlinTarget) { val module = defaultSourceSetFragment.containingModule module.fragments.add(variant) + } + + val whenPublicationShouldRegister: (() -> Unit) -> Unit = when (publicationRegistration) { + PublicationRegistrationMode.IMMEDIATE -> ::run + PublicationRegistrationMode.AFTER_EVALUATE -> { + { target.project.whenEvaluated { it() } } + } + } + + whenPublicationShouldRegister { + val mainModule = target.project.kpmModules.getByName(KotlinGradleModule.MAIN_MODULE_NAME) + target.kotlinComponents.forEach { kotlinComponent -> + val moduleHolder = DefaultSingleMavenPublishedModuleHolder( + 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 configurationNames = usages.map { it.dependencyConfigurationName } + + // FIXME: apply overrides for attributes and artifacts from the DefaultKotlinUsageContext! + // FIXME: include additional variants into project structure metadata? - if (compilation.isMain()) { - val moduleHolder = DefaultSingleMavenPublishedModuleHolder(module, target.name) VariantPublishingConfigurator.get(target.project).configurePublishing( variant, moduleHolder, - listOfNotNull( - // FIXME: use the target's kotlinComponents to build the configurations - variant.apiElementsConfiguration.name, - if (variant is KotlinGradleVariantWithRuntime) variant.runtimeElementsConfiguration.name else null - ) + configurationNames ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt index d4ca5afde5a..6f38155a8fe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt @@ -57,9 +57,16 @@ class DefaultSingleMavenPublishedModuleHolder( private var assignedMavenPublication: MavenPublication? = null + private val publicationAssignedHandlers = mutableListOf<(MavenPublication) -> Unit>() + override fun assignMavenPublication(publication: MavenPublication) { if (assignedMavenPublication != null) error("already assigned publication $publication") assignedMavenPublication = publication + publicationAssignedHandlers.forEach { it(publication) } + } + + override fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit) { + assignedMavenPublication?.let(handlePublication) ?: publicationAssignedHandlers.add(handlePublication) } override val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider = MavenPublicationCoordinatesProvider( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/variantPublishing.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/variantPublishing.kt index 714168ed216..bcdff6332f4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/variantPublishing.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/variantPublishing.kt @@ -9,6 +9,7 @@ import com.android.build.gradle.internal.publishing.AndroidArtifacts import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ModuleDependency +import org.gradle.api.artifacts.PublishArtifact import org.gradle.api.attributes.* import org.gradle.api.capabilities.Capability import org.gradle.api.component.AdhocComponentWithVariants @@ -51,13 +52,11 @@ open class VariantPublishingConfigurator @Inject constructor( open fun platformComponentName(variant: KotlinGradleVariant) = variant.disambiguateName("") - open fun inferMavenScopes(variant: KotlinGradleVariant, configurationNames: Iterable): Map = - configurationNames.associateWith { configurationName -> - when { - configurationName == variant.apiElementsConfiguration.name -> "compile" - variant is KotlinGradleVariantWithRuntime && configurationName == variant.runtimeElementsConfiguration.name -> "runtime" - else -> null - } + open fun inferMavenScope(variant: KotlinGradleVariant, configurationName: String): String? = + when { + configurationName == variant.apiElementsConfiguration.name -> "compile" + variant is KotlinGradleVariantWithRuntime && configurationName == variant.runtimeElementsConfiguration.name -> "runtime" + else -> null } open fun configurePublishing( @@ -66,7 +65,7 @@ open class VariantPublishingConfigurator @Inject constructor( publishConfigurations: Iterable ) { val componentName = platformComponentName(variant) - val configurationsMap = inferMavenScopes(variant, publishConfigurations) + val configurationsMap = publishConfigurations.associateWith { inferMavenScope(variant, it) } registerPlatformModulePublication( componentName, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt index 1d1f322b05a..d20a80f7968 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt @@ -10,6 +10,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.PublicationRegistrationMode import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.mapTargetCompilationsToKpmVariants import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService @@ -105,7 +106,7 @@ open class KotlinJsTargetPreset( override fun createTarget(name: String): KotlinJsTarget { val result = super.createTarget(name) if (project.hasKpmModel) { - mapTargetCompilationsToKpmVariants(result) + mapTargetCompilationsToKpmVariants(result, PublicationRegistrationMode.IMMEDIATE) } return result } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt index b438d4280c1..f6b65ff8939 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt @@ -112,7 +112,7 @@ abstract class AbstractKotlinNativeTargetPreset( } if (project.hasKpmModel && !result.isKpm) { - mapTargetCompilationsToKpmVariants(result) + mapTargetCompilationsToKpmVariants(result, PublicationRegistrationMode.AFTER_EVALUATE) } return result