[Gradle] Enable hierarchical commonization by default
This commit is contained in:
Vendored
+1
@@ -1,2 +1,3 @@
|
|||||||
kotlin.mpp.enableGranularSourceSetsMetadata=true
|
kotlin.mpp.enableGranularSourceSetsMetadata=true
|
||||||
kotlin.native.enableDependencyPropagation=false
|
kotlin.native.enableDependencyPropagation=false
|
||||||
|
kotlin.mpp.enableHierarchicalCommonization=false
|
||||||
|
|||||||
+1
-16
@@ -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 {
|
||||||
|
|||||||
+1
-1
@@ -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.
|
||||||
|
|||||||
+1
-2
@@ -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()
|
||||||
|
|||||||
+16
-12
@@ -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
-8
@@ -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) {
|
||||||
|
|||||||
+1
-1
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user