[Gradle] Introduce compilerOptions for Kotlin native target

KotlinNativeTarget 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-30 22:35:46 +02:00
committed by Space Team
parent 6f394f42a6
commit a158d09768
6 changed files with 135 additions and 6 deletions
@@ -491,8 +491,7 @@ internal class CompilerOptionsIT : KGPBaseTest() {
gradleVersion = gradleVersion,
// We need to get specific task output as commonizer may run first producing
// arguments as well in output
// TODO Yahor: remove 'configurationCache = false' once it will be merged into `master` - issue due to the build reports error
buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.DEBUG, configurationCache = false)
buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.DEBUG)
) {
buildGradle.modify {
val buildScript = """
@@ -7,6 +7,8 @@ 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.dsl.KotlinNativeCompilerOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptionsHelper
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
@@ -29,3 +31,22 @@ internal class KotlinCompilationJvmCompilerOptionsFromTargetConfigurator(
)
}
}
internal class KotlinCompilationNativeCompilerOptionsFromTargetConfigurator(
private val targetCompilerOptions: KotlinNativeCompilerOptions
) : KotlinCompilationImplFactory.PostConfigure {
override fun configure(compilation: DecoratedKotlinCompilation<*>) {
val nativeCompilerOptions = compilation.compilerOptions.options as KotlinNativeCompilerOptions
KotlinNativeCompilerOptionsHelper.syncOptionsAsConvention(
targetCompilerOptions,
nativeCompilerOptions
)
nativeCompilerOptions.moduleName.convention(
moduleNameForCompilation(
compilation.compilationName,
targetCompilerOptions.moduleName
)
)
}
}
@@ -6,6 +6,8 @@
@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.KotlinCompilationNativeCompilerOptionsFromTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetInclusion
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinNativeCompilationAssociator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory
@@ -14,7 +16,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.NativeKotl
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.NativeKotlinCompilationTaskNamesContainerFactory
open class KotlinNativeCompilationFactory internal constructor(
override val target: KotlinNativeTarget
final override val target: KotlinNativeTarget
) : KotlinCompilationFactory<KotlinNativeCompilation> {
override val itemClass: Class<KotlinNativeCompilation>
@@ -29,6 +31,10 @@ open class KotlinNativeCompilationFactory internal constructor(
compilationSourceSetInclusion = KotlinCompilationSourceSetInclusion(
KotlinCompilationSourceSetInclusion.NativeAddSourcesToCompileTask
),
postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite(
DefaultKotlinCompilationPostConfigure,
KotlinCompilationNativeCompilerOptionsFromTargetConfigurator(target.compilerOptions)
)
)
override fun create(name: String): KotlinNativeCompilation {
@@ -6,14 +6,15 @@
@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
import org.gradle.api.attributes.Attribute
import org.gradle.api.plugins.BasePlugin
import org.gradle.jvm.tasks.Jar
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.sources.awaitPlatformCompilations
@@ -26,6 +27,8 @@ import org.jetbrains.kotlin.gradle.targets.native.NativeBinaryTestRunSource
import org.jetbrains.kotlin.gradle.targets.native.internal.includeCommonizedCInteropMetadata
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
import org.jetbrains.kotlin.gradle.utils.klibModuleName
import org.jetbrains.kotlin.gradle.utils.newInstance
import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
@@ -133,6 +136,27 @@ abstract class KotlinNativeTarget @Inject constructor(
override val publishable: Boolean
get() = konanTarget.enabledOnCurrentHost
@ExperimentalKotlinGradlePluginApi
override val compilerOptions: KotlinNativeCompilerOptions = project.objects
.newInstance<KotlinNativeCompilerOptionsDefault>()
.apply {
moduleName.convention(
project.klibModuleName(
project.baseModuleName()
)
)
}
@ExperimentalKotlinGradlePluginApi
fun compilerOptions(configure: KotlinNativeCompilerOptions.() -> Unit) {
configure(compilerOptions)
}
@ExperimentalKotlinGradlePluginApi
fun compilerOptions(configure: Action<KotlinNativeCompilerOptions>) {
configure.execute(compilerOptions)
}
// User-visible constants
val DEBUG = NativeBuildType.DEBUG
val RELEASE = NativeBuildType.RELEASE
@@ -404,7 +404,6 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
if (propertiesProvider.useK2 == true) {
it.compilerOptions.useK2.set(true)
}
it.compilerOptions.useK2.disallowChanges()
it.runViaBuildToolsApi.value(false).disallowChanges() // K/N is not yet supported
it.explicitApiMode
@@ -0,0 +1,80 @@
/*
* 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.unitTests
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptions
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
import org.jetbrains.kotlin.gradle.tasks.withType
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
import org.jetbrains.kotlin.gradle.utils.named
import kotlin.test.Test
import kotlin.test.assertEquals
class ProjectCompilerOptionsTests {
@Test
fun nativeTargetCompilerOptionsDSL() {
val project = buildProjectWithMPP {
with(multiplatformExtension) {
linuxX64 {
compilerOptions {
progressiveMode.set(true)
}
}
iosX64 {
compilerOptions {
suppressWarnings.set(true)
}
}
applyDefaultHierarchyTemplate()
}
}
project.evaluate()
assertEquals(true, project.kotlinNativeTask("compileKotlinLinuxX64").compilerOptions.progressiveMode.get())
assertEquals(false, project.kotlinNativeTask("compileKotlinLinuxX64").compilerOptions.suppressWarnings.get())
assertEquals(true, project.kotlinNativeTask("compileTestKotlinLinuxX64").compilerOptions.progressiveMode.get())
assertEquals(false, project.kotlinNativeTask("compileTestKotlinLinuxX64").compilerOptions.suppressWarnings.get())
assertEquals(true, project.kotlinNativeTask("compileKotlinIosX64").compilerOptions.suppressWarnings.get())
assertEquals(false, project.kotlinNativeTask("compileKotlinIosX64").compilerOptions.progressiveMode.get())
assertEquals(true, project.kotlinNativeTask("compileTestKotlinIosX64").compilerOptions.suppressWarnings.get())
assertEquals(false, project.kotlinNativeTask("compileTestKotlinIosX64").compilerOptions.progressiveMode.get())
}
@Test
fun nativeTaskOverridesTargetOptions() {
val project = buildProjectWithMPP {
tasks.withType<KotlinCompilationTask<*>>().configureEach {
if (it.name == "compileKotlinLinuxX64") {
it.compilerOptions.progressiveMode.set(false)
}
}
with(multiplatformExtension) {
linuxX64 {
compilerOptions {
progressiveMode.set(true)
}
}
applyDefaultHierarchyTemplate()
}
}
project.evaluate()
assertEquals(false, project.kotlinNativeTask("compileKotlinLinuxX64").compilerOptions.progressiveMode.get())
}
private fun Project.kotlinNativeTask(name: String): KotlinCompilationTask<KotlinNativeCompilerOptions> = tasks
.named<KotlinCompilationTask<KotlinNativeCompilerOptions>>(name)
.get()
}