Skip to content

Commit bec2f89

Browse files
sellmairSpace
authored andcommitted
[Gradle, MPP] Fix 'getCommonizerTarget' for source sets participating in multiple compilations of the same konanTarget
The previous implementation would return a 'SharedCommonizerTarget' containing just a single leaf target. This would trigger the commonizer. The new implementation will correctly return just a single LeafCommonizerTarget instead. ^KT-49735 Verification Pending
1 parent cb37424 commit bec2f89

File tree

7 files changed

+95
-5
lines changed

7 files changed

+95
-5
lines changed

libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerIT.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,16 @@ class CommonizerIT : BaseGradleIT() {
426426
`test multiple cinterops with test source sets and compilations`(false)
427427
}
428428

429+
@Test
430+
fun `test KT-49735 two kotlin targets with same konanTarget`() {
431+
with(Project("commonize-kt-49735-twoKotlinTargets-oneKonanTarget")) {
432+
build(":assemble") {
433+
assertTasksExecuted(":compileCommonMainKotlinMetadata")
434+
assertSuccessful()
435+
}
436+
}
437+
}
438+
429439
private fun `test multiple cinterops with test source sets and compilations`(testSourceSetsDependingOnMain: Boolean) {
430440
with(Project("commonizeMultipleCInteropsWithTests", minLogLevel = INFO)) {
431441

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet
2+
import org.jetbrains.kotlin.konan.target.HostManager
3+
4+
plugins {
5+
kotlin("multiplatform")
6+
}
7+
8+
repositories {
9+
mavenCentral()
10+
mavenLocal()
11+
}
12+
13+
kotlin {
14+
val platformTargetA = when {
15+
HostManager.hostIsMac -> macosX64("platformA")
16+
HostManager.hostIsMingw -> mingwX64("platformA")
17+
HostManager.hostIsLinux -> linuxX64("platformA")
18+
else -> error("Unexpected host: ${HostManager.host}")
19+
}
20+
21+
val platformTargetB = when {
22+
HostManager.hostIsMac -> macosX64("platformB")
23+
HostManager.hostIsMingw -> mingwX64("platformB")
24+
HostManager.hostIsLinux -> linuxX64("platformB")
25+
else -> error("Unexpected host: ${HostManager.host}")
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kotlin.code.style=official
2+
kotlin.mpp.enableGranularSourceSetsMetadata=true
3+
kotlin.mpp.enableCInteropCommonization=true
4+
kotlin.native.enableDependencyPropagation=false
5+
kotlin.mpp.enableIntransitiveMetadataConfiguration=true
6+
kotlin.mpp.enableCompatibilityMetadataVariant=false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
pluginManagement {
2+
repositories {
3+
mavenLocal()
4+
gradlePluginPortal()
5+
}
6+
val kotlin_version: String by settings
7+
plugins {
8+
kotlin("multiplatform").version(kotlin_version)
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
3+
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
4+
*/
5+
6+
object CommonMain {
7+
fun x(stat: platform.posix.stat) = Unit
8+
}

libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/SourceSetCommonizerTargetTest.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.gradle.api.Project
1212
import org.gradle.api.plugins.ExtraPropertiesExtension
1313
import org.gradle.testfixtures.ProjectBuilder
1414
import org.jetbrains.kotlin.commonizer.CommonizerTarget
15+
import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget
1516
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
1617
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
1718
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
@@ -83,6 +84,33 @@ class SourceSetCommonizerTargetTest {
8384
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), project.getCommonizerTarget(commonTest))
8485
}
8586

87+
@Test
88+
fun `nativeMain linuxX64-a linuxX64-b`() {
89+
kotlin.linuxX64("linuxA")
90+
kotlin.linuxX64("linuxB")
91+
92+
val commonMain = kotlin.sourceSets.getByName("commonMain")
93+
val commonTest = kotlin.sourceSets.getByName("commonTest")
94+
val nativeMain = kotlin.sourceSets.create("nativeMain")
95+
val linuxAMain = kotlin.sourceSets.getByName("linuxAMain")
96+
val linuxBMain = kotlin.sourceSets.getByName("linuxBMain")
97+
val linuxATest = kotlin.sourceSets.getByName("linuxATest")
98+
val linuxBTest = kotlin.sourceSets.getByName("linuxBTest")
99+
100+
nativeMain.dependsOn(commonMain)
101+
linuxAMain.dependsOn(nativeMain)
102+
linuxBMain.dependsOn(nativeMain)
103+
104+
assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(linuxAMain))
105+
assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(linuxATest))
106+
assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(linuxBMain))
107+
assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(linuxBTest))
108+
109+
assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(nativeMain))
110+
assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(commonMain))
111+
assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(commonTest))
112+
}
113+
86114
@Test
87115
fun `nativeMain iosMain linux macos iosX64 iosArm64`() {
88116
kotlin.linuxX64("linux")

libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,18 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilati
1414
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation
1515

1616
internal fun Project.getCommonizerTarget(sourceSet: KotlinSourceSet): CommonizerTarget? {
17-
val compilationTargets = compilationsBySourceSets(this)[sourceSet].orEmpty()
17+
val allCompilationLeafTargets = compilationsBySourceSets(this)[sourceSet].orEmpty()
1818
.filter { compilation -> compilation !is KotlinMetadataCompilation }
1919
.map { compilation -> getCommonizerTarget(compilation) ?: return null }
20+
.allLeaves()
2021

2122
return when {
22-
compilationTargets.isEmpty() -> null
23-
compilationTargets.size == 1 -> compilationTargets.single()
24-
else -> SharedCommonizerTarget(compilationTargets.allLeaves())
23+
allCompilationLeafTargets.isEmpty() -> null
24+
allCompilationLeafTargets.size == 1 -> allCompilationLeafTargets.single()
25+
else -> SharedCommonizerTarget(allCompilationLeafTargets)
2526
}
2627
}
2728

2829
internal fun Project.getSharedCommonizerTarget(sourceSet: KotlinSourceSet): SharedCommonizerTarget? {
2930
return getCommonizerTarget(sourceSet) as? SharedCommonizerTarget
30-
}
31+
}

0 commit comments

Comments
 (0)