[Gradle] Implement .commonizerTarget as 'Future' value

^KT-34662 Verification Pending
This commit is contained in:
Sebastian Sellmair
2023-03-10 12:24:59 +01:00
committed by Space Team
parent 02120a6822
commit ec2d8150fd
18 changed files with 179 additions and 157 deletions
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPro
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.SourceSetConstraint
import org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers.*
import org.jetbrains.kotlin.gradle.plugin.ide.dependencyTransformers.IdePlatformStdlibCommonDependencyFilter
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
import org.jetbrains.kotlin.gradle.targets.native.internal.commonizerTarget
internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMultiplatformImport {
return IdeMultiplatformImportImpl(extension).apply {
@@ -95,7 +95,7 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti
registerDependencyResolver(
resolver = IdeCommonizedCinteropDependencyResolver,
constraint = { sourceSet -> getCommonizerTarget(sourceSet) is SharedCommonizerTarget },
constraint = { sourceSet -> sourceSet.commonizerTarget.getOrThrow() is SharedCommonizerTarget },
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default,
)
@@ -15,8 +15,8 @@ import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropMetadataDependencyTransformationTask
import org.jetbrains.kotlin.gradle.targets.native.internal.cinteropMetadataDependencyTransformationForIdeTaskName
import org.jetbrains.kotlin.gradle.targets.native.internal.commonizerTarget
import org.jetbrains.kotlin.gradle.targets.native.internal.createCInteropMetadataDependencyClasspathForIde
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
import org.jetbrains.kotlin.gradle.tasks.locateTask
internal object IdeCInteropMetadataDependencyClasspathResolver : IdeDependencyResolver, IdeDependencyResolver.WithBuildDependencies {
@@ -33,7 +33,7 @@ internal object IdeCInteropMetadataDependencyClasspathResolver : IdeDependencyRe
override fun dependencies(project: Project): Iterable<Any> {
return project.multiplatformExtension.sourceSets
.filterIsInstance<DefaultKotlinSourceSet>()
.filter { getCommonizerTarget(it) is SharedCommonizerTarget }
.filter { it.commonizerTarget.getOrThrow() is SharedCommonizerTarget}
.mapNotNull { project.locateDependencyTask(it) }
}
@@ -12,9 +12,8 @@ import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isCommonized
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.plugin.sources.project
import org.jetbrains.kotlin.gradle.targets.native.internal.commonizeNativeDistributionTask
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
import org.jetbrains.kotlin.gradle.targets.native.internal.commonizerTarget
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
internal object IdeCommonizedNativePlatformDependencyResolver :
@@ -22,7 +21,7 @@ internal object IdeCommonizedNativePlatformDependencyResolver :
override fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency> {
val project = sourceSet.project
val commonizerTarget = getCommonizerTarget(sourceSet) as? SharedCommonizerTarget ?: return emptySet()
val commonizerTarget = sourceSet.commonizerTarget.getOrThrow() as? SharedCommonizerTarget ?: return emptySet()
val commonizerTask = project.commonizeNativeDistributionTask?.get() ?: return emptySet()
val outputDirectory = resolveCommonizedDirectory(commonizerTask.rootOutputDirectory, commonizerTarget)
@@ -13,14 +13,13 @@ import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.plugin.sources.project
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
import org.jetbrains.kotlin.gradle.targets.native.internal.commonizerTarget
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
internal object IdeNativePlatformDependencyResolver : IdeDependencyResolver {
override fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency> {
val project = sourceSet.project
val commonizerTarget = getCommonizerTarget(sourceSet) as? LeafCommonizerTarget ?: return emptySet()
val commonizerTarget = sourceSet.commonizerTarget.getOrThrow() as? LeafCommonizerTarget ?: return emptySet()
val konanTarget = commonizerTarget.konanTargetOrNull ?: return emptySet()
return sourceSet.project.konanDistribution.platformLibsDir.resolve(konanTarget.name)
@@ -272,7 +272,7 @@ class KotlinMetadataTargetConfigurator :
}
}
private fun createMetadataCompilation(
private suspend fun createMetadataCompilation(
target: KotlinMetadataTarget,
sourceSet: KotlinSourceSet,
allMetadataJar: TaskProvider<out Jar>,
@@ -331,7 +331,7 @@ class KotlinMetadataTargetConfigurator :
}
}
private fun configureMetadataDependenciesForCompilation(compilation: KotlinCompilation<*>) {
private suspend fun configureMetadataDependenciesForCompilation(compilation: KotlinCompilation<*>) {
val project = compilation.target.project
val sourceSet = compilation.defaultSourceSet
@@ -348,7 +348,7 @@ class KotlinMetadataTargetConfigurator :
// Transformed Multiplatform Libraries based on source set visibility
compilation.compileDependencyFiles += project.files(transformationTask.map { it.allTransformedLibraries })
if (sourceSet is DefaultKotlinSourceSet && getCommonizerTarget(sourceSet) is SharedCommonizerTarget) {
if (sourceSet is DefaultKotlinSourceSet && sourceSet.sharedCommonizerTarget.await() is SharedCommonizerTarget) {
compilation.compileDependencyFiles += project.createCInteropMetadataDependencyClasspath(sourceSet)
}
}
@@ -9,9 +9,10 @@ import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.launch
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.utils.filesProvider
import java.io.File
@@ -59,11 +60,10 @@ internal fun Project.cinteropCommonizerDependencies(sourceSet: DefaultKotlinSour
}
}
private fun Project.setupCInteropTransformCompositeMetadataDependenciesForIde(sourceSet: DefaultKotlinSourceSet) {
whenEvaluated {
if (getCommonizerTarget(sourceSet) !is SharedCommonizerTarget) return@whenEvaluated
addIntransitiveMetadataDependencyIfPossible(
sourceSet, createCInteropMetadataDependencyClasspathForIde(sourceSet)
)
}
private fun Project.setupCInteropTransformCompositeMetadataDependenciesForIde(sourceSet: DefaultKotlinSourceSet) = launch {
if (sourceSet.internal.commonizerTarget.await() !is SharedCommonizerTarget) return@launch
addIntransitiveMetadataDependencyIfPossible(
sourceSet, createCInteropMetadataDependencyClasspathForIde(sourceSet)
)
}
@@ -74,14 +74,14 @@ internal fun CInteropCommonizerDependent.Factory.from(
internal fun CInteropCommonizerDependent.Factory.from(compilation: KotlinSharedNativeCompilation): CInteropCommonizerDependent? {
return from(
getCommonizerTarget(compilation) as? SharedCommonizerTarget ?: return null,
compilation.commonizerTarget.getOrThrow() as? SharedCommonizerTarget ?: return null,
compilation.getImplicitlyDependingNativeCompilations()
)
}
internal fun CInteropCommonizerDependent.Factory.from(sourceSet: KotlinSourceSet): CInteropCommonizerDependent? {
return from(
target = getCommonizerTarget(sourceSet) as? SharedCommonizerTarget ?: return null,
target = sourceSet.commonizerTarget.getOrThrow() as? SharedCommonizerTarget ?: return null,
compilations = sourceSet.internal.compilations
.filterIsInstance<KotlinNativeCompilation>().toSet()
)
@@ -89,7 +89,7 @@ internal fun CInteropCommonizerDependent.Factory.from(sourceSet: KotlinSourceSet
internal fun CInteropCommonizerDependent.Factory.fromAssociateCompilations(sourceSet: KotlinSourceSet): CInteropCommonizerDependent? {
return from(
target = getCommonizerTarget(sourceSet) as? SharedCommonizerTarget ?: return null,
target = sourceSet.commonizerTarget.getOrThrow() as? SharedCommonizerTarget ?: return null,
compilations = sourceSet.internal.compilations
.filterIsInstance<KotlinNativeCompilation>()
.flatMap { compilation -> compilation.associateWithClosure }
@@ -126,7 +126,7 @@ internal open class CInteropCommonizerTask
private val groupedCommonizerDependencies: Map<CInteropCommonizerGroup, List<CInteropCommonizerDependencies>> by lazy {
val multiplatformExtension = project.multiplatformExtensionOrNull ?: return@lazy emptyMap()
val sourceSetsByTarget = multiplatformExtension.sourceSets.groupBy { sourceSet -> getCommonizerTarget(sourceSet) }
val sourceSetsByTarget = multiplatformExtension.sourceSets.groupBy { sourceSet -> sourceSet.commonizerTarget.getOrThrow() }
val sourceSetsByGroup = multiplatformExtension.sourceSets.groupBy { sourceSet ->
CInteropCommonizerDependent.from(sourceSet)?.let { findInteropsGroup(it) }
}
@@ -74,7 +74,7 @@ private fun Project.createCInteropMetadataDependencyClasspathFromAssociatedCompi
forIde: Boolean
): FileCollection {
return filesProvider files@{
val commonizerTarget = getSharedCommonizerTarget(sourceSet) ?: return@files emptySet<File>()
val commonizerTarget = sourceSet.sharedCommonizerTarget.getOrThrow() ?: return@files emptySet<File>()
/*
We will find the 'most suitable' / 'closest matching' source set
@@ -83,7 +83,7 @@ private fun Project.createCInteropMetadataDependencyClasspathFromAssociatedCompi
*/
val (associatedSourceSet, _) = sourceSet.getAdditionalVisibleSourceSets()
.filterIsInstance<DefaultKotlinSourceSet>()
.mapNotNull { otherSourceSet -> otherSourceSet to (getSharedCommonizerTarget(otherSourceSet) ?: return@mapNotNull null) }
.mapNotNull { otherSourceSet -> otherSourceSet to (otherSourceSet.sharedCommonizerTarget.getOrThrow() ?: return@mapNotNull null) }
.filter { (_, otherCommonizerTarget) -> otherCommonizerTarget.targets.containsAll(commonizerTarget.targets) }
.minByOrNull { (_, otherCommonizerTarget) -> otherCommonizerTarget.targets.size } ?: return@files emptySet<File>()
@@ -105,7 +105,7 @@ private fun CInteropMetadataDependencyTransformationTask.configureTaskOrder() {
}
private fun CInteropMetadataDependencyTransformationTask.onlyIfSourceSetIsSharedNative() {
val isSharedCommonizerTarget = getCommonizerTarget(sourceSet) is SharedCommonizerTarget
val isSharedCommonizerTarget = sourceSet.internal.commonizerTarget.getOrThrow() is SharedCommonizerTarget
onlyIf { isSharedCommonizerTarget }
}
@@ -1,24 +0,0 @@
/*
* Copyright 2010-2020 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.
*/
package org.jetbrains.kotlin.gradle.targets.native.internal
import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation
internal fun getCommonizerTarget(compilation: KotlinCompilation<*>): CommonizerTarget? {
if (compilation is KotlinNativeCompilation) {
return LeafCommonizerTarget(compilation.konanTarget)
}
if (compilation is KotlinSharedNativeCompilation) {
return getCommonizerTarget(compilation.defaultSourceSet) ?: CommonizerTarget(compilation.konanTargets)
}
return null
}
@@ -1,30 +0,0 @@
/*
* Copyright 2010-2020 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.
*/
package org.jetbrains.kotlin.gradle.targets.native.internal
import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.commonizer.allLeaves
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation
import org.jetbrains.kotlin.gradle.plugin.sources.internal
internal fun getCommonizerTarget(sourceSet: KotlinSourceSet): CommonizerTarget? {
val allCompilationLeafTargets = sourceSet.internal.compilations
.filter { compilation -> compilation !is KotlinMetadataCompilation }
.map { compilation -> getCommonizerTarget(compilation) ?: return null }
.allLeaves()
return when {
allCompilationLeafTargets.isEmpty() -> null
allCompilationLeafTargets.size == 1 -> allCompilationLeafTargets.single()
else -> SharedCommonizerTarget(allCompilationLeafTargets)
}
}
internal fun getSharedCommonizerTarget(sourceSet: KotlinSourceSet): SharedCommonizerTarget? {
return getCommonizerTarget(sourceSet) as? SharedCommonizerTarget
}
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.ide.ideaImportDependsOn
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations
import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.targets.metadata.getMetadataCompilationForSourceSet
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
import org.jetbrains.kotlin.gradle.targets.native.internal.MissingNativeStdlibWarning.showMissingNativeStdlibWarning
@@ -35,25 +36,29 @@ internal fun Project.setupKotlinNativePlatformDependencies() {
checkNotNull(commonizeNativeDistributionTask) { "Missing commonizeNativeDistributionTask" }
}
kotlin.sourceSets.forEach { sourceSet ->
val target = getCommonizerTarget(sourceSet) ?: return@forEach
addDependencies(sourceSet, getNativeDistributionDependencies(target))
addDependencies(
sourceSet, project.filesProvider { setOf(konanDistribution.stdlib) },
/*
kotlin.sourceSets.all { sourceSet ->
launch {
val target = sourceSet.internal.commonizerTarget.await() ?: return@launch
addDependencies(sourceSet, getNativeDistributionDependencies(target))
addDependencies(
sourceSet, project.filesProvider { setOf(konanDistribution.stdlib) },
/*
Shared Native compilations already implicitly add this dependency.
Adding it again will result in a warning
*/
isCompilationDependency = false
)
isCompilationDependency = false
)
}
}
if (isPlatformIntegerCommonizationEnabled) {
kotlin.nativeRootSourceSets.forEach { sourceSet ->
dependencies.add(
sourceSet.implementationConfigurationName,
"$KOTLIN_MODULE_GROUP:$PLATFORM_INTEGERS_SUPPORT_LIBRARY:${getKotlinPluginVersion()}"
)
launch {
if (isPlatformIntegerCommonizationEnabled) {
kotlin.nativeRootSourceSets().forEach { sourceSet ->
dependencies.add(
sourceSet.implementationConfigurationName,
"$KOTLIN_MODULE_GROUP:$PLATFORM_INTEGERS_SUPPORT_LIBRARY:${getKotlinPluginVersion()}"
)
}
}
}
}
@@ -65,16 +70,15 @@ internal fun Project.getNativeDistributionDependencies(target: CommonizerTarget)
}
}
internal val KotlinMultiplatformExtension.nativeRootSourceSets: Collection<KotlinSourceSet>
get() {
val nativeSourceSets = sourceSets.filter { sourceSet -> getCommonizerTarget(sourceSet) != null }
return nativeSourceSets.filter { sourceSet ->
val allVisibleSourceSets = sourceSet.dependsOn + getVisibleSourceSetsFromAssociateCompilations(sourceSet)
allVisibleSourceSets.none { dependency ->
dependency in nativeSourceSets
}
internal suspend fun KotlinMultiplatformExtension.nativeRootSourceSets(): Collection<KotlinSourceSet> {
val nativeSourceSets = sourceSets.filter { sourceSet -> sourceSet.internal.commonizerTarget.await() != null }
return nativeSourceSets.filter { sourceSet ->
val allVisibleSourceSets = sourceSet.dependsOn + getVisibleSourceSetsFromAssociateCompilations(sourceSet)
allVisibleSourceSets.none { dependency ->
dependency in nativeSourceSets
}
}
}
private fun Project.getOriginalPlatformLibrariesFor(target: LeafCommonizerTarget): FileCollection = project.filesProvider {
konanDistribution.platformLibsDir.resolve(target.konanTarget.name).listLibraryFiles().toSet()
@@ -116,7 +116,7 @@ private fun Project.collectAllSharedCommonizerTargetsFromBuild(): Set<SharedComm
private fun Project.collectAllSharedCommonizerTargetsFromProject(): Set<SharedCommonizerTarget> {
return (project.multiplatformExtensionOrNull ?: return emptySet()).sourceSets
.mapNotNull { sourceSet -> getCommonizerTarget(sourceSet) }
.mapNotNull { sourceSet -> sourceSet.commonizerTarget.getOrThrow() }
.filterIsInstance<SharedCommonizerTarget>()
.toSet()
}
@@ -0,0 +1,65 @@
/*
* Copyright 2010-2020 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.
*/
package org.jetbrains.kotlin.gradle.targets.native.internal
import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.commonizer.allLeaves
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.await
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation
import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.utils.Future
import org.jetbrains.kotlin.gradle.utils.lazyFuture
import org.jetbrains.kotlin.tooling.core.UnsafeApi
internal val KotlinSourceSet.commonizerTarget: Future<CommonizerTarget?> by lazyFuture {
await(KotlinPluginLifecycle.Stage.AfterFinaliseRefinesEdges)
@OptIn(UnsafeApi::class)
inferCommonizerTarget(this)
}
internal val KotlinSourceSet.sharedCommonizerTarget: Future<SharedCommonizerTarget?> by lazyFuture {
commonizerTarget.await() as? SharedCommonizerTarget
}
internal val KotlinCompilation<*>.commonizerTarget: Future<CommonizerTarget?> by lazyFuture {
await(KotlinPluginLifecycle.Stage.AfterFinaliseRefinesEdges)
@OptIn(UnsafeApi::class)
inferCommonizerTarget(this)
}
@UnsafeApi("Use sourceSet.commonizerTarget instead")
internal fun inferCommonizerTarget(sourceSet: KotlinSourceSet): CommonizerTarget? {
val allCompilationLeafTargets = sourceSet.internal.compilations
.filter { compilation -> compilation !is KotlinMetadataCompilation }
.map { compilation -> inferCommonizerTarget(compilation) ?: return null }
.allLeaves()
return when {
allCompilationLeafTargets.isEmpty() -> null
allCompilationLeafTargets.size == 1 -> allCompilationLeafTargets.single()
else -> SharedCommonizerTarget(allCompilationLeafTargets)
}
}
@UnsafeApi("Use compilation.commonizerTarget instead")
internal fun inferCommonizerTarget(compilation: KotlinCompilation<*>): CommonizerTarget? {
if (compilation is KotlinNativeCompilation) {
return LeafCommonizerTarget(compilation.konanTarget)
}
if (compilation is KotlinSharedNativeCompilation) {
return inferCommonizerTarget(compilation.defaultSourceSet) ?: CommonizerTarget(compilation.konanTargets)
}
return null
}
@@ -27,6 +27,7 @@ class IdeNativePlatformDependencyResolverTest {
val kotlin = project.multiplatformExtension
kotlin.targetHierarchy.default()
kotlin.linuxX64()
project.evaluate()
val commonMain = kotlin.sourceSets.getByName("commonMain")
val commonTest = kotlin.sourceSets.getByName("commonTest")
@@ -51,6 +52,7 @@ class IdeNativePlatformDependencyResolverTest {
val kotlin = project.multiplatformExtension
kotlin.targetHierarchy.default()
kotlin.macosArm64()
project.evaluate()
val commonMain = kotlin.sourceSets.getByName("commonMain")
val commonTest = kotlin.sourceSets.getByName("commonTest")
@@ -74,6 +76,7 @@ class IdeNativePlatformDependencyResolverTest {
val kotlin = project.multiplatformExtension
kotlin.jvm()
kotlin.linuxX64()
project.evaluate()
val commonMain = kotlin.sourceSets.getByName("commonMain")
val commonTest = kotlin.sourceSets.getByName("commonTest")
@@ -67,13 +67,18 @@ class CInteropMetadataDependencyTransformationTaskTest : MultiplatformExtensionT
linuxX64Test.dependsOn(nativeTest)
linuxArm64Test.dependsOn(nativeTest)
project.evaluate()
val nativeTestTransformationTask = project.locateOrRegisterCInteropMetadataDependencyTransformationTask(nativeTest)
assertNotNull(nativeTestTransformationTask, "Expected transformation task registered for 'nativeTest'")
assertEquals(
listOf(commonMain, commonTest, nativeMain).map { sourceSet ->
project.locateOrRegisterCInteropMetadataDependencyTransformationTask(sourceSet as DefaultKotlinSourceSet)?.get()
?: fail("Expected transformation task registered for '${sourceSet.name}'")
listOf(commonMain, commonTest, nativeMain).flatMap { sourceSet ->
listOf(
project.locateOrRegisterCInteropMetadataDependencyTransformationTask(sourceSet as DefaultKotlinSourceSet)?.get()
?: fail("Expected transformation task registered for '${sourceSet.name}'"),
project.locateOrRegisterCInteropMetadataDependencyTransformationTaskForIde(sourceSet)?.get()
?: fail("Expected transformation task registered for '${sourceSet.name}'(forIde)")
)
}.toSet(),
nativeTestTransformationTask.get().mustRunAfter.getDependencies(null).toSet()
)
@@ -96,6 +101,8 @@ class CInteropMetadataDependencyTransformationTaskTest : MultiplatformExtensionT
linuxArm64Main.dependsOn(linuxMain)
linuxX64Main.dependsOn(linuxMain)
project.evaluate()
listOf(
"commonMain", "jvmMain", "linuxArm64Main", "linuxX64Main"
).map { sourceSetName -> kotlin.sourceSets.getByName(sourceSetName) }.forEach { sourceSet ->
@@ -128,7 +135,7 @@ class CInteropMetadataDependencyTransformationTaskTest : MultiplatformExtensionT
linuxX64()
linuxArm64()
}
}
}.also { it.evaluate() }
fun Project.transformationTaskOutputs(): Set<File> {
val kotlin = multiplatformExtension
@@ -8,23 +8,23 @@
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
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
import org.jetbrains.kotlin.gradle.targets.native.internal.inferCommonizerTarget
import org.jetbrains.kotlin.gradle.util.addBuildEventsListenerRegistryMock
import org.jetbrains.kotlin.gradle.util.buildProject
import org.jetbrains.kotlin.konan.target.KonanTarget.*
import org.jetbrains.kotlin.tooling.core.UnsafeApi
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull
@OptIn(UnsafeApi::class)
class SourceSetCommonizerTargetTest {
private lateinit var project: ProjectInternal
@@ -37,7 +37,6 @@ class SourceSetCommonizerTargetTest {
project.extensions.getByType(ExtraPropertiesExtension::class.java).set("kotlin.mpp.enableCompatibilityMetadataVariant", "false")
project.plugins.apply("kotlin-multiplatform")
kotlin = project.extensions.getByName("kotlin") as KotlinMultiplatformExtension
}
@Test
@@ -52,14 +51,14 @@ class SourceSetCommonizerTargetTest {
val linuxTest = kotlin.sourceSets.getByName("linuxTest")
val macosTest = kotlin.sourceSets.getByName("macosTest")
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), inferCommonizerTarget(linuxMain))
assertEquals(CommonizerTarget(LINUX_X64), inferCommonizerTarget(linuxTest))
assertEquals(CommonizerTarget(MACOS_X64), inferCommonizerTarget(macosMain))
assertEquals(CommonizerTarget(MACOS_X64), inferCommonizerTarget(macosTest))
project.evaluate()
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(commonMain))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(commonTest))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), inferCommonizerTarget(commonMain))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), inferCommonizerTarget(commonTest))
}
@Test
@@ -80,16 +79,16 @@ class SourceSetCommonizerTargetTest {
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), inferCommonizerTarget(linuxMain))
assertEquals(CommonizerTarget(LINUX_X64), inferCommonizerTarget(linuxTest))
assertEquals(CommonizerTarget(MACOS_X64), inferCommonizerTarget(macosMain))
assertEquals(CommonizerTarget(MACOS_X64), inferCommonizerTarget(macosTest))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(nativeMain))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), inferCommonizerTarget(nativeMain))
project.evaluate()
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(commonMain))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(commonTest))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), inferCommonizerTarget(commonMain))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), inferCommonizerTarget(commonTest))
}
@Test
@@ -109,16 +108,16 @@ class SourceSetCommonizerTargetTest {
linuxAMain.dependsOn(nativeMain)
linuxBMain.dependsOn(nativeMain)
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(linuxAMain))
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(linuxATest))
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(linuxBMain))
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(linuxBTest))
assertEquals(LeafCommonizerTarget(LINUX_X64), inferCommonizerTarget(linuxAMain))
assertEquals(LeafCommonizerTarget(LINUX_X64), inferCommonizerTarget(linuxATest))
assertEquals(LeafCommonizerTarget(LINUX_X64), inferCommonizerTarget(linuxBMain))
assertEquals(LeafCommonizerTarget(LINUX_X64), inferCommonizerTarget(linuxBTest))
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(nativeMain))
assertEquals(LeafCommonizerTarget(LINUX_X64), inferCommonizerTarget(nativeMain))
project.evaluate()
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(commonMain))
assertEquals(LeafCommonizerTarget(LINUX_X64), getCommonizerTarget(commonTest))
assertEquals(LeafCommonizerTarget(LINUX_X64), inferCommonizerTarget(commonMain))
assertEquals(LeafCommonizerTarget(LINUX_X64), inferCommonizerTarget(commonTest))
}
@Test
@@ -148,31 +147,31 @@ class SourceSetCommonizerTargetTest {
iosX64Main.dependsOn(iosMain)
iosArm64Main.dependsOn(iosMain)
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(IOS_X64), getCommonizerTarget(iosX64Test))
assertEquals(CommonizerTarget(IOS_X64), getCommonizerTarget(iosX64Test))
assertEquals(CommonizerTarget(IOS_ARM64), getCommonizerTarget(iosArm64Main))
assertEquals(CommonizerTarget(IOS_ARM64), getCommonizerTarget(iosArm64Test))
assertEquals(CommonizerTarget(IOS_X64, IOS_ARM64), getCommonizerTarget(iosMain))
assertEquals(CommonizerTarget(LINUX_X64), inferCommonizerTarget(linuxMain))
assertEquals(CommonizerTarget(LINUX_X64), inferCommonizerTarget(linuxTest))
assertEquals(CommonizerTarget(MACOS_X64), inferCommonizerTarget(macosMain))
assertEquals(CommonizerTarget(MACOS_X64), inferCommonizerTarget(macosTest))
assertEquals(CommonizerTarget(IOS_X64), inferCommonizerTarget(iosX64Test))
assertEquals(CommonizerTarget(IOS_X64), inferCommonizerTarget(iosX64Test))
assertEquals(CommonizerTarget(IOS_ARM64), inferCommonizerTarget(iosArm64Main))
assertEquals(CommonizerTarget(IOS_ARM64), inferCommonizerTarget(iosArm64Test))
assertEquals(CommonizerTarget(IOS_X64, IOS_ARM64), inferCommonizerTarget(iosMain))
assertEquals(
CommonizerTarget(IOS_X64, IOS_ARM64, MACOS_X64, LINUX_X64),
getCommonizerTarget(nativeMain)
inferCommonizerTarget(nativeMain)
)
project.evaluate()
assertEquals(
CommonizerTarget(IOS_X64, IOS_ARM64, MACOS_X64, LINUX_X64),
getCommonizerTarget(commonMain)
inferCommonizerTarget(commonMain)
)
assertEquals(
CommonizerTarget(IOS_ARM64, IOS_X64, LINUX_X64, MACOS_X64),
getCommonizerTarget(commonTest)
inferCommonizerTarget(commonTest)
)
}
@@ -196,18 +195,18 @@ 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))
assertNull(getCommonizerTarget(jvmMain), "Expected jvmMain to have no commonizer target")
assertNull(getCommonizerTarget(jvmTest), "Expected jvmTest to have no commonizer target")
assertEquals(CommonizerTarget(LINUX_X64), inferCommonizerTarget(linuxMain))
assertEquals(CommonizerTarget(LINUX_X64), inferCommonizerTarget(linuxTest))
assertEquals(CommonizerTarget(MACOS_X64), inferCommonizerTarget(macosMain))
assertEquals(CommonizerTarget(MACOS_X64), inferCommonizerTarget(macosTest))
assertNull(inferCommonizerTarget(jvmMain), "Expected jvmMain to have no commonizer target")
assertNull(inferCommonizerTarget(jvmTest), "Expected jvmTest to have no commonizer target")
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), getCommonizerTarget(nativeMain))
assertEquals(CommonizerTarget(LINUX_X64, MACOS_X64), inferCommonizerTarget(nativeMain))
project.evaluate()
assertNull(getCommonizerTarget(commonMain), "Expected commonMain to have no commonizer target")
assertNull(getCommonizerTarget(commonTest), "Expected commonTest to have no commonizer target")
assertNull(inferCommonizerTarget(commonMain), "Expected commonMain to have no commonizer target")
assertNull(inferCommonizerTarget(commonTest), "Expected commonTest to have no commonizer target")
}
@Test
@@ -223,7 +222,7 @@ class SourceSetCommonizerTargetTest {
assertEquals(
SharedCommonizerTarget(setOf(linux1.konanTarget, linux2.konanTarget)),
getCommonizerTarget(nativeMain)
inferCommonizerTarget(nativeMain)
)
}
@@ -240,7 +239,7 @@ class SourceSetCommonizerTargetTest {
linux2Main.dependsOn(nativeMain)
orphan.dependsOn(nativeMain)
assertEquals(CommonizerTarget(linux1.konanTarget, linux2.konanTarget), getCommonizerTarget(nativeMain))
assertEquals(CommonizerTarget(linux1.konanTarget, linux2.konanTarget), inferCommonizerTarget(nativeMain))
}
@Test
@@ -252,6 +251,6 @@ class SourceSetCommonizerTargetTest {
orphan1.dependsOn(nativeMain)
orphan2.dependsOn(nativeMain)
assertEquals(null, getCommonizerTarget(nativeMain))
assertEquals(null, inferCommonizerTarget(nativeMain))
}
}