From 6f394f42a633c483742fbd3bfafd5f0ab75b4000 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sun, 30 Jul 2023 22:10:14 +0200 Subject: [PATCH] [Gradle] Introduce compilerOptions on Kotlin targets for JVM KotlinJvmTarget, KotlinAndroidTarget, KotlinWithJavaTarget now expose compiler options that are passed as a convention into target compilations compiler options. Compiler options from Kotlin/JVM and Kotlin/Android plugins compiler options are used now as convention for target compiler options. ^KT-57292 In Progress --- .../kotlin/gradle/CompilerOptionsProjectIT.kt | 94 +++++++++++++++++++ .../gradle/plugin/KotlinAndroidPlugin.kt | 2 +- .../kotlin/gradle/plugin/KotlinJvmPlugin.kt | 19 ++-- ...nCompilationCompilerOptionsConfigurator.kt | 31 ++++++ .../targets/android/KotlinAndroidTarget.kt | 17 ++++ .../jvm/KotlinJvmAndroidCompilationFactory.kt | 8 +- .../jvm/KotlinJvmCompilationFactory.kt | 10 +- .../gradle/targets/jvm/KotlinJvmTarget.kt | 19 +++- .../jvm/KotlinJvmTargetConfigurator.kt | 11 --- .../jvm/KotlinWithJavaCompilationFactory.kt | 17 +++- .../targets/jvm/KotlinWithJavaTarget.kt | 17 ++++ 11 files changed, 215 insertions(+), 30 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationCompilerOptionsConfigurator.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CompilerOptionsProjectIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CompilerOptionsProjectIT.kt index f13a42dae71..4bfb290b7db 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CompilerOptionsProjectIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CompilerOptionsProjectIT.kt @@ -55,6 +55,52 @@ class CompilerOptionsProjectIT : KGPBaseTest() { } } + @GradleTest + @DisplayName("Jvm project target compiler options DSL override project level options") + @JvmGradlePluginTests + fun jvmOptionTarget(gradleVersion: GradleVersion) { + project( + "simpleProject", + gradleVersion, + buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.DEBUG) + ) { + buildGradle.appendText( + //language=Groovy + """ + | + |kotlin { + | target.compilerOptions { + | javaParameters = true + | verbose = false + | } + | + | compilerOptions { + | javaParameters = false + | verbose = false + | } + |} + """.trimMargin() + ) + + build("compileKotlin") { + assertTasksExecuted(":compileKotlin") + + val compilationArgs = output.lineSequence().first { it.contains("Kotlin compiler args:") } + + assert(compilationArgs.contains("-java-parameters")) { + printBuildOutput() + "Compiler arguments does not contain '-progressive': $compilationArgs" + } + + // '-verbose' by default will be set to 'true' by debug log level + assert(!compilationArgs.contains("-verbose")) { + printBuildOutput() + "Compiler arguments contains '-verbose': $compilationArgs" + } + } + } + } + @DisplayName("languageSettings should not override project options when not configured") @JvmGradlePluginTests @GradleTest @@ -252,6 +298,54 @@ class CompilerOptionsProjectIT : KGPBaseTest() { } } + @DisplayName("Android target compiler options override project level compiler options") + @AndroidGradlePluginTests + @GradleAndroidTest + fun androidProjectTargetOverrideProjectOptions( + gradleVersion: GradleVersion, + agpVersion: String, + jdk: JdkVersions.ProvidedJdk + ) { + project( + "AndroidSimpleApp", + gradleVersion, + buildJdk = jdk.location, + buildOptions = defaultBuildOptions.copy(androidVersion = agpVersion, logLevel = LogLevel.DEBUG) + ) { + buildGradle.appendText( + //language=Groovy + """ + | + |kotlin { + | target.compilerOptions { + | javaParameters = true + | moduleName = "my_app" + | } + | + | compilerOptions { + | javaParameters = false + | moduleName = "other_app" + | } + |} + """.trimMargin() + ) + + build("compileDebugKotlin") { + assertTasksExecuted(":compileDebugKotlin") + + assertOutputDoesNotContain( + "w: :compileKotlin 'KotlinJvmCompile.moduleName' is deprecated, please migrate to 'compilerOptions.moduleName'!" + ) + + assertCompilerArguments( + ":compileDebugKotlin", + "-java-parameters", + "-module-name my_app_debug" + ) + } + } + } + @DisplayName("KT-59056: freeCompilerArgs are combined with android.kotlinOptions.freeCompilerArgs") @AndroidGradlePluginTests @GradleAndroidTest diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt index 84cdb4c5a8a..dee2af0d70b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt @@ -41,7 +41,7 @@ internal open class KotlinAndroidPlugin( kotlinAndroidExtension.target = target project.configureCompilerOptionsForTarget( kotlinAndroidExtension.compilerOptions, - target.compilations + target.compilerOptions ) kotlinAndroidExtension.compilerOptions.noJdk.value(true).disallowChanges() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmPlugin.kt index aa004949603..8951fcebbdd 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmPlugin.kt @@ -29,7 +29,7 @@ internal open class KotlinJvmPlugin( internal fun Project.configureCompilerOptionsForTarget( extensionCompilerOptions: KotlinJvmCompilerOptions, - @Suppress("DEPRECATION") compilationsContainer: NamedDomainObjectContainer> + targetCompilerOptions: KotlinJvmCompilerOptions ) { extensionCompilerOptions.verbose.convention(logger.isDebugEnabled) extensionCompilerOptions.moduleName.convention(baseModuleName()) @@ -37,17 +37,10 @@ internal open class KotlinJvmPlugin( extensionCompilerOptions, project ) - compilationsContainer.configureEach { - val jvmCompilerOptions = it.compilerOptions.options as KotlinJvmCompilerOptions - KotlinJvmCompilerOptionsHelper.syncOptionsAsConvention( - from = extensionCompilerOptions, - into = jvmCompilerOptions - ) - - jvmCompilerOptions.moduleName.convention( - it.moduleNameForCompilation(extensionCompilerOptions.moduleName) - ) - } + KotlinJvmCompilerOptionsHelper.syncOptionsAsConvention( + from = extensionCompilerOptions, + into = targetCompilerOptions + ) } } @@ -85,7 +78,7 @@ internal open class KotlinJvmPlugin( project.configureCompilerOptionsForTarget( kotlinExtension.compilerOptions, - target.compilations + target.compilerOptions ) project.pluginManager.apply(ScriptingGradleSubplugin::class.java) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationCompilerOptionsConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationCompilerOptionsConfigurator.kt new file mode 100644 index 00000000000..beca255b202 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationCompilerOptionsConfigurator.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2023 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.plugin.mpp.compilationImpl + +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsHelper +import org.jetbrains.kotlin.gradle.plugin.mpp.DecoratedKotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory +import org.jetbrains.kotlin.gradle.plugin.mpp.moduleNameForCompilation + +internal class KotlinCompilationJvmCompilerOptionsFromTargetConfigurator( + private val targetCompilerOptions: KotlinJvmCompilerOptions +) : KotlinCompilationImplFactory.PostConfigure { + override fun configure(compilation: DecoratedKotlinCompilation<*>) { + val jvmCompilerOptions = compilation.compilerOptions.options as KotlinJvmCompilerOptions + KotlinJvmCompilerOptionsHelper.syncOptionsAsConvention( + targetCompilerOptions, + jvmCompilerOptions + ) + + jvmCompilerOptions.moduleName.convention( + moduleNameForCompilation( + compilation.compilationName, + targetCompilerOptions.moduleName + ).orElse(compilation.moduleNameForCompilation()) + ) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt index b35d32111e1..af23c8f8243 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt @@ -12,8 +12,11 @@ import org.gradle.api.artifacts.Configuration import org.gradle.api.attributes.Attribute import org.gradle.api.attributes.AttributeContainer import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsDefault import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes +import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.dashSeparatedName import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName @@ -327,5 +330,19 @@ abstract class KotlinAndroidTarget @Inject constructor( private fun filterOutAndroidAgpVersionAttribute( attribute: Attribute<*>, ): Boolean = attribute.name != "com.android.build.api.attributes.AgpVersionAttr" + + @ExperimentalKotlinGradlePluginApi + override val compilerOptions: KotlinJvmCompilerOptions = project.objects + .newInstance() + + @ExperimentalKotlinGradlePluginApi + fun compilerOptions(configure: KotlinJvmCompilerOptions.() -> Unit) { + configure(compilerOptions) + } + + @ExperimentalKotlinGradlePluginApi + fun compilerOptions(configure: Action) { + configure.execute(compilerOptions) + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilationFactory.kt index fc8533186e5..84e883ba126 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilationFactory.kt @@ -11,7 +11,9 @@ import org.jetbrains.kotlin.gradle.plugin.hierarchy.KotlinSourceSetTreeClassifie import org.jetbrains.kotlin.gradle.plugin.hierarchy.KotlinSourceSetTreeClassifier.Property import org.jetbrains.kotlin.gradle.plugin.hierarchy.sourceSetTreeClassifier import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPostConfigure import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinAndroidCompilationAssociator +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationJvmCompilerOptionsFromTargetConfigurator import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.AndroidCompilationSourceSetsContainerFactory import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinJvmCompilerOptionsFactory @@ -35,7 +37,11 @@ class KotlinJvmAndroidCompilationFactory internal constructor( ) ), compilationAssociator = KotlinAndroidCompilationAssociator, - compilationSourceSetsContainerFactory = AndroidCompilationSourceSetsContainerFactory(target, variant) + compilationSourceSetsContainerFactory = AndroidCompilationSourceSetsContainerFactory(target, variant), + postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite( + DefaultKotlinCompilationPostConfigure, + KotlinCompilationJvmCompilerOptionsFromTargetConfigurator(target.compilerOptions) + ) ) override fun create(name: String): KotlinJvmAndroidCompilation { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmCompilationFactory.kt index 0df48ebef62..cab84eb3527 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmCompilationFactory.kt @@ -6,19 +6,25 @@ @file:Suppress("PackageDirectoryMismatch") // Old package for compatibility package org.jetbrains.kotlin.gradle.plugin.mpp +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPostConfigure +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationJvmCompilerOptionsFromTargetConfigurator import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinJvmCompilationAssociator import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinJvmCompilerOptionsFactory import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget open class KotlinJvmCompilationFactory internal constructor( - override val target: KotlinJvmTarget + final override val target: KotlinJvmTarget ) : KotlinCompilationFactory { private val compilationImplFactory: KotlinCompilationImplFactory = KotlinCompilationImplFactory( compilerOptionsFactory = KotlinJvmCompilerOptionsFactory, - compilationAssociator = KotlinJvmCompilationAssociator + compilationAssociator = KotlinJvmCompilationAssociator, + postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite( + DefaultKotlinCompilationPostConfigure, + KotlinCompilationJvmCompilerOptionsFromTargetConfigurator(target.compilerOptions) + ) ) override val itemClass: Class diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt index b9dd9bcbf9e..0c0e0a2f994 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.targets.jvm +import org.gradle.api.Action import org.gradle.api.InvalidUserCodeException import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project @@ -20,6 +21,8 @@ import org.gradle.jvm.tasks.Jar import org.gradle.language.jvm.tasks.ProcessResources import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.dsl.* +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsDefault import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.AfterFinaliseDsl @@ -34,8 +37,8 @@ import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmRunDsl import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmRunDslImpl import org.jetbrains.kotlin.gradle.targets.jvm.tasks.registerMainRunTask import org.jetbrains.kotlin.gradle.tasks.withType +import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.Future -import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.gradle.utils.findAppliedAndroidPluginIdOrNull import org.jetbrains.kotlin.gradle.utils.future import org.jetbrains.kotlin.utils.addToStdlib.cast @@ -331,5 +334,19 @@ abstract class KotlinJvmTarget @Inject constructor( */ private fun areRuntimeOrCompileConfigurationsAvailable(): Boolean = GradleVersion.version(project.gradle.gradleVersion) <= GradleVersion.version("6.8.3") + + @ExperimentalKotlinGradlePluginApi + override val compilerOptions: KotlinJvmCompilerOptions = project.objects + .newInstance() + + @ExperimentalKotlinGradlePluginApi + fun compilerOptions(configure: KotlinJvmCompilerOptions.() -> Unit) { + configure(compilerOptions) + } + + @ExperimentalKotlinGradlePluginApi + fun compilerOptions(configure: Action) { + configure.execute(compilerOptions) + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetConfigurator.kt index dc98a5ce02a..0cbc0e98221 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetConfigurator.kt @@ -9,7 +9,6 @@ import org.gradle.api.Task import org.gradle.api.plugins.JavaBasePlugin import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmCompilation -import org.jetbrains.kotlin.gradle.plugin.mpp.moduleNameForCompilation import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmTest import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.tasks.dependsOn @@ -27,16 +26,6 @@ open class KotlinJvmTargetConfigurator : super.configurePlatformSpecificModel(target) } - override fun configureCompilations(target: KotlinJvmTarget) { - super.configureCompilations(target) - - target.compilations.configureEach { - it.compilerOptions.options.moduleName.convention( - it.moduleNameForCompilation() - ) - } - } - override val testRunClass: Class get() = KotlinJvmTestRun::class.java diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationFactory.kt index f4c27a6bc23..c0a6bfdfeb6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationFactory.kt @@ -8,8 +8,13 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPostConfigure import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPreConfigure +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationJsCompilerOptionsFromTargetConfigurator +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationJvmCompilerOptionsFromTargetConfigurator import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinJvmCompilationAssociator import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JvmWithJavaCompilationDependencyConfigurationsFactory import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JvmWithJavaCompilationTaskNamesContainerFactory @@ -57,7 +62,17 @@ class KotlinWithJavaCompilationFactory compilation.compileDependencyFiles = project.filesProvider { javaSourceSet.compileClasspath } compilation.runtimeDependencyFiles = project.filesProvider { javaSourceSet.runtimeClasspath } - } + }, + postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite( + DefaultKotlinCompilationPostConfigure, + if (target.platformType == KotlinPlatformType.js || target.platformType == KotlinPlatformType.common) { + // JS/Legacy or Common/legacy (KotlinCommonPlugin) targets uses KotlinWithJavaCompilation, + // but as they are deprecated - we are ignoring it + null + } else { + KotlinCompilationJvmCompilerOptionsFromTargetConfigurator(target.compilerOptions) + } + ) ) return project.objects.newInstance( diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaTarget.kt index 9f72dc3704f..d8ff5e83bf1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaTarget.kt @@ -6,6 +6,7 @@ @file:Suppress("PackageDirectoryMismatch") // Old package for compatibility package org.jetbrains.kotlin.gradle.plugin.mpp +import org.gradle.api.Action import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.artifacts.Dependency @@ -14,12 +15,14 @@ import org.gradle.api.plugins.JavaPlugin import org.gradle.api.provider.Provider import org.gradle.api.tasks.SourceSetContainer import org.gradle.jvm.tasks.Jar +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactory import org.jetbrains.kotlin.gradle.tasks.KOTLIN_BUILD_DIR_NAME +import org.jetbrains.kotlin.gradle.utils.newInstance import java.io.File import javax.inject.Inject @@ -58,6 +61,20 @@ abstract class KotlinWithJavaTarget = layout.buildDirectory.dir(KOTLIN_BUILD_DIR_NAME) + + @ExperimentalKotlinGradlePluginApi + override val compilerOptions: KotlinJvmCompilerOptions = project.objects + .newInstance() + + @ExperimentalKotlinGradlePluginApi + fun compilerOptions(configure: KotlinJvmCompilerOptions.() -> Unit) { + configure(compilerOptions) + } + + @ExperimentalKotlinGradlePluginApi + fun compilerOptions(configure: Action) { + configure.execute(compilerOptions) + } } private fun sanitizeFileName(candidate: String): String = candidate.filter { it.isLetterOrDigit() }