From 5f266492463da22668ab1b664da6dbdabff8209c Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Wed, 12 Oct 2022 12:47:14 +0200 Subject: [PATCH] [Gradle] Introduce getHostSpecificMainSharedSourceSets ^KT-48839 --- .../targets/native/KotlinNativeTarget.kt | 21 +++++++ .../sources/InternalKotlinSourceSetTest.kt | 62 +++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt index 5cfb84b0547..24e1e4a49f3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt @@ -186,6 +186,27 @@ internal fun getHostSpecificSourceSets(project: Project): Set { ) } +/** + * Returns all host-specific source sets that will be compiled to two or more targets + */ +internal fun getHostSpecificMainSharedSourceSets(project: Project): Set { + fun KotlinSourceSet.testOnly(): Boolean = internal.compilations.all { it.isTest() } + + fun KotlinSourceSet.isCompiledToSingleTarget(): Boolean { + return internal + .compilations + // if for some reason [it.target] is not a [KotlinNativeTarget] then assume that it is not a host-specific source set + .distinctBy { (it.target as? KotlinNativeTarget)?.konanTarget ?: return false } + .size == 1 + } + + return getHostSpecificSourceSets(project) + .filterNot { it.testOnly() } + .filterNot { it.isCompiledToSingleTarget() } + .toSet() +} + + abstract class KotlinNativeTargetWithTests( project: Project, konanTarget: KonanTarget diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/InternalKotlinSourceSetTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/InternalKotlinSourceSetTest.kt index a9fe1f44b22..ba406fdc6ef 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/InternalKotlinSourceSetTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/InternalKotlinSourceSetTest.kt @@ -10,10 +10,12 @@ package org.jetbrains.kotlin.gradle.sources import org.jetbrains.kotlin.gradle.assertAllImplementationsAlsoImplement import org.jetbrains.kotlin.gradle.buildProjectWithMPP import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.kotlin import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.InternalKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.internal +import org.jetbrains.kotlin.gradle.plugin.mpp.getHostSpecificMainSharedSourceSets import org.jetbrains.kotlin.gradle.reflections import org.junit.jupiter.api.assertAll import kotlin.reflect.full.isSubclassOf @@ -106,4 +108,64 @@ class InternalKotlinSourceSetTest { linuxX64Main.internal.withDependsOnClosure ) } + + @Test + fun `test getHostSpecificMainSharedSourceSets`() { + val project = buildProjectWithMPP { + kotlin { + jvm() + linuxX64() + linuxArm64() + ios() // host specific from preset + } + } + + val kotlin = project.multiplatformExtension + + with(kotlin.sourceSets) { + val commonMain = getByName("commonMain") + val commonTest = getByName("commonTest") + val iosMain = getByName("iosMain") + val iosTest = getByName("iosTest") + + val iosX64Main = getByName("iosX64Main") + val iosArm64Main = getByName("iosArm64Main") + val iosX64Test = getByName("iosX64Test") + val iosArm64Test = getByName("iosArm64Test") + + val linuxX64Main = getByName("linuxX64Main") + val linuxArm64Main = getByName("linuxArm64Main") + val linuxX64Test = getByName("linuxX64Test") + val linuxArm64Test = getByName("linuxArm64Test") + + // common -> ios2 -> ios + create("ios2Main") { it.dependsOn(commonMain); iosMain.dependsOn(it) } + create("ios2Test") { it.dependsOn(commonTest); iosTest.dependsOn(it) } + + // ... -> ios -> ios2{X64,Arm64} -> ios{X64,Arm64} + create("ios2X64Main") { it.dependsOn(iosMain); iosX64Main.dependsOn(it) } + create("ios2X64Test") { it.dependsOn(iosTest); iosX64Test.dependsOn(it) } + create("ios2Arm64Main") { it.dependsOn(iosMain); iosArm64Main.dependsOn(it) } + create("ios2Arm64Test") { it.dependsOn(iosTest); iosArm64Test.dependsOn(it) } + + // common -> linux + create("linuxMain") { + it.dependsOn(commonMain) + linuxX64Main.dependsOn(it) + linuxArm64Main.dependsOn(it) + } + create("linuxTest") { + it.dependsOn(commonTest) + linuxX64Test.dependsOn(it) + linuxArm64Test.dependsOn(it) + } + } + + project.evaluate() + + val expected = listOf("iosMain", "ios2Main").sorted() + val actual = getHostSpecificMainSharedSourceSets(project).map { it.name }.sorted() + + assertEquals(expected, actual) + } }