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