Expose task input to control jvm target validation mode
^KT-56971 Fixed
This commit is contained in:
committed by
Space Team
parent
861e9392de
commit
50f5fadfd8
@@ -563,6 +563,14 @@ public final class org/jetbrains/kotlin/gradle/dsl/KotlinVersion$Companion {
|
|||||||
public final fun getDEFAULT ()Lorg/jetbrains/kotlin/gradle/dsl/KotlinVersion;
|
public final fun getDEFAULT ()Lorg/jetbrains/kotlin/gradle/dsl/KotlinVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class org/jetbrains/kotlin/gradle/dsl/jvm/JvmTargetValidationMode : java/lang/Enum {
|
||||||
|
public static final field ERROR Lorg/jetbrains/kotlin/gradle/dsl/jvm/JvmTargetValidationMode;
|
||||||
|
public static final field IGNORE Lorg/jetbrains/kotlin/gradle/dsl/jvm/JvmTargetValidationMode;
|
||||||
|
public static final field WARNING Lorg/jetbrains/kotlin/gradle/dsl/jvm/JvmTargetValidationMode;
|
||||||
|
public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/dsl/jvm/JvmTargetValidationMode;
|
||||||
|
public static fun values ()[Lorg/jetbrains/kotlin/gradle/dsl/jvm/JvmTargetValidationMode;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract class org/jetbrains/kotlin/gradle/plugin/AbstractCompileWithDependenciesTracking : org/gradle/api/tasks/compile/AbstractCompile {
|
public abstract class org/jetbrains/kotlin/gradle/plugin/AbstractCompileWithDependenciesTracking : org/gradle/api/tasks/compile/AbstractCompile {
|
||||||
public fun <init> ()V
|
public fun <init> ()V
|
||||||
public fun isDependentTaskOutOfDate (Lorg/gradle/api/Task;)Z
|
public fun isDependentTaskOutOfDate (Lorg/gradle/api/Task;)Z
|
||||||
@@ -1607,6 +1615,7 @@ public final class org/jetbrains/kotlin/gradle/tasks/KotlinJavaToolchain$JdkSett
|
|||||||
}
|
}
|
||||||
|
|
||||||
public abstract interface class org/jetbrains/kotlin/gradle/tasks/KotlinJvmCompile : org/jetbrains/kotlin/gradle/dsl/KotlinCompile, org/jetbrains/kotlin/gradle/tasks/BaseKotlinCompile, org/jetbrains/kotlin/gradle/tasks/KotlinCompilationTask {
|
public abstract interface class org/jetbrains/kotlin/gradle/tasks/KotlinJvmCompile : org/jetbrains/kotlin/gradle/dsl/KotlinCompile, org/jetbrains/kotlin/gradle/tasks/BaseKotlinCompile, org/jetbrains/kotlin/gradle/tasks/KotlinCompilationTask {
|
||||||
|
public abstract fun getJvmTargetValidationMode ()Lorg/gradle/api/provider/Property;
|
||||||
public abstract fun getModuleName ()Lorg/gradle/api/provider/Property;
|
public abstract fun getModuleName ()Lorg/gradle/api/provider/Property;
|
||||||
public abstract fun getParentKotlinOptions ()Lorg/gradle/api/provider/Property;
|
public abstract fun getParentKotlinOptions ()Lorg/gradle/api/provider/Property;
|
||||||
}
|
}
|
||||||
|
|||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* 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.dsl.jvm
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controls JVM target validation mode between Kotlin JVM compilation task from this plugin and related Java compilation task from Gradle.
|
||||||
|
*
|
||||||
|
* See [org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile.jvmTargetValidationMode] for more details.
|
||||||
|
*
|
||||||
|
* @since 1.9.0
|
||||||
|
*/
|
||||||
|
enum class JvmTargetValidationMode {
|
||||||
|
/**
|
||||||
|
* Ignores JVM target mismatches and proceeds with compilation.
|
||||||
|
*/
|
||||||
|
IGNORE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Produces a warning message in the console output on JVM target mismatch and proceeds with compilation.
|
||||||
|
*/
|
||||||
|
WARNING,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an exception on JVM target mismatch and stops execution.
|
||||||
|
*/
|
||||||
|
ERROR,
|
||||||
|
}
|
||||||
+23
@@ -16,6 +16,7 @@ import org.gradle.api.tasks.util.PatternFilterable
|
|||||||
import org.gradle.work.Incremental
|
import org.gradle.work.Incremental
|
||||||
import org.gradle.work.NormalizeLineEndings
|
import org.gradle.work.NormalizeLineEndings
|
||||||
import org.jetbrains.kotlin.gradle.dsl.*
|
import org.jetbrains.kotlin.gradle.dsl.*
|
||||||
|
import org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode
|
||||||
import org.jetbrains.kotlin.gradle.plugin.CompilerPluginConfig
|
import org.jetbrains.kotlin.gradle.plugin.CompilerPluginConfig
|
||||||
|
|
||||||
interface KotlinCompileTool : PatternFilterable, Task {
|
interface KotlinCompileTool : PatternFilterable, Task {
|
||||||
@@ -96,6 +97,28 @@ interface KotlinJvmCompile : BaseKotlinCompile,
|
|||||||
replaceWith = ReplaceWith("compilerOptions")
|
replaceWith = ReplaceWith("compilerOptions")
|
||||||
)
|
)
|
||||||
val parentKotlinOptions: Property<KotlinJvmOptionsDeprecated>
|
val parentKotlinOptions: Property<KotlinJvmOptionsDeprecated>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controls JVM target validation mode between this task and the Java compilation task from Gradle for the same source set.
|
||||||
|
*
|
||||||
|
* The same JVM targets ensure that the produced jar file contains class files of the same JVM bytecode version,
|
||||||
|
* which is important to avoid compatibility issues for the code consumers.
|
||||||
|
*
|
||||||
|
* Also, Gradle Java compilation task [org.gradle.api.tasks.compile.JavaCompile.targetCompatibility] controls value
|
||||||
|
* of "org.gradle.jvm.version" [attribute](https://docs.gradle.org/current/javadoc/org/gradle/api/attributes/java/TargetJvmVersion.html)
|
||||||
|
* which itself controls the produced artifact minimal supported JVM version via
|
||||||
|
* [Gradle Module Metadata](https://docs.gradle.org/current/userguide/publishing_gradle_module_metadata.html).
|
||||||
|
* This allows Gradle to check compatibility of dependencies at dependency resolution time.
|
||||||
|
*
|
||||||
|
* To avoid problems with different targets we advise to use [JDK Toolchain](https://kotl.in/gradle/jvm/toolchain) feature.
|
||||||
|
*
|
||||||
|
* Default value for builds with Gradle <8.0 is [JvmTargetValidationMode.WARNING],
|
||||||
|
* while for builds with Gradle 8.0+ it is [JvmTargetValidationMode.ERROR].
|
||||||
|
*
|
||||||
|
* @since 1.9.0
|
||||||
|
*/
|
||||||
|
@get:Input
|
||||||
|
val jvmTargetValidationMode: Property<JvmTargetValidationMode>
|
||||||
}
|
}
|
||||||
|
|
||||||
interface KaptGenerateStubs : KotlinJvmCompile {
|
interface KaptGenerateStubs : KotlinJvmCompile {
|
||||||
|
|||||||
+39
@@ -51,6 +51,45 @@ class JvmTargetValidationTest : KGPBaseTest() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@DisplayName("Should allow to override validation mode for specific task")
|
||||||
|
@GradleTest
|
||||||
|
internal fun overrideModeForTask(gradleVersion: GradleVersion) {
|
||||||
|
project(
|
||||||
|
projectName = "kotlinJavaProject".fullProjectName,
|
||||||
|
gradleVersion = gradleVersion,
|
||||||
|
buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.WARN)
|
||||||
|
) {
|
||||||
|
setJavaCompilationCompatibility(JavaVersion.VERSION_1_8)
|
||||||
|
useToolchainToCompile(11)
|
||||||
|
|
||||||
|
gradleProperties.append(
|
||||||
|
"""
|
||||||
|
kotlin.jvm.target.validation.mode = error
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
|
||||||
|
buildGradle.appendText(
|
||||||
|
//language=groovy
|
||||||
|
"""
|
||||||
|
|
|
||||||
|
|tasks.named("compileKotlin", org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile.class) {
|
||||||
|
| jvmTargetValidationMode.set(org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode.IGNORE)
|
||||||
|
|}
|
||||||
|
""".trimMargin()
|
||||||
|
)
|
||||||
|
|
||||||
|
build("assemble") {
|
||||||
|
assertOutputDoesNotContain(
|
||||||
|
"'compileJava' task (current target is 1.8) and 'compileKotlin' task (current target is 11) jvm target compatibility " +
|
||||||
|
"should be set to the same Java version.\n" +
|
||||||
|
"By default will become an error since Gradle 8.0+! " +
|
||||||
|
"Read more: https://kotl.in/gradle/jvm/target-validation\n" +
|
||||||
|
"Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@DisplayName("Should warn in the build log if verification mode is 'warning' and kotlin and java targets are different")
|
@DisplayName("Should warn in the build log if verification mode is 'warning' and kotlin and java targets are different")
|
||||||
@GradleTest
|
@GradleTest
|
||||||
internal fun shouldWarnBuildIfJavaAndKotlinJvmTargetsAreDifferent(gradleVersion: GradleVersion) {
|
internal fun shouldWarnBuildIfJavaAndKotlinJvmTargetsAreDifferent(gradleVersion: GradleVersion) {
|
||||||
|
|||||||
+1
-4
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.cli.common.CompilerSystemProperties
|
|||||||
import org.jetbrains.kotlin.cli.common.toBooleanLenient
|
import org.jetbrains.kotlin.cli.common.toBooleanLenient
|
||||||
import org.jetbrains.kotlin.gradle.dsl.NativeCacheKind
|
import org.jetbrains.kotlin.gradle.dsl.NativeCacheKind
|
||||||
import org.jetbrains.kotlin.gradle.dsl.NativeCacheOrchestration
|
import org.jetbrains.kotlin.gradle.dsl.NativeCacheOrchestration
|
||||||
|
import org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode
|
||||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessageOutputStreamHandler.Companion.IGNORE_TCSM_OVERFLOW
|
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessageOutputStreamHandler.Companion.IGNORE_TCSM_OVERFLOW
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.Companion.jsCompilerProperty
|
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.Companion.jsCompilerProperty
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_JS_STDLIB_DOM_API_INCLUDED
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_JS_STDLIB_DOM_API_INCLUDED
|
||||||
@@ -479,10 +480,6 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
val kotlinOptionsSuppressFreeArgsModificationWarning: Boolean
|
val kotlinOptionsSuppressFreeArgsModificationWarning: Boolean
|
||||||
get() = booleanProperty(PropertyNames.KOTLIN_OPTIONS_SUPPRESS_FREEARGS_MODIFICATION_WARNING) ?: false
|
get() = booleanProperty(PropertyNames.KOTLIN_OPTIONS_SUPPRESS_FREEARGS_MODIFICATION_WARNING) ?: false
|
||||||
|
|
||||||
enum class JvmTargetValidationMode {
|
|
||||||
IGNORE, WARNING, ERROR
|
|
||||||
}
|
|
||||||
|
|
||||||
val jvmTargetValidationMode: JvmTargetValidationMode
|
val jvmTargetValidationMode: JvmTargetValidationMode
|
||||||
get() = enumProperty(
|
get() = enumProperty(
|
||||||
"kotlin.jvm.target.validation.mode",
|
"kotlin.jvm.target.validation.mode",
|
||||||
|
|||||||
+7
-7
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.config.JvmTarget
|
|||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions
|
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsHelper
|
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsHelper
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
|
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
|
||||||
|
import org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode
|
||||||
import org.jetbrains.kotlin.gradle.dsl.usesK2
|
import org.jetbrains.kotlin.gradle.dsl.usesK2
|
||||||
import org.jetbrains.kotlin.gradle.internal.tasks.allOutputFiles
|
import org.jetbrains.kotlin.gradle.internal.tasks.allOutputFiles
|
||||||
import org.jetbrains.kotlin.gradle.logging.GradleErrorMessageCollector
|
import org.jetbrains.kotlin.gradle.logging.GradleErrorMessageCollector
|
||||||
@@ -39,7 +40,6 @@ import org.jetbrains.kotlin.gradle.logging.GradlePrintingMessageCollector
|
|||||||
import org.jetbrains.kotlin.gradle.logging.kotlinDebug
|
import org.jetbrains.kotlin.gradle.logging.kotlinDebug
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer
|
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.create
|
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.create
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
|
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
|
||||||
import org.jetbrains.kotlin.gradle.report.BuildReportMode
|
import org.jetbrains.kotlin.gradle.report.BuildReportMode
|
||||||
import org.jetbrains.kotlin.gradle.tasks.internal.KotlinJvmOptionsCompat
|
import org.jetbrains.kotlin.gradle.tasks.internal.KotlinJvmOptionsCompat
|
||||||
@@ -165,9 +165,6 @@ abstract class KotlinCompile @Inject constructor(
|
|||||||
@get:Internal
|
@get:Internal
|
||||||
internal abstract val associatedJavaCompileTaskName: Property<String>
|
internal abstract val associatedJavaCompileTaskName: Property<String>
|
||||||
|
|
||||||
@get:Input
|
|
||||||
internal abstract val jvmTargetValidationMode: Property<PropertiesProvider.JvmTargetValidationMode>
|
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal val nagTaskModuleNameUsage: Property<Boolean> = objectFactory.propertyWithConvention(false)
|
internal val nagTaskModuleNameUsage: Property<Boolean> = objectFactory.propertyWithConvention(false)
|
||||||
|
|
||||||
@@ -368,6 +365,9 @@ abstract class KotlinCompile @Inject constructor(
|
|||||||
private fun validateKotlinAndJavaHasSameTargetCompatibility(
|
private fun validateKotlinAndJavaHasSameTargetCompatibility(
|
||||||
args: K2JVMCompilerArguments,
|
args: K2JVMCompilerArguments,
|
||||||
) {
|
) {
|
||||||
|
val jvmTargetValidationMode: JvmTargetValidationMode = jvmTargetValidationMode.get()
|
||||||
|
if (jvmTargetValidationMode == JvmTargetValidationMode.IGNORE) return
|
||||||
|
|
||||||
associatedJavaCompileTaskTargetCompatibility.orNull?.let { targetCompatibility ->
|
associatedJavaCompileTaskTargetCompatibility.orNull?.let { targetCompatibility ->
|
||||||
val normalizedJavaTarget = when (targetCompatibility) {
|
val normalizedJavaTarget = when (targetCompatibility) {
|
||||||
"6" -> "1.6"
|
"6" -> "1.6"
|
||||||
@@ -392,9 +392,9 @@ abstract class KotlinCompile @Inject constructor(
|
|||||||
appendLine("Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain")
|
appendLine("Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain")
|
||||||
}
|
}
|
||||||
|
|
||||||
when (jvmTargetValidationMode.get()) {
|
when (jvmTargetValidationMode) {
|
||||||
PropertiesProvider.JvmTargetValidationMode.ERROR -> throw GradleException(errorMessage)
|
JvmTargetValidationMode.ERROR -> throw GradleException(errorMessage)
|
||||||
PropertiesProvider.JvmTargetValidationMode.WARNING -> logger.warn(errorMessage)
|
JvmTargetValidationMode.WARNING -> logger.warn(errorMessage)
|
||||||
else -> Unit
|
else -> Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ internal open class BaseKotlinCompileConfig<TASK : KotlinCompile> : AbstractKotl
|
|||||||
taskProvider.configure { task ->
|
taskProvider.configure { task ->
|
||||||
task.incremental = propertiesProvider.incrementalJvm ?: true
|
task.incremental = propertiesProvider.incrementalJvm ?: true
|
||||||
task.usePreciseJavaTracking = propertiesProvider.usePreciseJavaTracking ?: true
|
task.usePreciseJavaTracking = propertiesProvider.usePreciseJavaTracking ?: true
|
||||||
task.jvmTargetValidationMode.set(propertiesProvider.jvmTargetValidationMode)
|
task.jvmTargetValidationMode.convention(propertiesProvider.jvmTargetValidationMode).finalizeValueOnRead()
|
||||||
task.useKotlinAbiSnapshot.value(propertiesProvider.useKotlinAbiSnapshot).disallowChanges()
|
task.useKotlinAbiSnapshot.value(propertiesProvider.useKotlinAbiSnapshot).disallowChanges()
|
||||||
|
|
||||||
task.classpathSnapshotProperties.useClasspathSnapshot.value(useClasspathSnapshot).disallowChanges()
|
task.classpathSnapshotProperties.useClasspathSnapshot.value(useClasspathSnapshot).disallowChanges()
|
||||||
|
|||||||
Reference in New Issue
Block a user