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") @file:JvmName("JvmToolchain")
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.provider.Provider import org.gradle.api.provider.Provider
import org.gradle.api.tasks.compile.JavaCompile import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.jvm.toolchain.* import org.gradle.jvm.toolchain.*
@@ -24,24 +25,31 @@ enum class JdkMajorVersion(
JDK_16(16, mandatory = false); JDK_16(16, mandatory = false);
fun isMandatory(): Boolean = mandatory fun isMandatory(): Boolean = mandatory
companion object {
fun fromMajorVersion(majorVersion: Int) = values().first { it.majorVersion == majorVersion }
}
} }
fun Project.configureJvmDefaultToolchain() { fun Project.configureJvmDefaultToolchain() {
configureJvmToolchain(JdkMajorVersion.JDK_1_8) configureJvmToolchain(JdkMajorVersion.JDK_1_8)
} }
fun Project.shouldOverrideObsoleteJdk(
jdkVersion: JdkMajorVersion
): Boolean = kotlinBuildProperties.isObsoleteJdkOverrideEnabled &&
jdkVersion.overrideMajorVersion != null
fun Project.configureJvmToolchain( fun Project.configureJvmToolchain(
jdkVersion: JdkMajorVersion jdkVersion: JdkMajorVersion
) { ) {
plugins.withId("org.jetbrains.kotlin.jvm") { plugins.withId("org.jetbrains.kotlin.jvm") {
val kotlinExtension = extensions.getByType<KotlinTopLevelExtension>() val kotlinExtension = extensions.getByType<KotlinTopLevelExtension>()
if (project.kotlinBuildProperties.isObsoleteJdkOverrideEnabled && if (shouldOverrideObsoleteJdk(jdkVersion)) {
jdkVersion.overrideMajorVersion != null
) {
kotlinExtension.jvmToolchain { kotlinExtension.jvmToolchain {
(this as JavaToolchainSpec).languageVersion (this as JavaToolchainSpec).languageVersion
.set(JavaLanguageVersion.of(jdkVersion.overrideMajorVersion)) .set(JavaLanguageVersion.of(jdkVersion.overrideMajorVersion!!))
} }
updateJvmTarget(jdkVersion.targetName) updateJvmTarget(jdkVersion.targetName)
} else { } 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( fun Project.updateJvmTarget(
jvmTarget: String jvmTarget: String
) { ) {
+1 -5
View File
@@ -7,11 +7,7 @@ plugins {
// This module does not apply Kotlin plugin, so we are setting toolchain via // This module does not apply Kotlin plugin, so we are setting toolchain via
// java extension // java extension
java { configureJavaOnlyToolchain(JdkMajorVersion.JDK_1_6)
toolchain {
languageVersion.set(JavaLanguageVersion.of(6))
}
}
val kotlinVersion: String by rootProject.extra 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 { plugins {
kotlin("jvm") kotlin("jvm")
@@ -8,15 +8,15 @@ plugins {
// Only compilation tasks should use JDK 1.6 // Only compilation tasks should use JDK 1.6
project.disableDeprecatedJvmTargetWarning() project.disableDeprecatedJvmTargetWarning()
tasks tasks
.matching { it.name == "compileKotlin" && it is UsesKotlinJavaToolchain } .matching { it.name == "compileKotlin" && it is KotlinCompile }
.configureEach { .configureEach {
(this as UsesKotlinJavaToolchain).kotlinJavaToolchain.toolchain.use(project.getToolchainLauncherFor(JdkMajorVersion.JDK_1_6)) (this as KotlinCompile).configureTaskToolchain(JdkMajorVersion.JDK_1_6)
} }
tasks tasks
.matching { it.name == "compileJava" && it is JavaCompile } .matching { it.name == "compileJava" && it is JavaCompile }
.configureEach { .configureEach {
(this as JavaCompile).javaCompiler.set(project.getToolchainCompilerFor(JdkMajorVersion.JDK_1_6)) (this as JavaCompile).configureTaskToolchain(JdkMajorVersion.JDK_1_6)
} }
dependencies { dependencies {
+1 -5
View File
@@ -20,11 +20,7 @@ plugins {
java java
} }
java { configureJavaOnlyToolchain(JdkMajorVersion.JDK_1_6)
toolchain {
languageVersion.set(JavaLanguageVersion.of(6))
}
}
publish() publish()