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 9b89318bcd5..4a3a516a4f9 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 @@ -69,11 +69,12 @@ class KotlinMetadataTargetConfigurator : KotlinBuildStatsService.getInstance()?.report(BooleanMetrics.ENABLED_HMPP, true) target.compilations.withType(KotlinCommonCompilation::class.java).getByName(KotlinCompilation.MAIN_COMPILATION_NAME).run { + // Force the default 'main' compilation to produce *.kotlin_metadata regardless of the klib feature flag. + forceCompilationToKotlinMetadata = true + // Capture it here to use in onlyIf spec. Direct usage causes serialization of target attempt when configuration cache is enabled val isCompatibilityMetadataVariantEnabled = target.project.isCompatibilityMetadataVariantEnabled if (isCompatibilityMetadataVariantEnabled) { - // Force the default 'main' compilation to produce *.kotlin_metadata regardless of the klib feature flag. - forceCompilationToKotlinMetadata = true // Add directly dependsOn sources for Legacy Compatibility Metadata variant // it isn't necessary for KLib compilations // see [KotlinCompilationSourceSetInclusion.AddSourcesWithoutDependsOnClosure] diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMetadataTargetCompilationsTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMetadataTargetCompilationsTest.kt index bf286f3c9a3..4af47d2ae65 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMetadataTargetCompilationsTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMetadataTargetCompilationsTest.kt @@ -11,10 +11,12 @@ import org.gradle.api.NamedDomainObjectContainer import org.jetbrains.kotlin.gradle.dsl.metadataTarget import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCommonCompilation import org.jetbrains.kotlin.gradle.targets.metadata.awaitMetadataCompilationsCreated import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest import kotlin.test.Test +import kotlin.test.assertEquals import kotlin.test.fail class KotlinMetadataTargetCompilationsTest { @@ -55,6 +57,29 @@ class KotlinMetadataTargetCompilationsTest { } } + @Test + fun `test - metadata compilations - isKlibCompilation`() { + val project = buildProjectWithMPP() + val kotlin = project.multiplatformExtension + kotlin.jvm() + kotlin.linuxX64() + kotlin.linuxArm64() + + project.runLifecycleAwareTest { + val target = kotlin.metadataTarget + val metadataCompilations = target.awaitMetadataCompilationsCreated() // returns common + shared native + .filterIsInstance() + .associate { it.name to it.isKlibCompilation } + + val expectedCommonMetadataCompilations = mapOf( + "main" to false, + "commonMain" to true + ) + + assertEquals(expectedCommonMetadataCompilations, metadataCompilations) + } + } + private fun NamedDomainObjectContainer>.assertExists(name: String) { if (name !in names) fail("Missing '$name' compilation") }