[Gradle] Enable hierarchical commonization by default

This commit is contained in:
sebastian.sellmair
2021-04-06 15:52:28 +02:00
parent 933c52d470
commit d9eb130f82
7 changed files with 36 additions and 40 deletions
@@ -1,2 +1,3 @@
kotlin.mpp.enableGranularSourceSetsMetadata=true
kotlin.native.enableDependencyPropagation=false
kotlin.mpp.enableHierarchicalCommonization=false
@@ -12,6 +12,7 @@ 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.SharedCommonizerTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation
@@ -114,41 +115,25 @@ class CInteropCommonizerTaskTest {
project.evaluate()
/*
//https://youtrack.jetbrains.com/issue/KT-39324
assertEquals(
CInteropCommonizationParameters(
SharedCommonizerTarget(CommonizerTarget(IOS_X64, IOS_ARM64), CommonizerTarget(MACOS_X64), CommonizerTarget(LINUX_X64)),
setOf(linuxInterop, macosInterop, iosX64Interop, iosArm64Interop)
), task.getCommonizationParameters(sharedNativeCompilation(nativeMain))
)
*/
assertNull(
task.getCommonizationParameters(sharedNativeCompilation(nativeMain))
)
/*
//https://youtrack.jetbrains.com/issue/KT-39324
assertEquals(
CInteropCommonizationParameters(
SharedCommonizerTarget(CommonizerTarget(IOS_X64, IOS_ARM64), CommonizerTarget(MACOS_X64), CommonizerTarget(LINUX_X64)),
setOf(linuxInterop, macosInterop, iosX64Interop, iosArm64Interop)
), task.getCommonizationParameters(sharedNativeCompilation(iosMain))
)
*/
assertEquals(
CInteropCommonizationParameters(CommonizerTarget(IOS_X64, IOS_ARM64), setOf(iosX64Interop, iosArm64Interop)),
task.getCommonizationParameters(sharedNativeCompilation(iosMain))
)
/*
//https://youtrack.jetbrains.com/issue/KT-39324
assertTrue(
task.getCommonizationParameters(sharedNativeCompilation(iosMain))!! in
task.getCommonizationParameters(sharedNativeCompilation(nativeMain))!!,
"Expected CInteropCommonizerTarget of iosMain to be fully contained in nativeMain"
)
*/
}
private fun sharedNativeCompilation(sourceSet: KotlinSourceSet): KotlinSharedNativeCompilation {
@@ -228,7 +228,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
* Enables experimental commonization of 'higher level' shared native source sets
*/
val enableHierarchicalCommonization: Boolean
get() = booleanProperty("kotlin.mpp.enableHierarchicalCommonization") ?: false
get() = booleanProperty("kotlin.mpp.enableHierarchicalCommonization") ?: true
/**
* Dependencies caching strategy for all targets that support caches.
@@ -48,7 +48,6 @@ internal open class CInteropCommonizerTask : AbstractCInteropCommonizerTask() {
internal var cinterops = setOf<CInteropGist>()
private set
@OutputDirectories
fun getAllOutputDirectories(): Set<File> {
return getCommonizationParameters().map { outputDirectory(it) }.toSet()
@@ -101,7 +100,7 @@ internal open class CInteropCommonizerTask : AbstractCInteropCommonizerTask() {
}
private fun nativeDistributionDependencies(parameters: CInteropCommonizationParameters): Set<CommonizerDependency> {
val task = project.commonizeNativeDistributionHierarchicalTask?.get() ?: return emptySet()
val task = project.commonizeNativeDistributionHierarchicallyTask?.get() ?: return emptySet()
val rootTarget = task.rootCommonizerTargets
.firstOrNull { rootTarget -> parameters.commonizerTarget in rootTarget } ?: return emptySet()
@@ -49,7 +49,8 @@ internal val Project.commonizeCInteropTask: TaskProvider<CInteropCommonizerTask>
"commonizeCInterop",
invokeWhenRegistered = {
commonizeTask.dependsOn(this)
commonizeNativeDistributionHierarchicalTask?.let(this::dependsOn) ?: dependsOn(commonizeNativeDistributionTask)
commonizeNativeDistributionHierarchicallyTask?.let(this::dependsOn)
commonizeNativeDistributionTask?.let(this::dependsOn)
},
configureTask = {
group = "interop"
@@ -76,21 +77,24 @@ internal val Project.copyCommonizeCInteropForIdeTask: TaskProvider<CopyCommonize
return null
}
internal val Project.commonizeNativeDistributionTask: TaskProvider<NativeDistributionCommonizerTask>
get() = locateOrRegisterTask(
"commonizeNativeDistribution",
invokeWhenRegistered = { commonizeTask.dependsOn(this) },
configureTask = {
group = "interop"
description = "Invokes the commonizer on the platform libraries provided by the Kotlin/Native distribution"
}
)
internal val Project.commonizeNativeDistributionTask: TaskProvider<NativeDistributionCommonizerTask>?
get() {
if (isHierarchicalCommonizationEnabled) return null
return locateOrRegisterTask(
"commonizeNativeDistribution",
invokeWhenRegistered = { commonizeTask.dependsOn(this) },
configureTask = {
group = "interop"
description = "Invokes the commonizer on the platform libraries provided by the Kotlin/Native distribution"
}
)
}
internal val Project.commonizeNativeDistributionHierarchicalTask: TaskProvider<HierarchicalNativeDistributionCommonizerTask>?
internal val Project.commonizeNativeDistributionHierarchicallyTask: TaskProvider<HierarchicalNativeDistributionCommonizerTask>?
get() {
if (!isHierarchicalCommonizationEnabled) return null
return locateOrRegisterTask(
"commonizeNativeDistributionHierarchically",
"commonizeNativeDistribution",
invokeWhenRegistered = { commonizeTask.dependsOn(this) },
configureTask = {
group = "interop"
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.getMetadataCompilationForSou
import org.jetbrains.kotlin.gradle.utils.filesProvider
internal fun Project.setUpHierarchicalKotlinNativePlatformDependencies() {
val task = commonizeNativeDistributionHierarchicalTask?.get() ?: return
val task = commonizeNativeDistributionHierarchicallyTask?.get() ?: return
val kotlin = multiplatformExtensionOrNull ?: return
kotlin.sourceSets.forEach { sourceSet ->
val target = getCommonizerTarget(sourceSet) ?: return@forEach
@@ -31,15 +31,22 @@ private fun HierarchicalNativeDistributionCommonizerTask.dependenciesFor(target:
val targetOutputDirectory = HierarchicalCommonizerOutputLayout.getTargetDirectory(getRootOutputDirectory(rootTarget), target)
val targetDependencies = project.filesProvider { targetOutputDirectory.listFiles().orEmpty().toList() }.builtBy(this)
if (target is LeafCommonizerTarget) {
val expectTarget = rootTarget.withAllAncestors()
.firstOrNull { (it as? SharedCommonizerTarget)?.targets?.contains(target) == true }
?: return targetDependencies
/*
LeafCommonizerTargets will still analyze against 'new' 'commonized' platform dependencies.
This means, that some parts of the API might get lifted to the direct parent dependency.
*/
val necessaryParentTargetDependencies: FileCollection = rootTarget.takeIf { target is LeafCommonizerTarget }
?.findParentOf(target)
?.let { parentTarget -> dependenciesFor(parentTarget) }
?: project.files()
return targetDependencies + dependenciesFor(expectTarget)
}
return targetDependencies + necessaryParentTargetDependencies
}
return targetDependencies
private fun CommonizerTarget.findParentOf(target: CommonizerTarget): CommonizerTarget? {
return withAllAncestors()
.filterIsInstance<SharedCommonizerTarget>()
.firstOrNull { target in it.targets }
}
private fun Project.addDependencies(sourceSet: KotlinSourceSet, libraries: FileCollection) {
@@ -101,7 +101,7 @@ private class NativePlatformDependencyResolver(val project: Project, val kotlinV
check(!alreadyResolved)
alreadyResolved = true
project.commonizeNativeDistributionTask.configure { commonizerTask ->
project.commonizeNativeDistributionTask?.configure { commonizerTask ->
commonizerTask.targetGroups = dependencies.keys.filterIsInstance<CommonizedCommon>().map { it.targets }.toSet()
}