diff --git a/compiler/compiler-runner/src/org/jetbrains/kotlin/compilerRunner/KotlinCompilerRunnerUtils.kt b/compiler/compiler-runner/src/org/jetbrains/kotlin/compilerRunner/KotlinCompilerRunnerUtils.kt index 279728a0594..07a10d005a6 100644 --- a/compiler/compiler-runner/src/org/jetbrains/kotlin/compilerRunner/KotlinCompilerRunnerUtils.kt +++ b/compiler/compiler-runner/src/org/jetbrains/kotlin/compilerRunner/KotlinCompilerRunnerUtils.kt @@ -47,14 +47,32 @@ object KotlinCompilerRunnerUtils { isDebugEnabled: Boolean, daemonOptions: DaemonOptions = configureDaemonOptions(), additionalJvmParams: Array = arrayOf() - ): CompileServiceSession? { - val daemonJVMOptions = configureDaemonJVMOptions( + ): CompileServiceSession? = newDaemonConnection( + compilerId, + clientAliveFlagFile, + sessionAliveFlagFile, + messageCollector, + isDebugEnabled, + daemonOptions, + configureDaemonJVMOptions( *additionalJvmParams, inheritMemoryLimits = true, inheritOtherJvmOptions = false, inheritAdditionalProperties = true ) + ) + @Synchronized + @JvmStatic + fun newDaemonConnection( + compilerId: CompilerId, + clientAliveFlagFile: File, + sessionAliveFlagFile: File, + messageCollector: MessageCollector, + isDebugEnabled: Boolean, + daemonOptions: DaemonOptions = configureDaemonOptions(), + daemonJVMOptions: DaemonJVMOptions + ): CompileServiceSession? { val daemonReportMessages = ArrayList() val daemonReportingTargets = DaemonReportingTargets(messages = daemonReportMessages) diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/CompileUsingKotlinDaemon.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/CompileUsingKotlinDaemon.kt new file mode 100644 index 00000000000..7d341175a05 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/CompileUsingKotlinDaemon.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.tasks + +import org.gradle.api.Task +import org.gradle.api.provider.ListProperty +import org.gradle.api.tasks.Internal + +/** + * Task is using Kotlin daemon to run compilation. + */ +interface CompileUsingKotlinDaemon : Task { + /** + * Provides JVM arguments to Kotlin daemon, default is `null` if "kotlin.daemon.jvmargs" property is not set. + */ + @get:Internal + val kotlinDaemonJvmArguments: ListProperty +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinDaemonJvmArgsTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinDaemonJvmArgsTest.kt new file mode 100644 index 00000000000..4958c3e194f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinDaemonJvmArgsTest.kt @@ -0,0 +1,204 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle + +import org.gradle.api.logging.LogLevel +import org.gradle.testkit.runner.BuildResult +import org.gradle.tooling.internal.consumer.ConnectorServices +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.testbase.* +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +@DaemonsGradlePluginTests +@DisplayName("Kotlin daemon JVM args") +class KotlinDaemonJvmArgsTest : KGPBaseTest() { + override val defaultBuildOptions: BuildOptions + get() = super.defaultBuildOptions.copy(logLevel = LogLevel.DEBUG) + + @AfterEach + internal fun tearDown() { + // Stops Gradle and Kotlin daemon, so new run will pick up new jvm arguments + ConnectorServices.reset() + } + + @GradleTest + @DisplayName("Kotlin daemon by default should inherit Gradle daemon max jvm heap size") + internal fun shouldInheritGradleDaemonArgsByDefault(gradleVersion: GradleVersion) { + project("simpleProject", gradleVersion) { + gradleProperties.append( + """ + org.gradle.jvmargs = -Xmx758m + """.trimIndent() + ) + + build("assemble") { + assertKotlinDaemonJvmOptions( + listOf("-Xmx758m") + ) + } + } + } + + @DisplayName("Kotlin daemon should allow to define own jvm options via gradle daemon jvm args system property") + @GradleTest + internal fun shouldAllowToRedefineViaDGradleOption(gradleVersion: GradleVersion) { + project("simpleProject", gradleVersion) { + gradleProperties.append( + """ + org.gradle.jvmargs =-Xmx758m -Dkotlin.daemon.jvm.options=Xmx1g,Xms128m + """.trimIndent() + ) + + build("assemble") { + assertKotlinDaemonJvmOptions( + listOf("-Xmx1g", "--Xms128m") + ) + } + } + } + + @DisplayName("Jvm args defined in gradle.properties should override Gradle daemon jvm arguments inheritance") + @GradleTest + internal fun shouldUseArgumentsFromGradleProperties(gradleVersion: GradleVersion) { + project("simpleProject", gradleVersion) { + gradleProperties.append( + """ + org.gradle.jvmargs =-Xmx758m -Xms128m + kotlin.daemon.jvmargs = -Xmx486m -Xms256m + """.trimIndent() + ) + + build("assemble") { + assertKotlinDaemonJvmOptions( + listOf("-Xmx486m", "--Xms256m") + ) + } + } + } + + @DisplayName("Should use arguments from extension DSL") + @GradleTest + internal fun shouldUseDslArguments(gradleVersion: GradleVersion) { + project("simpleProject", gradleVersion) { + gradleProperties.append( + """ + org.gradle.jvmargs =-Xmx758m -Xms128m + """.trimIndent() + ) + + //language=Groovy + rootBuildGradle.append( + """ + + kotlin { + kotlinDaemonJvmArgs = ["-Xmx486m", "-Xms256m", "-Duser.country=US"] + } + + """.trimIndent() + ) + + build("assemble") { + assertKotlinDaemonJvmOptions( + listOf("-Xmx486m", "--Xms256m", "--Duser.country=US") + ) + } + } + } + + @DisplayName("Should allow to override global arguments for specific task") + @GradleTest + internal fun allowOverrideArgsForSpecificTask(gradleVersion: GradleVersion) { + project( + projectName = "simpleProject", + gradleVersion = gradleVersion + ) { + gradleProperties.append( + """ + org.gradle.jvmargs = -Xmx758m -Xms128m + kotlin.daemon.jvmargs = -Xmx486m -Xms256m + """.trimIndent() + ) + + //language=Groovy + rootBuildGradle.append( + """ + + import org.jetbrains.kotlin.gradle.tasks.CompileUsingKotlinDaemon + tasks + .matching { + it.name == "compileTestKotlin" && it instanceof CompileUsingKotlinDaemon + } + .configureEach { + kotlinDaemonJvmArguments.set(["-Xmx1g", "-Xms512m"]) + } + + """.trimIndent() + ) + + build("build") { + assertKotlinDaemonJvmOptions( + listOf("-Xmx486m", "--Xms256m") + ) + assertKotlinDaemonJvmOptions( + listOf("-Xmx1g", "--Xms512m") + ) + } + } + } + + @DisplayName("Should inherit Gradle memory settings if it is not set in Kotlin daemon jvm args") + @GradleTest + fun inheritGradleMemorySettingsIfKotlinArgsNotContain(gradleVersion: GradleVersion) { + project("simpleProject", gradleVersion) { + gradleProperties.append( + """ + org.gradle.jvmargs =-Xmx758m -Xms128m + """.trimIndent() + ) + + //language=Groovy + rootBuildGradle.append( + """ + + kotlin { + kotlinDaemonJvmArgs = ["-Duser.country=US"] + } + + """.trimIndent() + ) + + build("assemble") { + assertKotlinDaemonJvmOptions( + listOf("-Xmx758m", "--Duser.country=US") + ) + } + } + } + + private fun BuildResult.assertKotlinDaemonJvmOptions( + expectedOptions: List + ) { + val jvmArgsCommonMessage = "Kotlin compile daemon JVM options: " + assertOutputContains(jvmArgsCommonMessage) + val argsRegex = "\\[.+?]".toRegex() + val argsStrings = output.lineSequence() + .filter { it.contains(jvmArgsCommonMessage) } + .map { + argsRegex.findAll(it).last().value.removePrefix("[").removeSuffix("]").split(", ") + } + val containsArgs = argsStrings.any { + it.containsAll(expectedOptions) + } + + assert(containsArgs) { + printBuildOutput() + + "${argsStrings.toList()} does not contain expected args: $expectedOptions" + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerRunnerWithWorkers.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerRunnerWithWorkers.kt index 81fcb901818..bf729b74e6c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerRunnerWithWorkers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerRunnerWithWorkers.kt @@ -20,9 +20,9 @@ import java.io.File internal class GradleCompilerRunnerWithWorkers( taskProvider: GradleCompileTaskProvider, jdkToolsJar: File?, + kotlinDaemonJvmArgs: List?, private val workerExecutor: WorkerExecutor -) : GradleCompilerRunner(taskProvider, jdkToolsJar) { - +) : GradleCompilerRunner(taskProvider, jdkToolsJar, kotlinDaemonJvmArgs) { override fun runCompilerAsync(workArgs: GradleKotlinCompilerWorkArguments): WorkQueue { loggerProvider.kotlinDebug { "Starting Kotlin compiler work from task '${pathProvider}'" } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt index 5c296c516bc..2791a1eb490 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt @@ -16,6 +16,8 @@ import org.jetbrains.kotlin.cli.common.arguments.* import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.daemon.client.CompileServiceSession import org.jetbrains.kotlin.daemon.common.CompilerId +import org.jetbrains.kotlin.daemon.common.configureDaemonJVMOptions +import org.jetbrains.kotlin.daemon.common.filterExtractProps import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.logging.kotlinDebug @@ -59,7 +61,8 @@ is not assignable to 'org.gradle.api.tasks.TaskProvider'" exception */ internal open class GradleCompilerRunner( protected val taskProvider: GradleCompileTaskProvider, - protected val jdkToolsJar: File? + protected val jdkToolsJar: File?, + protected val kotlinDaemonJvmArgs: List? ) { internal val pathProvider = taskProvider.path.get() @@ -185,7 +188,8 @@ internal open class GradleCompilerRunner( taskPath = pathProvider, reportingSettings = environment.reportingSettings, kotlinScriptExtensions = environment.kotlinScriptExtensions, - allWarningsAsErrors = compilerArgs.allWarningsAsErrors + allWarningsAsErrors = compilerArgs.allWarningsAsErrors, + daemonJvmArgs = kotlinDaemonJvmArgs ) TaskLoggers.put(pathProvider, loggerProvider) return runCompilerAsync(workArgs) @@ -204,15 +208,27 @@ internal open class GradleCompilerRunner( sessionIsAliveFlagFile: File, compilerFullClasspath: List, messageCollector: MessageCollector, + daemonJvmArgs: List?, isDebugEnabled: Boolean ): CompileServiceSession? { val compilerId = CompilerId.makeCompilerId(compilerFullClasspath) - val additionalJvmParams = arrayListOf() + val daemonJvmOptions = configureDaemonJVMOptions( + inheritMemoryLimits = true, + inheritOtherJvmOptions = false, + inheritAdditionalProperties = true + ).also { opts -> + if (!daemonJvmArgs.isNullOrEmpty()) { + opts.jvmParams.addAll( + daemonJvmArgs.filterExtractProps(opts.mappers, "", opts.restMapper) + ) + } + } + return KotlinCompilerRunnerUtils.newDaemonConnection( compilerId, clientIsAliveFlagFile, sessionIsAliveFlagFile, messageCollector = messageCollector, isDebugEnabled = isDebugEnabled, - additionalJvmParams = additionalJvmParams.toTypedArray() + daemonJVMOptions = daemonJvmOptions ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt index cf4938ca1c4..d4a725d2d52 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt @@ -62,7 +62,8 @@ internal class GradleKotlinCompilerWorkArguments( val taskPath: String, val reportingSettings: ReportingSettings, val kotlinScriptExtensions: Array, - val allWarningsAsErrors: Boolean + val allWarningsAsErrors: Boolean, + val daemonJvmArgs: List? ) : Serializable { companion object { const val serialVersionUID: Long = 0 @@ -105,6 +106,7 @@ internal class GradleKotlinCompilerWork @Inject constructor( private val buildDir = config.projectFiles.buildDir private val metrics = if (reportingSettings.reportMetrics) BuildMetricsReporterImpl() else DoNothingBuildMetricsReporter private var icLogLines: List = emptyList() + private val daemonJvmArgs = config.daemonJvmArgs private val log: KotlinLogger = TaskLoggers.get(taskPath)?.let { GradleKotlinLogger(it).apply { debug("Using '$taskPath' logger") } } @@ -175,7 +177,8 @@ internal class GradleKotlinCompilerWork @Inject constructor( sessionFlagFile, compilerFullClasspath, daemonMessageCollector, - isDebugEnabled = isDebugEnabled + isDebugEnabled = isDebugEnabled, + daemonJvmArgs = daemonJvmArgs ) } catch (e: Throwable) { log.error("Caught an exception trying to connect to Kotlin Daemon:") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt index c2bff50d3b7..ede2de3d955 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt @@ -21,6 +21,8 @@ import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.targets.js.calculateJsCompilerType import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset +import org.jetbrains.kotlin.gradle.tasks.CompileUsingKotlinDaemon +import org.jetbrains.kotlin.gradle.tasks.withType import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.statistics.metrics.StringMetrics @@ -72,6 +74,24 @@ open class KotlinTopLevelExtension (internal val project: Project) { toolchainSupport.applyToolchain(action) } + /** + * Configures Kotlin daemon JVM arguments for all tasks in this project. + * + * **Note**: In case other projects are using different JVM arguments, new instance of Kotlin daemon will be started. + */ + @get:JvmSynthetic + var kotlinDaemonJvmArgs: List + @Deprecated("", level = DeprecationLevel.ERROR) + get() = throw UnsupportedOperationException() + set(value) { + project + .tasks + .withType() + .configureEach { + it.kotlinDaemonJvmArguments.set(value) + } + } + var explicitApi: ExplicitApiMode? = null fun explicitApi() { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt index aab23a252d7..6853d586391 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt @@ -509,6 +509,7 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To KaptWithoutKotlincTask.Configurator(kotlinCompileTask).configure(kaptTask) } else { KaptWithKotlincTask.Configurator(kotlinCompileTask).configure(kaptTask as KaptWithKotlincTask) + PropertiesProvider(project).mapKotlinDaemonProperties(kaptTask) } kaptTask.stubsDir.set(getKaptStubsDir()) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt index ff5c7ee0203..e72c023c329 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.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.* @@ -30,7 +31,8 @@ import javax.inject.Inject abstract class KaptWithKotlincTask @Inject constructor( objectFactory: ObjectFactory ) : KaptTask(objectFactory), - CompilerArgumentAwareWithInput { + CompilerArgumentAwareWithInput, + CompileUsingKotlinDaemonWithNormalization { class Configurator(kotlinCompileTask: KotlinCompile): KaptTask.Configurator(kotlinCompileTask) { override fun configure(task: KaptWithKotlincTask) { @@ -58,6 +60,8 @@ abstract class KaptWithKotlincTask @Inject constructor( override fun createCompilerArgs(): K2JVMCompilerArguments = K2JVMCompilerArguments() + abstract override val kotlinDaemonJvmArguments: ListProperty + @get:Internal internal abstract val compileKotlinArgumentsContributor: Property> @@ -117,7 +121,8 @@ abstract class KaptWithKotlincTask @Inject constructor( val compilerRunner = GradleCompilerRunner( taskProvider.get(), - defaultKotlinJavaToolchain.get().currentJvmJdkToolsJar.orNull + defaultKotlinJavaToolchain.get().currentJvmJdkToolsJar.orNull, + normalizedKotlinDaemonJvmArguments.orNull ) compilerRunner.runJvmCompilerAsync( sourcesToCompile = emptyList(), diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index 9061daf6fd4..50430da6ac4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat.Compan import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile +import org.jetbrains.kotlin.gradle.tasks.CompileUsingKotlinDaemon import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild @@ -51,6 +52,12 @@ internal fun PropertiesProvider.mapKotlinTaskProperties(task: AbstractKotlinComp } } +internal fun PropertiesProvider.mapKotlinDaemonProperties(task: CompileUsingKotlinDaemon) { + kotlinDaemonJvmArgs?.let { + task.kotlinDaemonJvmArguments.set(it.split("\\s+".toRegex())) + } +} + internal class PropertiesProvider private constructor(private val project: Project) { private val localProperties: Properties by lazy { Properties().apply { @@ -348,6 +355,9 @@ internal class PropertiesProvider private constructor(private val project: Proje val jvmTargetValidationMode: JvmTargetValidationMode get() = enumProperty("kotlin.jvm.target.validation.mode", JvmTargetValidationMode.WARNING) + val kotlinDaemonJvmArgs: String? + get() = property("kotlin.daemon.jvmargs") + private fun propertyWithDeprecatedVariant(propName: String, deprecatedPropName: String): String? { val deprecatedProperty = property(deprecatedPropName) if (deprecatedProperty != null) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLinkWithWorkers.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLinkWithWorkers.kt index 9c825dc0ed8..a40ad77eaf5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLinkWithWorkers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLinkWithWorkers.kt @@ -27,6 +27,7 @@ constructor( GradleCompilerRunnerWithWorkers( it, null, + normalizedKotlinDaemonJvmArguments.orNull, workerExecutor ) as GradleCompilerRunner } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/CompileUsingKotlinDaemonWithNormalization.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/CompileUsingKotlinDaemonWithNormalization.kt new file mode 100644 index 00000000000..5f38b90f069 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/CompileUsingKotlinDaemonWithNormalization.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.tasks + +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.Internal + +internal interface CompileUsingKotlinDaemonWithNormalization : CompileUsingKotlinDaemon { + + @get:Internal + val normalizedKotlinDaemonJvmArguments: Provider> + get() = kotlinDaemonJvmArguments.map { + it.map { arg -> arg.trim().removePrefix("-") } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index f4026e418e4..768c1f3c04f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -167,7 +167,8 @@ abstract class GradleCompileTaskProvider @Inject constructor( ) } -abstract class AbstractKotlinCompile : AbstractKotlinCompileTool() { +abstract class AbstractKotlinCompile : AbstractKotlinCompileTool(), + CompileUsingKotlinDaemonWithNormalization { open class Configurator>(protected val compilation: KotlinCompilationData<*>) : TaskConfigurator { override fun configure(task: T) { @@ -197,6 +198,8 @@ abstract class AbstractKotlinCompile : AbstractKotl project.layout.buildDirectory.dir("$KOTLIN_BUILD_DIR_NAME/${task.name}") ).disallowChanges() task.localStateDirectories.from(task.taskBuildDirectory).disallowChanges() + + PropertiesProvider(task.project).mapKotlinDaemonProperties(task) } } @@ -295,6 +298,8 @@ abstract class AbstractKotlinCompile : AbstractKotl private val kotlinLogger by lazy { GradleKotlinLogger(logger) } + abstract override val kotlinDaemonJvmArguments: ListProperty + @get:Internal protected val gradleCompileTaskProvider: Provider = objects .property( @@ -305,7 +310,7 @@ abstract class AbstractKotlinCompile : AbstractKotl internal open val compilerRunner: Provider = objects.propertyWithConvention( gradleCompileTaskProvider.map { - GradleCompilerRunner(it, null) + GradleCompilerRunner(it, null, normalizedKotlinDaemonJvmArguments.orNull) } ) @@ -496,7 +501,8 @@ abstract class KotlinCompile @Inject constructor( objects.property(gradleCompileTaskProvider.map { GradleCompilerRunner( it, - toolchain.currentJvmJdkToolsJar.orNull + toolchain.currentJvmJdkToolsJar.orNull, + normalizedKotlinDaemonJvmArguments.orNull ) }) } @@ -644,6 +650,7 @@ internal abstract class KotlinCompileWithWorkers @Inject constructor( GradleCompilerRunnerWithWorkers( it, null, + normalizedKotlinDaemonJvmArguments.orNull, workerExecutor ) as GradleCompilerRunner } @@ -662,6 +669,7 @@ internal abstract class Kotlin2JsCompileWithWorkers @Inject constructor( GradleCompilerRunnerWithWorkers( it, null, + normalizedKotlinDaemonJvmArguments.orNull, workerExecutor ) as GradleCompilerRunner } @@ -679,6 +687,7 @@ internal abstract class KotlinCompileCommonWithWorkers @Inject constructor( GradleCompilerRunnerWithWorkers( it, null, + normalizedKotlinDaemonJvmArguments.orNull, workerExecutor ) as GradleCompilerRunner }