diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeCommonizerToolRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeCommonizerToolRunner.kt index feea8716a49..38dca831ce2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeCommonizerToolRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeCommonizerToolRunner.kt @@ -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, + val classpath: Set, val customJvmArgs: List - ) { - 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 { - try { - return project.configurations.getByName(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME).resolve() as Set - } 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 = PropertiesProvider(project) - .commonizerJvmArgs - ?.split("\\s+".toRegex()) - .orEmpty() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index 8984abd47d5..d25e6b640a9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -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 get() = propertyWithDeprecatedVariant("kotlin.mpp.commonizerJvmArgs", "kotlin.commonizer.jvmArgs") + ?.split("\\s+".toRegex()) + .orEmpty() /** * Enables experimental commonization of user defined c-interop libraries. diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt index 36fda9889d6..45fdd8bcd47 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt @@ -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 = objectFactory + .property() + .chainedFinalizeValueOnRead() + + @get:Internal + internal val commonizerClasspath: ConfigurableFileCollection = objectFactory.fileCollection() + + @get:Internal + internal val customJvmArgs: ListProperty = objectFactory + .listProperty() + .chainedFinalizeValueOnRead() + + private val runnerSettings: Provider = 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( diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt index dbc286e7206..675553cb793 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt @@ -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 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 = objectFactory + .property() + .chainedFinalizeValueOnRead() + + @get:Internal + internal val commonizerClasspath: ConfigurableFileCollection = objectFactory.fileCollection() + + @get:Internal + internal val customJvmArgs: ListProperty = objectFactory + .listProperty() + .chainedFinalizeValueOnRead() + + private val runnerSettings: Provider = 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 -> diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/providerApiUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/providerApiUtils.kt index d0b2b27c984..11374c6c0d2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/providerApiUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/providerApiUtils.kt @@ -78,6 +78,11 @@ internal fun > T.chainedFinalizeValueOnR finalizeValueOnRead() } +internal fun > 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 Project.listProperty(noinline itemsProvider: () objects.listProperty(T::class.java).apply { set(provider(itemsProvider)) } internal inline fun Project.setProperty(noinline itemsProvider: () -> Iterable): SetProperty = - objects.setProperty(T::class.java).apply { set(provider(itemsProvider)) } \ No newline at end of file + objects.setProperty(T::class.java).apply { set(provider(itemsProvider)) }