Fix toolchain jdk override was not working for all modules.

Now it also considers the case when separate tasks toolchain
are configured or module only has java toolchain.

^KT-46972 Fixed
This commit is contained in:
Yahor Berdnikau
2021-07-05 21:14:43 +02:00
parent 70ca222806
commit 1bd0607b53
4 changed files with 78 additions and 18 deletions
+72 -4
View File
@@ -1,5 +1,6 @@
@file:JvmName("JvmToolchain")
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.jvm.toolchain.*
@@ -24,24 +25,31 @@ enum class JdkMajorVersion(
JDK_16(16, mandatory = false);
fun isMandatory(): Boolean = mandatory
companion object {
fun fromMajorVersion(majorVersion: Int) = values().first { it.majorVersion == majorVersion }
}
}
fun Project.configureJvmDefaultToolchain() {
configureJvmToolchain(JdkMajorVersion.JDK_1_8)
}
fun Project.shouldOverrideObsoleteJdk(
jdkVersion: JdkMajorVersion
): Boolean = kotlinBuildProperties.isObsoleteJdkOverrideEnabled &&
jdkVersion.overrideMajorVersion != null
fun Project.configureJvmToolchain(
jdkVersion: JdkMajorVersion
) {
plugins.withId("org.jetbrains.kotlin.jvm") {
val kotlinExtension = extensions.getByType<KotlinTopLevelExtension>()
if (project.kotlinBuildProperties.isObsoleteJdkOverrideEnabled &&
jdkVersion.overrideMajorVersion != null
) {
if (shouldOverrideObsoleteJdk(jdkVersion)) {
kotlinExtension.jvmToolchain {
(this as JavaToolchainSpec).languageVersion
.set(JavaLanguageVersion.of(jdkVersion.overrideMajorVersion))
.set(JavaLanguageVersion.of(jdkVersion.overrideMajorVersion!!))
}
updateJvmTarget(jdkVersion.targetName)
} else {
@@ -66,6 +74,66 @@ fun Project.configureJvmToolchain(
}
}
fun Project.configureJavaOnlyToolchain(
jdkVersion: JdkMajorVersion
) {
plugins.withId("java-library") {
val javaExtension = extensions.getByType<JavaPluginExtension>()
if (shouldOverrideObsoleteJdk(jdkVersion)) {
javaExtension.toolchain.languageVersion.set(
JavaLanguageVersion.of(jdkVersion.overrideMajorVersion!!)
)
tasks.withType<JavaCompile>().configureEach {
targetCompatibility = jdkVersion.targetName
sourceCompatibility = jdkVersion.targetName
}
} else {
javaExtension.toolchain.languageVersion.set(
JavaLanguageVersion.of(jdkVersion.majorVersion)
)
}
}
}
fun KotlinCompile.configureTaskToolchain(
jdkVersion: JdkMajorVersion
) {
if (project.shouldOverrideObsoleteJdk(jdkVersion)) {
kotlinJavaToolchain.toolchain.use(
project.getToolchainLauncherFor(
JdkMajorVersion.fromMajorVersion(
jdkVersion.overrideMajorVersion!!
)
)
)
kotlinOptions {
jvmTarget = jdkVersion.targetName
}
} else {
kotlinJavaToolchain.toolchain.use(
project.getToolchainLauncherFor(jdkVersion)
)
}
}
fun JavaCompile.configureTaskToolchain(
jdkVersion: JdkMajorVersion
) {
if (project.shouldOverrideObsoleteJdk(jdkVersion)) {
javaCompiler.set(
project.getToolchainCompilerFor(
JdkMajorVersion.fromMajorVersion(
jdkVersion.overrideMajorVersion!!
)
)
)
targetCompatibility = jdkVersion.targetName
sourceCompatibility = jdkVersion.targetName
} else {
javaCompiler.set(project.getToolchainCompilerFor(jdkVersion))
}
}
fun Project.updateJvmTarget(
jvmTarget: String
) {
+1 -5
View File
@@ -7,11 +7,7 @@ plugins {
// This module does not apply Kotlin plugin, so we are setting toolchain via
// java extension
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(6))
}
}
configureJavaOnlyToolchain(JdkMajorVersion.JDK_1_6)
val kotlinVersion: String by rootProject.extra
+4 -4
View File
@@ -1,4 +1,4 @@
import org.jetbrains.kotlin.gradle.tasks.UsesKotlinJavaToolchain
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm")
@@ -8,15 +8,15 @@ plugins {
// Only compilation tasks should use JDK 1.6
project.disableDeprecatedJvmTargetWarning()
tasks
.matching { it.name == "compileKotlin" && it is UsesKotlinJavaToolchain }
.matching { it.name == "compileKotlin" && it is KotlinCompile }
.configureEach {
(this as UsesKotlinJavaToolchain).kotlinJavaToolchain.toolchain.use(project.getToolchainLauncherFor(JdkMajorVersion.JDK_1_6))
(this as KotlinCompile).configureTaskToolchain(JdkMajorVersion.JDK_1_6)
}
tasks
.matching { it.name == "compileJava" && it is JavaCompile }
.configureEach {
(this as JavaCompile).javaCompiler.set(project.getToolchainCompilerFor(JdkMajorVersion.JDK_1_6))
(this as JavaCompile).configureTaskToolchain(JdkMajorVersion.JDK_1_6)
}
dependencies {
+1 -5
View File
@@ -20,11 +20,7 @@ plugins {
java
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(6))
}
}
configureJavaOnlyToolchain(JdkMajorVersion.JDK_1_6)
publish()