[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.
This commit is contained in:
Anton Lakotka
2023-10-06 10:45:50 +02:00
committed by Space Team
parent f01c8de216
commit d820ddc27d
2 changed files with 28 additions and 2 deletions
@@ -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]
@@ -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<KotlinCommonCompilation>()
.associate { it.name to it.isKlibCompilation }
val expectedCommonMetadataCompilations = mapOf(
"main" to false,
"commonMain" to true
)
assertEquals(expectedCommonMetadataCompilations, metadataCompilations)
}
}
private fun NamedDomainObjectContainer<KotlinCompilation<*>>.assertExists(name: String) {
if (name !in names) fail("Missing '$name' compilation")
}