HierarchicalKotlinNativePlatformDependencies: Provide platform dependencies to source sets not participating in any commonization

^KT-46142 Verification Pending
This commit is contained in:
sebastian.sellmair
2021-04-16 16:05:58 +02:00
committed by Space
parent b5ef6c9316
commit 9336e4b09b
@@ -16,18 +16,30 @@ 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 = 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
val commonizedDependencies = task.dependenciesFor(target) val targetDependencies = getDependenciesFor(target)
val stdlib = project.filesProvider { listOf(konanDistribution.stdlib) } val stdlib = project.filesProvider { listOf(konanDistribution.stdlib) }
addDependencies(sourceSet, commonizedDependencies) addDependencies(sourceSet, targetDependencies)
addDependencies(sourceSet, stdlib) addDependencies(sourceSet, stdlib)
} }
} }
private fun HierarchicalNativeDistributionCommonizerTask.dependenciesFor(target: CommonizerTarget): FileCollection { private fun Project.getDependenciesFor(target: CommonizerTarget): FileCollection {
val commonizerTask = commonizeNativeDistributionHierarchicallyTask?.get() ?: return project.files()
/* Target is participating in any commonization and will therefore receive dependencies provided by the commonizer */
if (commonizerTask.rootCommonizerTargets.any { rootTarget -> rootTarget.isEqualOrAncestorOf(target) }) {
return commonizerTask.getCommonizedDependenciesFor(target)
}
/* Target does not participate in any commonization. Try finding relevant platform libraries */
val konanTarget = target.konanTargets.singleOrNull() ?: return project.files()
return project.filesProvider { konanDistribution.platformLibsDir.resolve(konanTarget.name).listFiles().orEmpty().toSet() }
}
private fun HierarchicalNativeDistributionCommonizerTask.getCommonizedDependenciesFor(target: CommonizerTarget): FileCollection {
val rootTarget = rootCommonizerTargets.firstOrNull { rootTarget -> rootTarget.isEqualOrAncestorOf(target) } ?: return project.files() val rootTarget = rootCommonizerTargets.firstOrNull { rootTarget -> rootTarget.isEqualOrAncestorOf(target) } ?: return project.files()
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)
@@ -38,7 +50,7 @@ private fun HierarchicalNativeDistributionCommonizerTask.dependenciesFor(target:
*/ */
val necessaryParentTargetDependencies: FileCollection = rootTarget.takeIf { target is LeafCommonizerTarget } val necessaryParentTargetDependencies: FileCollection = rootTarget.takeIf { target is LeafCommonizerTarget }
?.findParentOf(target) ?.findParentOf(target)
?.let { parentTarget -> dependenciesFor(parentTarget) } ?.let { parentTarget -> getCommonizedDependenciesFor(parentTarget) }
?: project.files() ?: project.files()
return targetDependencies + necessaryParentTargetDependencies return targetDependencies + necessaryParentTargetDependencies