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
internal fun Project.setUpHierarchicalKotlinNativePlatformDependencies() {
val task = commonizeNativeDistributionHierarchicallyTask?.get() ?: return
val kotlin = multiplatformExtensionOrNull ?: return
kotlin.sourceSets.forEach { sourceSet ->
val target = getCommonizerTarget(sourceSet) ?: return@forEach
val commonizedDependencies = task.dependenciesFor(target)
val targetDependencies = getDependenciesFor(target)
val stdlib = project.filesProvider { listOf(konanDistribution.stdlib) }
addDependencies(sourceSet, commonizedDependencies)
addDependencies(sourceSet, targetDependencies)
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 targetOutputDirectory = HierarchicalCommonizerOutputLayout.getTargetDirectory(getRootOutputDirectory(rootTarget), target)
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 }
?.findParentOf(target)
?.let { parentTarget -> dependenciesFor(parentTarget) }
?.let { parentTarget -> getCommonizedDependenciesFor(parentTarget) }
?: project.files()
return targetDependencies + necessaryParentTargetDependencies