[Commonizer] CInteropCommonizerTask: Provide custom/commonized native distribution dependencies

^KT-45497 Fixed
This commit is contained in:
sebastian.sellmair
2021-03-23 09:32:43 +01:00
committed by Space
parent e44877f562
commit 7f9fe6b332
3 changed files with 28 additions and 6 deletions
@@ -10,11 +10,12 @@ import org.gradle.api.file.FileCollection
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.workers.WorkParameters
import org.jetbrains.kotlin.compilerRunner.GradleCliCommonizer
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.commonizer.NativeDistributionCommonizerOutputLayout
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.commonizer.level
import org.jetbrains.kotlin.compilerRunner.GradleCliCommonizer
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.CInteropSettings
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
@@ -26,6 +27,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.kotlinSourceSetsIncludingDefault
import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerTask.CInteropGist
import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
import org.jetbrains.kotlin.gradle.utils.transitiveClosure
import org.jetbrains.kotlin.konan.target.KonanTarget
import java.io.File
@@ -49,6 +51,23 @@ internal open class CInteropCommonizerTask : AbstractCInteropCommonizerTask() {
internal var cinterops = setOf<CInteropGist>()
private set
/**
* All library files produced by the [Project.commonizeNativeDistributionTask] that are relevant for commonization
*/
@get:Classpath
internal val nativeDistributionLibraries: Set<File>
get() {
val commonizeNativeDistribution = project.commonizeNativeDistributionTask.get()
return getCommonizationParameters().flatMapTo(mutableSetOf()) { parameters ->
parameters.commonizerTarget.withAllTransitiveTargets().flatMap { target ->
commonizeNativeDistribution.commonizerTargetOutputDirectories.flatMap { outputDirectory ->
NativeDistributionCommonizerOutputLayout.getTargetDirectory(outputDirectory, target)
.listFiles().orEmpty().toList()
}
}
}
}
@OutputDirectories
fun getAllOutputDirectories(): Set<File> {
return getCommonizationParameters().map { outputDirectory(it) }.toSet()
@@ -89,11 +108,12 @@ internal open class CInteropCommonizerTask : AbstractCInteropCommonizerTask() {
val cinteropsForTarget = cinterops.filter { cinterop -> cinterop.identifier in parameters.interops }
outputDirectory(parameters).deleteRecursively()
if (cinteropsForTarget.isEmpty()) return
GradleCliCommonizer(project).commonizeLibraries(
konanHome = project.file(project.konanHome),
outputCommonizerTarget = parameters.commonizerTarget,
inputLibraries = cinteropsForTarget.map { it.libraryFile.get() }.toSet(),
dependencyLibraries = cinteropsForTarget.flatMap { it.dependencies.files }.toSet(),
dependencyLibraries = cinteropsForTarget.flatMap { it.dependencies.files }.toSet() + nativeDistributionLibraries,
outputDirectory = outputDirectory(parameters)
)
}
@@ -187,13 +207,16 @@ private fun removeRedundantParameters(parameters: Set<CInteropCommonizationParam
}
}
private operator fun CommonizerTarget.contains(other: CommonizerTarget): Boolean {
if (this == other) return true
if (this !is SharedCommonizerTarget) return false
return targets.any { child -> other in child }
}
private fun SharedCommonizerTarget.withAllTransitiveTargets(): Set<CommonizerTarget> {
return setOf(this) + this.transitiveClosure<CommonizerTarget> { if (this is SharedCommonizerTarget) this.targets else emptySet() }
}
private fun Project.getDependingNativeCompilations(compilation: KotlinSharedNativeCompilation): Set<KotlinNativeCompilation> {
/**
* Some implementations of [KotlinCompilation] do not contain the default source set in
@@ -46,7 +46,7 @@ internal val Project.commonizeCInteropTask: TaskProvider<CInteropCommonizerTask>
if (isCInteropCommonizationEnabled) {
return locateOrRegisterTask(
"commonizeCInterop",
invokeWhenRegistered = { commonizeTask.dependsOn(this) },
invokeWhenRegistered = { commonizeTask.dependsOn(this); dependsOn(commonizeNativeDistributionTask) },
configureTask = {
group = "interop"
description = "Invokes the commonizer on c-interop bindings of the project"
@@ -71,7 +71,6 @@ internal class NativeKlibCommonize(options: Collection<Option<*>>) : Task(option
commonTarget = outputCommonizerTarget,
repository = repository,
dependencies = StdlibRepository(distribution, libraryLoader) +
KonanDistributionRepository(distribution, commonizerTargets.toSet(), libraryLoader) +
FilesRepository(dependencyLibraries.toSet(), libraryLoader),
resultsConsumer = resultsConsumer,
statsCollector = statsCollector,