[Commonizer] CInteropCommonizerTask: Provide custom/commonized native distribution dependencies
^KT-45497 Fixed
This commit is contained in:
committed by
Space
parent
e44877f562
commit
7f9fe6b332
+27
-4
@@ -10,11 +10,12 @@ import org.gradle.api.file.FileCollection
|
|||||||
import org.gradle.api.provider.Provider
|
import org.gradle.api.provider.Provider
|
||||||
import org.gradle.api.tasks.*
|
import org.gradle.api.tasks.*
|
||||||
import org.gradle.workers.WorkParameters
|
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.CommonizerTarget
|
||||||
|
import org.jetbrains.kotlin.commonizer.NativeDistributionCommonizerOutputLayout
|
||||||
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
|
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
|
||||||
import org.jetbrains.kotlin.commonizer.level
|
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.dsl.multiplatformExtensionOrNull
|
||||||
import org.jetbrains.kotlin.gradle.plugin.CInteropSettings
|
import org.jetbrains.kotlin.gradle.plugin.CInteropSettings
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
|
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.plugin.sources.resolveAllDependsOnSourceSets
|
||||||
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerTask.CInteropGist
|
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerTask.CInteropGist
|
||||||
import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
|
import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.transitiveClosure
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -49,6 +51,23 @@ internal open class CInteropCommonizerTask : AbstractCInteropCommonizerTask() {
|
|||||||
internal var cinterops = setOf<CInteropGist>()
|
internal var cinterops = setOf<CInteropGist>()
|
||||||
private set
|
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
|
@OutputDirectories
|
||||||
fun getAllOutputDirectories(): Set<File> {
|
fun getAllOutputDirectories(): Set<File> {
|
||||||
return getCommonizationParameters().map { outputDirectory(it) }.toSet()
|
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 }
|
val cinteropsForTarget = cinterops.filter { cinterop -> cinterop.identifier in parameters.interops }
|
||||||
outputDirectory(parameters).deleteRecursively()
|
outputDirectory(parameters).deleteRecursively()
|
||||||
if (cinteropsForTarget.isEmpty()) return
|
if (cinteropsForTarget.isEmpty()) return
|
||||||
|
|
||||||
GradleCliCommonizer(project).commonizeLibraries(
|
GradleCliCommonizer(project).commonizeLibraries(
|
||||||
konanHome = project.file(project.konanHome),
|
konanHome = project.file(project.konanHome),
|
||||||
outputCommonizerTarget = parameters.commonizerTarget,
|
outputCommonizerTarget = parameters.commonizerTarget,
|
||||||
inputLibraries = cinteropsForTarget.map { it.libraryFile.get() }.toSet(),
|
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)
|
outputDirectory = outputDirectory(parameters)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -187,13 +207,16 @@ private fun removeRedundantParameters(parameters: Set<CInteropCommonizationParam
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private operator fun CommonizerTarget.contains(other: CommonizerTarget): Boolean {
|
private operator fun CommonizerTarget.contains(other: CommonizerTarget): Boolean {
|
||||||
if (this == other) return true
|
if (this == other) return true
|
||||||
if (this !is SharedCommonizerTarget) return false
|
if (this !is SharedCommonizerTarget) return false
|
||||||
return targets.any { child -> other in child }
|
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> {
|
private fun Project.getDependingNativeCompilations(compilation: KotlinSharedNativeCompilation): Set<KotlinNativeCompilation> {
|
||||||
/**
|
/**
|
||||||
* Some implementations of [KotlinCompilation] do not contain the default source set in
|
* Some implementations of [KotlinCompilation] do not contain the default source set in
|
||||||
|
|||||||
+1
-1
@@ -46,7 +46,7 @@ internal val Project.commonizeCInteropTask: TaskProvider<CInteropCommonizerTask>
|
|||||||
if (isCInteropCommonizationEnabled) {
|
if (isCInteropCommonizationEnabled) {
|
||||||
return locateOrRegisterTask(
|
return locateOrRegisterTask(
|
||||||
"commonizeCInterop",
|
"commonizeCInterop",
|
||||||
invokeWhenRegistered = { commonizeTask.dependsOn(this) },
|
invokeWhenRegistered = { commonizeTask.dependsOn(this); dependsOn(commonizeNativeDistributionTask) },
|
||||||
configureTask = {
|
configureTask = {
|
||||||
group = "interop"
|
group = "interop"
|
||||||
description = "Invokes the commonizer on c-interop bindings of the project"
|
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,
|
commonTarget = outputCommonizerTarget,
|
||||||
repository = repository,
|
repository = repository,
|
||||||
dependencies = StdlibRepository(distribution, libraryLoader) +
|
dependencies = StdlibRepository(distribution, libraryLoader) +
|
||||||
KonanDistributionRepository(distribution, commonizerTargets.toSet(), libraryLoader) +
|
|
||||||
FilesRepository(dependencyLibraries.toSet(), libraryLoader),
|
FilesRepository(dependencyLibraries.toSet(), libraryLoader),
|
||||||
resultsConsumer = resultsConsumer,
|
resultsConsumer = resultsConsumer,
|
||||||
statsCollector = statsCollector,
|
statsCollector = statsCollector,
|
||||||
|
|||||||
Reference in New Issue
Block a user