From bec2f89a073258aff1b1e56f34ec08e37fc67cf4 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Tue, 16 Nov 2021 21:19:02 +0100 Subject: [PATCH] [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 --- .../jetbrains/kotlin/gradle/CommonizerIT.kt | 10 +++++++ .../build.gradle.kts | 27 ++++++++++++++++++ .../gradle.properties | 6 ++++ .../settings.gradle.kts | 10 +++++++ .../src/commonMain/kotlin/CommonMain.kt | 8 ++++++ .../gradle/SourceSetCommonizerTargetTest.kt | 28 +++++++++++++++++++ .../GetCommonizerTargetOfSourceSet.kt | 11 ++++---- 7 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/src/commonMain/kotlin/CommonMain.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerIT.kt index 7af5b848a87..84bcbc37334 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerIT.kt @@ -426,6 +426,16 @@ class CommonizerIT : BaseGradleIT() { `test multiple cinterops with test source sets and compilations`(false) } + @Test + fun `test KT-49735 two kotlin targets with same konanTarget`() { + with(Project("commonize-kt-49735-twoKotlinTargets-oneKonanTarget")) { + build(":assemble") { + assertTasksExecuted(":compileCommonMainKotlinMetadata") + assertSuccessful() + } + } + } + private fun `test multiple cinterops with test source sets and compilations`(testSourceSetsDependingOnMain: Boolean) { with(Project("commonizeMultipleCInteropsWithTests", minLogLevel = INFO)) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/build.gradle.kts new file mode 100644 index 00000000000..45c507561b6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/build.gradle.kts @@ -0,0 +1,27 @@ +import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet +import org.jetbrains.kotlin.konan.target.HostManager + +plugins { + kotlin("multiplatform") +} + +repositories { + mavenCentral() + mavenLocal() +} + +kotlin { + val platformTargetA = when { + HostManager.hostIsMac -> macosX64("platformA") + HostManager.hostIsMingw -> mingwX64("platformA") + HostManager.hostIsLinux -> linuxX64("platformA") + else -> error("Unexpected host: ${HostManager.host}") + } + + val platformTargetB = when { + HostManager.hostIsMac -> macosX64("platformB") + HostManager.hostIsMingw -> mingwX64("platformB") + HostManager.hostIsLinux -> linuxX64("platformB") + else -> error("Unexpected host: ${HostManager.host}") + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/gradle.properties new file mode 100644 index 00000000000..90a66d97a63 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/gradle.properties @@ -0,0 +1,6 @@ +kotlin.code.style=official +kotlin.mpp.enableGranularSourceSetsMetadata=true +kotlin.mpp.enableCInteropCommonization=true +kotlin.native.enableDependencyPropagation=false +kotlin.mpp.enableIntransitiveMetadataConfiguration=true +kotlin.mpp.enableCompatibilityMetadataVariant=false diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/settings.gradle.kts new file mode 100644 index 00000000000..ecdece6ecfe --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/settings.gradle.kts @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + } + val kotlin_version: String by settings + plugins { + kotlin("multiplatform").version(kotlin_version) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/src/commonMain/kotlin/CommonMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/src/commonMain/kotlin/CommonMain.kt new file mode 100644 index 00000000000..8c8aaaccbae --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-49735-twoKotlinTargets-oneKonanTarget/src/commonMain/kotlin/CommonMain.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +object CommonMain { + fun x(stat: platform.posix.stat) = Unit +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/SourceSetCommonizerTargetTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/SourceSetCommonizerTargetTest.kt index 36a26bd8b52..279e9971c88 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/SourceSetCommonizerTargetTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/SourceSetCommonizerTargetTest.kt @@ -12,6 +12,7 @@ import org.gradle.api.Project import org.gradle.api.plugins.ExtraPropertiesExtension import org.gradle.testfixtures.ProjectBuilder import org.jetbrains.kotlin.commonizer.CommonizerTarget +import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget @@ -83,6 +84,33 @@ class SourceSetCommonizerTargetTest { assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), project.getCommonizerTarget(commonTest)) } + @Test + fun `nativeMain linuxX64-a linuxX64-b`() { + kotlin.linuxX64("linuxA") + kotlin.linuxX64("linuxB") + + val commonMain = kotlin.sourceSets.getByName("commonMain") + val commonTest = kotlin.sourceSets.getByName("commonTest") + val nativeMain = kotlin.sourceSets.create("nativeMain") + val linuxAMain = kotlin.sourceSets.getByName("linuxAMain") + val linuxBMain = kotlin.sourceSets.getByName("linuxBMain") + val linuxATest = kotlin.sourceSets.getByName("linuxATest") + val linuxBTest = kotlin.sourceSets.getByName("linuxBTest") + + nativeMain.dependsOn(commonMain) + linuxAMain.dependsOn(nativeMain) + linuxBMain.dependsOn(nativeMain) + + assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(linuxAMain)) + assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(linuxATest)) + assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(linuxBMain)) + assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(linuxBTest)) + + assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(nativeMain)) + assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(commonMain)) + assertEquals(LeafCommonizerTarget(LINUX_X64), project.getCommonizerTarget(commonTest)) + } + @Test fun `nativeMain iosMain linux macos iosX64 iosArm64`() { kotlin.linuxX64("linux") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt index caa8fb40846..f034bc095ef 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt @@ -14,17 +14,18 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilati import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation internal fun Project.getCommonizerTarget(sourceSet: KotlinSourceSet): CommonizerTarget? { - val compilationTargets = compilationsBySourceSets(this)[sourceSet].orEmpty() + val allCompilationLeafTargets = compilationsBySourceSets(this)[sourceSet].orEmpty() .filter { compilation -> compilation !is KotlinMetadataCompilation } .map { compilation -> getCommonizerTarget(compilation) ?: return null } + .allLeaves() return when { - compilationTargets.isEmpty() -> null - compilationTargets.size == 1 -> compilationTargets.single() - else -> SharedCommonizerTarget(compilationTargets.allLeaves()) + allCompilationLeafTargets.isEmpty() -> null + allCompilationLeafTargets.size == 1 -> allCompilationLeafTargets.single() + else -> SharedCommonizerTarget(allCompilationLeafTargets) } } internal fun Project.getSharedCommonizerTarget(sourceSet: KotlinSourceSet): SharedCommonizerTarget? { return getCommonizerTarget(sourceSet) as? SharedCommonizerTarget -} \ No newline at end of file +}