From d820ddc27de95e628808d5cfa881b0b5d8ab3e76 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Fri, 6 Oct 2023 10:45:50 +0200 Subject: [PATCH] [Gradle] Mark "main" metadata compilation as non-klib in all cases Metadata compilation with name "main" isn't used in Hierarchical Multiplatform. It used to compile commonMain source set to legacy metadata artifacts. With Hierarchical MPP common source sets start to compile to klib metadata. --- .../KotlinMetadataTargetConfigurator.kt | 5 ++-- .../KotlinMetadataTargetCompilationsTest.kt | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) 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") }