diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilationFactory.kt index da252ced671..ea9b8ec2d9f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilationFactory.kt @@ -6,7 +6,9 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.* 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.KotlinCompilationSourceSetInclusion import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetsContainer import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.DefaultKotlinCompilationDependencyConfigurationsFactory @@ -43,7 +45,11 @@ class KotlinCommonCompilationFactory internal constructor( Metadata compilations are created *because* of a pre-existing SourceSet. We therefore can create the container inline */ - compilationSourceSetsContainerFactory = { _, _ -> KotlinCompilationSourceSetsContainer(defaultSourceSet) } + compilationSourceSetsContainerFactory = { _, _ -> KotlinCompilationSourceSetsContainer(defaultSourceSet) }, + postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite( + DefaultKotlinCompilationPostConfigure, + KotlinCompilationCommonCompilerOptionsFromTargetConfigurator(target.compilerOptions) + ) ) override fun create(name: String): KotlinCommonCompilation = target.project.objects.newInstance( diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataTarget.kt index 3bdf5a01d75..9a246d74e9e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataTarget.kt @@ -5,12 +5,17 @@ package org.jetbrains.kotlin.gradle.plugin.mpp +import org.gradle.api.Action import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptionsDefault import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinTargetComponent import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled +import org.jetbrains.kotlin.gradle.utils.newInstance import javax.inject.Inject abstract class KotlinMetadataTarget @Inject constructor( @@ -30,7 +35,21 @@ abstract class KotlinMetadataTarget @Inject constructor( Metadata Target does not have a KotlinTargetComponent on it's own. Responsibility is shifted to the root KotlinSoftwareComponent */ - emptySet() + emptySet() + } + + @ExperimentalKotlinGradlePluginApi + override val compilerOptions: KotlinCommonCompilerOptions = project.objects + .newInstance() + + @ExperimentalKotlinGradlePluginApi + fun compilerOptions(configure: KotlinCommonCompilerOptions.() -> 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/plugin/mpp/compilationImpl/KotlinCompilationCompilerOptionsConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationCompilerOptionsConfigurator.kt index 72b357bc8a5..76a60c15340 100644 --- 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 @@ -68,3 +68,15 @@ internal class KotlinCompilationJsCompilerOptionsFromTargetConfigurator( ) } } + +internal class KotlinCompilationCommonCompilerOptionsFromTargetConfigurator( + private val targetCompilerOptions: KotlinCommonCompilerOptions +) : KotlinCompilationImplFactory.PostConfigure { + override fun configure(compilation: DecoratedKotlinCompilation<*>) { + val commonCompilerOptions = compilation.compilerOptions.options + KotlinCommonCompilerOptionsHelper.syncOptionsAsConvention( + targetCompilerOptions, + commonCompilerOptions + ) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinSharedNativeCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinSharedNativeCompilationFactory.kt index 01af46abe90..c4ca0ae844c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinSharedNativeCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinSharedNativeCompilationFactory.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.* import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetInclusion import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetsContainer @@ -17,7 +18,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinNati import org.jetbrains.kotlin.konan.target.KonanTarget open class KotlinSharedNativeCompilationFactory internal constructor( - override val target: KotlinMetadataTarget, + final override val target: KotlinMetadataTarget, private val konanTargets: Set, private val defaultSourceSet: KotlinSourceSet ) : KotlinCompilationFactory { @@ -51,10 +52,13 @@ open class KotlinSharedNativeCompilationFactory internal constructor( Metadata compilations are created *because* of a pre-existing SourceSet. We therefore can create the container inline */ - compilationSourceSetsContainerFactory = { _, _ -> KotlinCompilationSourceSetsContainer(defaultSourceSet) } + compilationSourceSetsContainerFactory = { _, _ -> KotlinCompilationSourceSetsContainer(defaultSourceSet) }, + postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite( + DefaultKotlinCompilationPostConfigure, + KotlinCompilationCommonCompilerOptionsFromTargetConfigurator(target.compilerOptions) + ) ) - @Suppress("DEPRECATION") override fun create(name: String): KotlinSharedNativeCompilation { return target.project.objects.newInstance( itemClass, konanTargets.toList(), compilationImplFactory.create(target, name) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ProjectCompilerOptionsTests.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ProjectCompilerOptionsTests.kt index 96b81b3ab3e..89a9b00a0a8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ProjectCompilerOptionsTests.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ProjectCompilerOptionsTests.kt @@ -6,9 +6,11 @@ package org.jetbrains.kotlin.gradle.unitTests import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptions import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask import org.jetbrains.kotlin.gradle.tasks.withType import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP @@ -120,6 +122,58 @@ class ProjectCompilerOptionsTests { assertEquals(false, project.kotlinJsTask("compileKotlinJs").compilerOptions.suppressWarnings.get()) } + @Test + fun metadataTargetDsl() { + val project = buildProjectWithMPP { + with(multiplatformExtension) { + linuxX64() + iosX64() + iosArm64() + + targets.named("metadata", KotlinMetadataTarget::class.java) { + it.compilerOptions { + progressiveMode.set(true) + } + } + + applyDefaultHierarchyTemplate() + } + } + + project.evaluate() + + assertEquals(true, project.kotlinCommonTask("compileKotlinMetadata").compilerOptions.progressiveMode.get()) + } + + @Test + fun metadataTaskOptionsOverrideTargetOptions() { + val project = buildProjectWithMPP { + tasks.withType>().configureEach { + if (it.name == "compileKotlinMetadata") { + it.compilerOptions.progressiveMode.set(false) + } + } + + with(multiplatformExtension) { + linuxX64() + iosX64() + iosArm64() + + targets.named("metadata", KotlinMetadataTarget::class.java) { + it.compilerOptions { + progressiveMode.set(true) + } + } + + applyDefaultHierarchyTemplate() + } + } + + project.evaluate() + + assertEquals(false, project.kotlinCommonTask("compileKotlinMetadata").compilerOptions.progressiveMode.get()) + } + private fun Project.kotlinNativeTask(name: String): KotlinCompilationTask = tasks .named>(name) .get() @@ -127,4 +181,8 @@ class ProjectCompilerOptionsTests { private fun Project.kotlinJsTask(name: String): KotlinCompilationTask = tasks .named>(name) .get() + + private fun Project.kotlinCommonTask(name: String): KotlinCompilationTask = tasks + .named>(name) + .get() } \ No newline at end of file