diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/AbstractCInteropCommonizerTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/AbstractCInteropCommonizerTask.kt index ce84def1a0b..470be6a7395 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/AbstractCInteropCommonizerTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/AbstractCInteropCommonizerTask.kt @@ -12,6 +12,7 @@ import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.commonizer.HierarchicalCommonizerOutputLayout import org.jetbrains.kotlin.commonizer.prettyName import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation +import org.jetbrains.kotlin.gradle.utils.filesProvider import java.io.File internal abstract class AbstractCInteropCommonizerTask : DefaultTask() { @@ -28,15 +29,14 @@ internal abstract class AbstractCInteropCommonizerTask : DefaultTask() { internal fun getLibraries(compilation: KotlinSharedNativeCompilation): FileCollection { val compilationCommonizerTarget = project.getCommonizerTarget(compilation) ?: return project.files() - val fileProvider = project.provider> { - val parameters = getCommonizationParameters(compilation) ?: return@provider emptySet() - HierarchicalCommonizerOutputLayout.getTargetDirectory(outputDirectory(parameters), compilationCommonizerTarget) + val fileProvider = project.filesProvider { + val parameters = getCommonizationParameters(compilation) ?: return@filesProvider emptySet() + HierarchicalCommonizerOutputLayout + .getTargetDirectory(outputDirectory(parameters), compilationCommonizerTarget) .listFiles().orEmpty().toSet() } - return project.files(fileProvider) { fileCollection -> - fileCollection.builtBy(this) - } + return fileProvider.builtBy(this) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalKotlinNativePlatformDependencies.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalKotlinNativePlatformDependencies.kt index 79cb06172e3..9820570240b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalKotlinNativePlatformDependencies.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalKotlinNativePlatformDependencies.kt @@ -7,10 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.native.internal import org.gradle.api.Project import org.gradle.api.file.FileCollection -import org.jetbrains.kotlin.commonizer.HierarchicalCommonizerOutputLayout -import org.jetbrains.kotlin.commonizer.KonanDistribution -import org.jetbrains.kotlin.commonizer.isAncestorOf -import org.jetbrains.kotlin.commonizer.stdlib +import org.jetbrains.kotlin.commonizer.* import org.jetbrains.kotlin.compilerRunner.konanHome import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet @@ -22,21 +19,29 @@ internal fun Project.setUpHierarchicalKotlinNativePlatformDependencies() { val kotlin = multiplatformExtensionOrNull ?: return kotlin.sourceSets.forEach { sourceSet -> val target = getCommonizerTarget(sourceSet) ?: return@forEach - - val rootTarget = task.rootCommonizerTargets - .firstOrNull { rootTarget -> rootTarget == target || rootTarget.isAncestorOf(target) } - ?: return@forEach - - val rootOutputDirectory = task.getRootOutputDirectory(rootTarget) - val targetOutputDirectory = HierarchicalCommonizerOutputLayout.getTargetDirectory(rootOutputDirectory, target) - - val dependencies = project.filesProvider { targetOutputDirectory.listFiles().orEmpty().toList() }.builtBy(task) + val commonizedDependencies = task.dependenciesFor(target) val stdlib = project.filesProvider { listOf(konanDistribution.stdlib) } - addDependencies(sourceSet, dependencies) + addDependencies(sourceSet, commonizedDependencies) addDependencies(sourceSet, stdlib) } } +private fun HierarchicalNativeDistributionCommonizerTask.dependenciesFor(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) + + if (target is LeafCommonizerTarget) { + val expectTarget = rootTarget.withAllAncestors() + .firstOrNull { (it as? SharedCommonizerTarget)?.targets?.contains(target) == true } + ?: return targetDependencies + + return targetDependencies + dependenciesFor(expectTarget) + } + + return targetDependencies +} + private fun Project.addDependencies(sourceSet: KotlinSourceSet, libraries: FileCollection) { getMetadataCompilationForSourceSet(sourceSet)?.let { compilation -> compilation.compileDependencyFiles += libraries