[Gradle] Do not add default 'dependsOn common(Main|Test)' edges when KotlinTargetHierarchy is applied

KT-34662
This commit is contained in:
Sebastian Sellmair
2023-03-07 18:01:46 +01:00
committed by Space Team
parent 80ffd72f25
commit 7ab6349ad5
12 changed files with 89 additions and 67 deletions
@@ -52,8 +52,10 @@ abstract class KotlinMultiplatformExtension(project: Project) :
configure(presetExtension)
}
internal val internalKotlinTargetHierarchy by lazy { KotlinTargetHierarchyDslImpl(targets, sourceSets) }
@ExperimentalKotlinGradlePluginApi
val targetHierarchy: KotlinTargetHierarchyDsl get() = KotlinTargetHierarchyDslImpl(targets, sourceSets)
val targetHierarchy: KotlinTargetHierarchyDsl get() = internalKotlinTargetHierarchy
@Suppress("unused") // DSL
val testableTargets: NamedDomainObjectCollection<KotlinTargetWithTests<*, *>>
@@ -171,14 +171,18 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
private fun configureSourceSets(project: Project) = with(project.multiplatformExtension) {
val production = sourceSets.create(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME)
val test = sourceSets.create(KotlinSourceSet.COMMON_TEST_SOURCE_SET_NAME)
targets.all { target ->
target.compilations.findByName(KotlinCompilation.MAIN_COMPILATION_NAME)?.let { mainCompilation ->
mainCompilation.defaultSourceSet.takeIf { it != production }?.dependsOn(production)
}
project.launch(KotlinMultiplatformPluginLifecycle.Stage.FinaliseRefinesEdges) {
/* Only setup default refines edges when no KotlinTargetHierarchy was applied */
if (project.multiplatformExtension.internalKotlinTargetHierarchy.appliedDescriptors.isNotEmpty()) return@launch
target.compilations.findByName(KotlinCompilation.TEST_COMPILATION_NAME)?.let { testCompilation ->
testCompilation.defaultSourceSet.takeIf { it != test }?.dependsOn(test)
target.compilations.findByName(KotlinCompilation.MAIN_COMPILATION_NAME)?.let { mainCompilation ->
mainCompilation.defaultSourceSet.takeIf { it != production }?.dependsOn(production)
}
target.compilations.findByName(KotlinCompilation.TEST_COMPILATION_NAME)?.let { testCompilation ->
testCompilation.defaultSourceSet.takeIf { it != test }?.dependsOn(test)
}
}
val targetName = if (target is KotlinNativeTarget)
@@ -17,11 +17,17 @@ internal class KotlinTargetHierarchyDslImpl(
private val targets: DomainObjectCollection<KotlinTarget>,
private val sourceSets: NamedDomainObjectContainer<KotlinSourceSet>
) : KotlinTargetHierarchyDsl {
private val _appliedDescriptors = mutableListOf<KotlinTargetHierarchyDescriptor>()
val appliedDescriptors: List<KotlinTargetHierarchyDescriptor> get() = _appliedDescriptors
override fun apply(
hierarchyDescriptor: KotlinTargetHierarchyDescriptor,
describeExtension: (KotlinTargetHierarchyBuilder.() -> Unit)?
) {
applyKotlinTargetHierarchy(hierarchyDescriptor.extendIfNotNull(describeExtension), targets, sourceSets)
val descriptor = hierarchyDescriptor.extendIfNotNull(describeExtension)
_appliedDescriptors.add(descriptor)
applyKotlinTargetHierarchy(descriptor, targets, sourceSets)
}
override fun default(describeExtension: (KotlinTargetHierarchyBuilder.() -> Unit)?) {
@@ -8,9 +8,12 @@ package org.jetbrains.kotlin.gradle.plugin.sources.android.configurator
import com.android.build.gradle.api.AndroidSourceSet
import com.android.build.gradle.api.BaseVariant
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet.Companion.COMMON_MAIN_SOURCE_SET_NAME
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet.Companion.COMMON_TEST_SOURCE_SET_NAME
import org.jetbrains.kotlin.gradle.plugin.kotlinMultiplatformPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import org.jetbrains.kotlin.gradle.plugin.sources.android.AndroidBaseSourceSetName
import org.jetbrains.kotlin.gradle.plugin.sources.android.AndroidVariantType
@@ -28,14 +31,22 @@ internal object MultiplatformLayoutV2DependsOnConfigurator : KotlinAndroidSource
}
private fun setDefaultDependsOn(target: KotlinAndroidTarget, kotlinSourceSet: KotlinSourceSet, variantType: AndroidVariantType) {
/* Add default dependency on 'commonMain' or 'commonTest' */
val commonMain = target.project.kotlinExtension.sourceSets.getByName(COMMON_MAIN_SOURCE_SET_NAME)
val commonTest = target.project.kotlinExtension.sourceSets.getByName(COMMON_TEST_SOURCE_SET_NAME)
target.project.kotlinMultiplatformPluginLifecycle.launch {
await(KotlinMultiplatformPluginLifecycle.Stage.FinaliseRefinesEdges)
/* Only setup default if not KotlinTargetHierarchy was applied */
if (target.project.multiplatformExtensionOrNull?.internalKotlinTargetHierarchy?.appliedDescriptors.orEmpty().isNotEmpty()) {
return@launch
}
when (variantType) {
AndroidVariantType.Main -> kotlinSourceSet.dependsOn(commonMain)
AndroidVariantType.UnitTest -> kotlinSourceSet.dependsOn(commonTest)
AndroidVariantType.InstrumentedTest, AndroidVariantType.Unknown -> Unit
/* Add default dependency on 'commonMain' or 'commonTest' */
val commonMain = target.project.kotlinExtension.sourceSets.getByName(COMMON_MAIN_SOURCE_SET_NAME)
val commonTest = target.project.kotlinExtension.sourceSets.getByName(COMMON_TEST_SOURCE_SET_NAME)
when (variantType) {
AndroidVariantType.Main -> kotlinSourceSet.dependsOn(commonMain)
AndroidVariantType.UnitTest -> kotlinSourceSet.dependsOn(commonTest)
AndroidVariantType.InstrumentedTest, AndroidVariantType.Unknown -> Unit
}
}
}
}
@@ -20,6 +20,7 @@ class IdeDependsOnDependencyResolverTest {
fun `test - sample 0 - default dependsOn to commonMain and commonTest`() {
val project = buildProjectWithMPP()
val kotlin = project.multiplatformExtension
kotlin.targetHierarchy.default()
kotlin.jvm()
val commonMain = kotlin.sourceSets.getByName("commonMain")
@@ -41,6 +42,7 @@ class IdeDependsOnDependencyResolverTest {
fun `test - sample 1 - custom dependsOn edge`() {
val project = buildProjectWithMPP()
val kotlin = project.multiplatformExtension
kotlin.targetHierarchy.default()
kotlin.jvm()
val commonMain = kotlin.sourceSets.getByName("commonMain")
val customMain = kotlin.sourceSets.create("customMain")
@@ -25,6 +25,7 @@ class IdeNativePlatformDependencyResolverTest {
fun `test - posix on linux`() {
val project = buildProjectWithMPP()
val kotlin = project.multiplatformExtension
kotlin.targetHierarchy.default()
kotlin.linuxX64()
val commonMain = kotlin.sourceSets.getByName("commonMain")
@@ -48,6 +49,7 @@ class IdeNativePlatformDependencyResolverTest {
Assume.assumeTrue("Macos host required for this test", HostManager.hostIsMac)
val project = buildProjectWithMPP()
val kotlin = project.multiplatformExtension
kotlin.targetHierarchy.default()
kotlin.macosArm64()
val commonMain = kotlin.sourceSets.getByName("commonMain")
@@ -82,6 +82,7 @@ class CInteropMetadataDependencyTransformationTaskTest : MultiplatformExtensionT
@Test
fun `test task disabled for non shared-native source sets`() {
project.enableCInteropCommonization(true)
kotlin.targetHierarchy.default()
kotlin.linuxArm64()
kotlin.linuxX64()
kotlin.jvm()
@@ -89,13 +90,12 @@ class CInteropMetadataDependencyTransformationTaskTest : MultiplatformExtensionT
val commonMain = kotlin.sourceSets.getByName("commonMain")
val linuxArm64Main = kotlin.sourceSets.getByName("linuxArm64Main")
val linuxX64Main = kotlin.sourceSets.getByName("linuxX64Main")
val linuxMain = kotlin.sourceSets.create("linuxMain") as DefaultKotlinSourceSet
val linuxMain = kotlin.sourceSets.getByName("linuxMain") as DefaultKotlinSourceSet
linuxMain.dependsOn(commonMain)
linuxArm64Main.dependsOn(linuxMain)
linuxX64Main.dependsOn(linuxMain)
listOf(
"commonMain", "jvmMain", "linuxArm64Main", "linuxX64Main"
).map { sourceSetName -> kotlin.sourceSets.getByName(sourceSetName) }.forEach { sourceSet ->
@@ -116,7 +116,6 @@ class K2MultiplatformStructureTest {
/* check dependsOnEdges */
assertEquals(
setOf(
RefinesEdge(defaultSourceSet.name, "commonMain"),
RefinesEdge(defaultSourceSet.name, "intermediateMain"),
RefinesEdge("intermediateMain", "commonMain")
),
@@ -55,48 +55,12 @@ class KotlinTargetHierarchyDslTest {
}
assertEquals(
stringSetOf(
"androidNativeArm32Main",
"androidNativeArm64Main",
"iosArm32Main",
"iosArm64Main",
"iosSimulatorArm64Main",
"iosX64Main",
"linuxArm32HfpMain",
"linuxX64Main",
"macosArm64Main",
"macosX64Main",
"mingwX64Main",
"mingwX86Main",
"nativeMain",
"tvosArm64Main",
"tvosX64Main",
"watchosArm32Main",
"watchosArm64Main"
),
stringSetOf("nativeMain"),
kotlin.dependingSourceSetNames("commonMain")
)
assertEquals(
stringSetOf(
"androidNativeArm32Test",
"androidNativeArm64Test",
"iosArm32Test",
"iosArm64Test",
"iosSimulatorArm64Test",
"iosX64Test",
"linuxArm32HfpTest",
"linuxX64Test",
"macosArm64Test",
"macosX64Test",
"mingwX64Test",
"mingwX86Test",
"nativeTest",
"tvosArm64Test",
"tvosX64Test",
"watchosArm32Test",
"watchosArm64Test"
), kotlin.dependingSourceSetNames("commonTest")
stringSetOf("nativeTest"), kotlin.dependingSourceSetNames("commonTest")
)
assertEquals(
@@ -222,7 +186,7 @@ class KotlinTargetHierarchyDslTest {
project.evaluate()
assertEquals(
stringSetOf("androidDebug", "androidMain", "androidRelease", "jvmAndAndroidMain", "jvmMain"),
stringSetOf("jvmAndAndroidMain"),
kotlin.dependingSourceSetNames("commonMain")
)
@@ -232,7 +196,7 @@ class KotlinTargetHierarchyDslTest {
)
assertEquals(
stringSetOf("jvmAndAndroidTest", "jvmTest", "androidUnitTest", "androidUnitTestDebug", "androidUnitTestRelease"),
stringSetOf("jvmAndAndroidTest"),
kotlin.dependingSourceSetNames("commonTest")
)
@@ -270,7 +234,7 @@ class KotlinTargetHierarchyDslTest {
}
assertEquals(
stringSetOf("baseMain", "linuxX64Main"), kotlin.dependingSourceSetNames("commonMain")
stringSetOf("baseMain"), kotlin.dependingSourceSetNames("commonMain")
)
assertEquals(
@@ -306,7 +270,7 @@ class KotlinTargetHierarchyDslTest {
kotlin.mingwX64()
assertEquals(
stringSetOf("nativeMain", "nixMain", "linuxX64Main", "macosX64Main", "mingwX64Main"),
stringSetOf("nativeMain", "nixMain"),
kotlin.dependingSourceSetNames("commonMain")
)
@@ -336,7 +300,7 @@ class KotlinTargetHierarchyDslTest {
kotlin.js()
assertEquals(
stringSetOf("webMain", "jsMain", "wasmMain"),
stringSetOf("webMain"),
kotlin.dependingSourceSetNames("commonMain")
)
@@ -367,7 +331,7 @@ class KotlinTargetHierarchyDslTest {
kotlin.linuxX64()
assertEquals(
stringSetOf("jsAndJvmMain", "wasmAndLinuxMain", "jvmMain", "linuxX64Main", "jsMain", "wasmMain"),
stringSetOf("jsAndJvmMain", "wasmAndLinuxMain"),
kotlin.dependingSourceSetNames("commonMain")
)
@@ -408,7 +372,7 @@ class KotlinTargetHierarchyDslTest {
)
assertEquals(
stringSetOf("baseMain", "linuxX64Main"), kotlin.dependingSourceSetNames("commonMain")
stringSetOf("baseMain"), kotlin.dependingSourceSetNames("commonMain")
)
assertEquals(
@@ -9,6 +9,7 @@
package org.jetbrains.kotlin.gradle.unitTests
import org.gradle.api.Project
import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.plugins.ExtraPropertiesExtension
import org.gradle.testfixtures.ProjectBuilder
import org.jetbrains.kotlin.commonizer.CommonizerTarget
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
import org.jetbrains.kotlin.gradle.util.addBuildEventsListenerRegistryMock
import org.jetbrains.kotlin.gradle.util.buildProject
import org.jetbrains.kotlin.konan.target.KonanTarget.*
import kotlin.test.BeforeTest
import kotlin.test.Test
@@ -25,12 +27,12 @@ import kotlin.test.assertNull
class SourceSetCommonizerTargetTest {
private lateinit var project: Project
private lateinit var project: ProjectInternal
private lateinit var kotlin: KotlinMultiplatformExtension
@BeforeTest
fun setup() {
project = ProjectBuilder.builder().build()
project = buildProject()
addBuildEventsListenerRegistryMock(project)
project.extensions.getByType(ExtraPropertiesExtension::class.java).set("kotlin.mpp.enableCompatibilityMetadataVariant", "false")
project.plugins.apply("kotlin-multiplatform")
@@ -54,6 +56,8 @@ class SourceSetCommonizerTargetTest {
assertEquals(CommonizerTarget(LINUX_X64), getCommonizerTarget(linuxTest))
assertEquals(CommonizerTarget(MACOS_X64), getCommonizerTarget(macosMain))
assertEquals(CommonizerTarget(MACOS_X64), getCommonizerTarget(macosTest))
project.evaluate()
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(commonMain))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(commonTest))
}
@@ -75,12 +79,15 @@ class SourceSetCommonizerTargetTest {
linuxMain.dependsOn(nativeMain)
macosMain.dependsOn(nativeMain)
assertEquals(CommonizerTarget(LINUX_X64), getCommonizerTarget(linuxMain))
assertEquals(CommonizerTarget(LINUX_X64), getCommonizerTarget(linuxTest))
assertEquals(CommonizerTarget(MACOS_X64), getCommonizerTarget(macosMain))
assertEquals(CommonizerTarget(MACOS_X64), getCommonizerTarget(macosTest))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(nativeMain))
project.evaluate()
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(commonMain))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(commonTest))
}
@@ -108,6 +115,8 @@ class SourceSetCommonizerTargetTest {
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(linuxBTest))
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(nativeMain))
project.evaluate()
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(commonMain))
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(commonTest))
}
@@ -153,6 +162,9 @@ class SourceSetCommonizerTargetTest {
CommonizerTarget(IOS_X64, IOS_ARM64, MACOS_X64, LINUX_X64),
getCommonizerTarget(nativeMain)
)
project.evaluate()
assertEquals(
CommonizerTarget(IOS_X64, IOS_ARM64, MACOS_X64, LINUX_X64),
getCommonizerTarget(commonMain)
@@ -193,6 +205,7 @@ class SourceSetCommonizerTargetTest {
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(nativeMain))
project.evaluate()
assertNull(getCommonizerTarget(commonMain), "Expected commonMain to have no commonizer target")
assertNull(getCommonizerTarget(commonTest), "Expected commonTest to have no commonizer target")
}
@@ -9,7 +9,9 @@ package org.jetbrains.kotlin.gradle.unitTests.sources
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.enqueue
import org.jetbrains.kotlin.gradle.plugin.mpp.getHostSpecificMainSharedSourceSets
import org.jetbrains.kotlin.gradle.plugin.sources.InternalKotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.internal
@@ -47,7 +49,7 @@ class InternalKotlinSourceSetTest {
nativeMain.dependsOn(commonMain)
assertEquals<Set<KotlinCompilation<*>>>(
setOf(metadataCompilation, jvmCompilation, linuxCompilation, macosCompilation),
setOf(metadataCompilation),
commonMain.internal.compilations
)
@@ -67,6 +69,20 @@ class InternalKotlinSourceSetTest {
setOf(linuxCompilation, macosCompilation),
nativeMain.internal.compilations
)
project.enqueue(KotlinMultiplatformPluginLifecycle.Stage.Finalised) {
assertEquals<Set<KotlinCompilation<*>>>(
setOf(
metadataCompilation,
kotlin.metadata().compilations.getByName("commonMain"),
kotlin.metadata().compilations.getByName("nativeMain"),
jvmCompilation, linuxCompilation, macosCompilation
),
commonMain.internal.compilations
)
}
project.evaluate()
}
@Test
@@ -80,6 +96,7 @@ class InternalKotlinSourceSetTest {
val nativeMain = kotlin.sourceSets.create("nativeMain")
val linuxMain = kotlin.sourceSets.create("linuxMain")
val linuxX64Main = kotlin.sourceSets.getByName("linuxX64Main")
linuxX64Main.dependsOn(commonMain)
assertEquals(
setOf(commonMain, linuxX64Main),
@@ -22,7 +22,9 @@ import kotlin.test.assertNotNull
class SourceSetVisibilityInferenceTest {
private val project = buildProjectWithMPP()
private val kotlin = project.multiplatformExtension
private val kotlin = project.multiplatformExtension.apply {
targetHierarchy.default()
}
@Test
fun testBasicSuccessful() {