[Gradle] Introduce compilerOptions for Kotlin metadata target

KotlinMetadataTarget now exposes experimental compiler options DSL that
are passed as a convention into target compilations compiler options.

^KT-57292 In Progress
This commit is contained in:
Yahor Berdnikau
2023-07-31 10:25:35 +02:00
committed by Space Team
parent a40e59306a
commit c1e26bfa47
5 changed files with 104 additions and 5 deletions
@@ -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(
@@ -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<KotlinTargetComponent>()
emptySet()
}
@ExperimentalKotlinGradlePluginApi
override val compilerOptions: KotlinCommonCompilerOptions = project.objects
.newInstance<KotlinCommonCompilerOptionsDefault>()
@ExperimentalKotlinGradlePluginApi
fun compilerOptions(configure: KotlinCommonCompilerOptions.() -> Unit) {
configure(compilerOptions)
}
@ExperimentalKotlinGradlePluginApi
fun compilerOptions(configure: Action<KotlinCommonCompilerOptions>) {
configure.execute(compilerOptions)
}
}
@@ -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
)
}
}
@@ -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<KonanTarget>,
private val defaultSourceSet: KotlinSourceSet
) : KotlinCompilationFactory<KotlinSharedNativeCompilation> {
@@ -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)
@@ -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<KotlinCompilationTask<*>>().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<KotlinNativeCompilerOptions> = tasks
.named<KotlinCompilationTask<KotlinNativeCompilerOptions>>(name)
.get()
@@ -127,4 +181,8 @@ class ProjectCompilerOptionsTests {
private fun Project.kotlinJsTask(name: String): KotlinCompilationTask<KotlinJsCompilerOptions> = tasks
.named<KotlinCompilationTask<KotlinJsCompilerOptions>>(name)
.get()
private fun Project.kotlinCommonTask(name: String): KotlinCompilationTask<KotlinCommonCompilerOptions> = tasks
.named<KotlinCompilationTask<KotlinCommonCompilerOptions>>(name)
.get()
}