diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 39ba84b5538..3bb6ce72c25 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -333,7 +333,7 @@ open class NewMultiplatformIT : BaseGradleIT() { options = defaultBuildOptions().copy(jsCompilerType = jsCompilerType) ) { assertSuccessful() - assertTasksSkipped(":compileCommonMainKotlinMetadata") + assertTasksNotExecuted(":compileCommonMainKotlinMetadata") assertTasksExecuted(*compileTasksNames.toTypedArray(), ":allMetadataJar") val groupDir = projectDir.resolve("repo/com/example") diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt index ed3b031fe6e..6aab10099c4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt @@ -21,11 +21,13 @@ import org.gradle.jvm.tasks.Jar import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME +import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.AfterFinaliseCompilations import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.targets.metadata.* import org.jetbrains.kotlin.gradle.targets.metadata.COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled +import org.jetbrains.kotlin.gradle.utils.Future import org.jetbrains.kotlin.gradle.utils.future import org.jetbrains.kotlin.gradle.utils.setProperty import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly @@ -38,23 +40,30 @@ abstract class KotlinSoftwareComponent( override fun getName(): String = name - private val metadataTarget get() = project.multiplatformExtension.metadata() + private val metadataTarget get() = project.multiplatformExtension.metadata() as KotlinMetadataTarget - override fun getVariants(): Set = kotlinTargets - .filter { target -> target !is KotlinMetadataTarget } - .flatMap { target -> - val targetPublishableComponentNames = target.internal.kotlinComponents - .filter { component -> component.publishable } - .map { component -> component.name } - .toSet() + private val _variants = project.future { + await(AfterFinaliseCompilations) + kotlinTargets + .filter { target -> target !is KotlinMetadataTarget } + .flatMap { target -> + val targetPublishableComponentNames = target.internal.kotlinComponents + .filter { component -> component.publishable } + .map { component -> component.name } + .toSet() - target.components.filter { it.name in targetPublishableComponentNames } - }.toSet() + target.components.filter { it.name in targetPublishableComponentNames } + }.toSet() + } + + override fun getVariants(): Set = _variants.getOrThrow() + + private val _usages: Future> = project.future { + metadataTarget.awaitMetadataCompilationsCreated() - private val _usages: Set by lazy { if (!project.isKotlinGranularMetadataEnabled) { val metadataCompilation = metadataTarget.compilations.getByName(MAIN_COMPILATION_NAME) - return@lazy metadataTarget.createUsageContexts(metadataCompilation) + return@future metadataTarget.createUsageContexts(metadataCompilation) } mutableSetOf().apply { @@ -70,7 +79,6 @@ abstract class KotlinSoftwareComponent( overrideConfigurationArtifacts = project.setProperty { listOf(allMetadataArtifact) } ) - if (project.isCompatibilityMetadataVariantEnabled) { // Ensure that consumers who expect Kotlin 1.2.x metadata package can still get one: // publish the old metadata artifact: @@ -97,8 +105,9 @@ abstract class KotlinSoftwareComponent( } } + override fun getUsages(): Set { - return _usages.publishableUsages() + return _usages.getOrThrow().publishableUsages() } private suspend fun allPublishableCommonSourceSets() = getCommonSourceSetsForMetadataCompilation(project) + diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index 8301389058e..5c6aa765329 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -290,10 +290,7 @@ class KotlinMetadataTargetConfigurator : val project = target.project val compilationName = sourceSet.name - - val platformCompilations = sourceSet.internal.compilations - .filter { it.target.name != KotlinMultiplatformPlugin.METADATA_TARGET_NAME } - + val platformCompilations = sourceSet.internal.awaitPlatformCompilations() val isNativeSourceSet = sourceSet.isNativeSourceSet.await() val compilationFactory: KotlinCompilationFactory> = when {