Make NativeDistributionCommonizerTask configuration cache compatible

^KT-43293 In Progress
This commit is contained in:
Anton Lakotka
2022-07-13 19:57:26 +02:00
committed by Space
parent 8cc9406b1f
commit f85762ab56
6 changed files with 86 additions and 39 deletions
@@ -5,12 +5,6 @@
package org.jetbrains.kotlin.compilerRunner
import org.gradle.api.Project
import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Input
import org.jetbrains.kotlin.gradle.plugin.KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import java.io.File
internal class KotlinNativeCommonizerToolRunner(
@@ -20,17 +14,9 @@ internal class KotlinNativeCommonizerToolRunner(
class Settings(
val kotlinPluginVersion: String,
classpathProvider: () -> Set<File>,
val classpath: Set<File>,
val customJvmArgs: List<String>
) {
val classpath by lazy(classpathProvider)
constructor(project: Project) : this(
kotlinPluginVersion = project.getKotlinPluginVersion(),
classpathProvider = { buildClasspath(project) },
customJvmArgs = getCustomJvmArgs(project)
)
}
)
override val displayName get() = "Kotlin/Native KLIB commonizer"
@@ -47,18 +33,3 @@ internal class KotlinNativeCommonizerToolRunner(
override fun getCustomJvmArgs() = settings.customJvmArgs
}
private fun buildClasspath(project: Project): Set<File> {
try {
return project.configurations.getByName(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME).resolve() as Set<File>
} catch (e: Exception) {
project.logger.error(
"Could not resolve KLIB commonizer classpath. Check if Kotlin Gradle plugin repository is configured in $project."
)
throw e
}
}
private fun getCustomJvmArgs(project: Project): List<String> = PropertiesProvider(project)
.commonizerJvmArgs
?.split("\\s+".toRegex())
.orEmpty()
@@ -316,8 +316,10 @@ internal class PropertiesProvider private constructor(private val project: Proje
/**
* Allows a user to specify additional arguments of a JVM executing KLIB commonizer.
*/
val commonizerJvmArgs: String?
val commonizerJvmArgs: List<String>
get() = propertyWithDeprecatedVariant("kotlin.mpp.commonizerJvmArgs", "kotlin.commonizer.jvmArgs")
?.split("\\s+".toRegex())
.orEmpty()
/**
* Enables experimental commonization of user defined c-interop libraries.
@@ -5,7 +5,10 @@
package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
@@ -24,13 +27,16 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.kotlinSourceSetsIncludingDefault
import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerTask.CInteropGist
import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
import org.jetbrains.kotlin.gradle.utils.chainedFinalizeValueOnRead
import org.jetbrains.kotlin.gradle.utils.listProperty
import org.jetbrains.kotlin.gradle.utils.property
import org.jetbrains.kotlin.konan.target.KonanTarget
import java.io.File
import javax.inject.Inject
@CacheableTask
internal open class CInteropCommonizerTask
@Inject constructor (
@Inject constructor(
private val objectFactory: ObjectFactory,
private val execOperations: ExecOperations,
) : AbstractCInteropCommonizerTask() {
@@ -76,7 +82,28 @@ internal open class CInteropCommonizerTask
override val outputDirectory: File = project.buildDir.resolve("classes/kotlin/commonizer")
private val runnerSettings = KotlinNativeCommonizerToolRunner.Settings(project)
@get:Internal
internal val kotlinPluginVersion: Property<String> = objectFactory
.property<String>()
.chainedFinalizeValueOnRead()
@get:Internal
internal val commonizerClasspath: ConfigurableFileCollection = objectFactory.fileCollection()
@get:Internal
internal val customJvmArgs: ListProperty<String> = objectFactory
.listProperty<String>()
.chainedFinalizeValueOnRead()
private val runnerSettings: Provider<KotlinNativeCommonizerToolRunner.Settings> = kotlinPluginVersion
.zip(customJvmArgs) { pluginVersion, customJvmArgs ->
commonizerClasspath
KotlinNativeCommonizerToolRunner.Settings(
pluginVersion,
commonizerClasspath.files,
customJvmArgs
)
}
private val konanHome = project.file(project.konanHome)
private val commonizerLogLevel = project.commonizerLogLevel
@@ -135,7 +162,7 @@ internal open class CInteropCommonizerTask
val commonizerRunner = KotlinNativeCommonizerToolRunner(
context = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger),
settings = runnerSettings
settings = runnerSettings.get()
)
GradleCliCommonizer(commonizerRunner).commonizeLibraries(
@@ -10,7 +10,9 @@ import org.gradle.api.Task
import org.gradle.api.tasks.Delete
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.internal.isInIdeaSync
import org.jetbrains.kotlin.gradle.plugin.KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.plugin.ide.Idea222Api
import org.jetbrains.kotlin.gradle.plugin.ide.ideaImportDependsOn
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
@@ -73,6 +75,12 @@ internal val Project.commonizeCInteropTask: TaskProvider<CInteropCommonizerTask>
configureTask = {
group = "interop"
description = "Invokes the commonizer on c-interop bindings of the project"
kotlinPluginVersion.set(getKotlinPluginVersion())
commonizerClasspath.from(
configurations.getByName(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME)
)
customJvmArgs.set(PropertiesProvider(project).commonizerJvmArgs)
}
)
}
@@ -117,6 +125,12 @@ internal val Project.commonizeNativeDistributionTask: TaskProvider<NativeDistrib
configureTask = {
group = "interop"
description = "Invokes the commonizer on platform libraries provided by the Kotlin/Native distribution"
kotlinPluginVersion.set(getKotlinPluginVersion())
commonizerClasspath.from(
configurations.getByName(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME)
)
customJvmArgs.set(PropertiesProvider(project).commonizerJvmArgs)
}
)
}
@@ -7,7 +7,11 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
@@ -19,6 +23,9 @@ import org.jetbrains.kotlin.compilerRunner.registerCommonizerClasspathConfigurat
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.chainedFinalizeValueOnRead
import org.jetbrains.kotlin.gradle.utils.property
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_COMMONIZED_LIBS_DIR
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_KLIB_DIR
import java.io.File
@@ -26,7 +33,7 @@ import java.net.URLEncoder
import javax.inject.Inject
internal open class NativeDistributionCommonizerTask
@Inject constructor (
@Inject constructor(
private val objectFactory: ObjectFactory,
private val execOperations: ExecOperations,
) : DefaultTask() {
@@ -37,7 +44,28 @@ internal open class NativeDistributionCommonizerTask
project.collectAllSharedCommonizerTargetsFromBuild()
}
private val runnerSettings = KotlinNativeCommonizerToolRunner.Settings(project)
@get:Internal
internal val kotlinPluginVersion: Property<String> = objectFactory
.property<String>()
.chainedFinalizeValueOnRead()
@get:Internal
internal val commonizerClasspath: ConfigurableFileCollection = objectFactory.fileCollection()
@get:Internal
internal val customJvmArgs: ListProperty<String> = objectFactory
.listProperty<String>()
.chainedFinalizeValueOnRead()
private val runnerSettings: Provider<KotlinNativeCommonizerToolRunner.Settings> = kotlinPluginVersion
.zip(customJvmArgs) { pluginVersion, customJvmArgs ->
commonizerClasspath
KotlinNativeCommonizerToolRunner.Settings(
pluginVersion,
commonizerClasspath.files,
customJvmArgs
)
}
private val logLevel = project.commonizerLogLevel
@@ -62,7 +90,7 @@ internal open class NativeDistributionCommonizerTask
protected fun run() {
val commonizerRunner = KotlinNativeCommonizerToolRunner(
context = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger),
settings = runnerSettings
settings = runnerSettings.get()
)
commonizerCache.writeCacheForUncachedTargets(commonizerTargets) { todoOutputTargets ->
@@ -78,6 +78,11 @@ internal fun <PropType : Any?, T : Property<PropType>> T.chainedFinalizeValueOnR
finalizeValueOnRead()
}
internal fun <PropType : Any?, T : ListProperty<PropType>> T.chainedFinalizeValueOnRead(): T =
apply {
finalizeValueOnRead()
}
// Before 5.0 fileProperty is created via ProjectLayout
// https://docs.gradle.org/current/javadoc/org/gradle/api/model/ObjectFactory.html#fileProperty--
internal fun Project.newFileProperty(initialize: (() -> File)? = null): RegularFileProperty {
@@ -105,4 +110,4 @@ internal inline fun <reified T> Project.listProperty(noinline itemsProvider: ()
objects.listProperty(T::class.java).apply { set(provider(itemsProvider)) }
internal inline fun <reified T> Project.setProperty(noinline itemsProvider: () -> Iterable<T>): SetProperty<T> =
objects.setProperty(T::class.java).apply { set(provider(itemsProvider)) }
objects.setProperty(T::class.java).apply { set(provider(itemsProvider)) }