Configure compilation -jvm-target also from Java toolchain spec
Correctly wire JVM toolchain spec such way that `-jvm-target` will also be configured from toolchain spec set either via java extension or kotlin extension. ^KT-50115 Fixed
This commit is contained in:
committed by
Space Team
parent
92638573ce
commit
ddc72db0de
+35
-1
@@ -441,7 +441,41 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
|
|||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
)
|
)
|
||||||
|
|
||||||
build("build")
|
build("build") {
|
||||||
|
assertOutputContains("[KOTLIN] Kotlin compilation 'jdkHome' argument: ${getJdk11Path().replace("\\\\", "\\")}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@DisplayName("Setting toolchain via java extension should update jvm-target argument on eager task creation")
|
||||||
|
@GradleTest
|
||||||
|
internal fun settingToolchainViaJavaUpdateJvmTarget(gradleVersion: GradleVersion) {
|
||||||
|
project(
|
||||||
|
projectName = "kotlinJavaProject".fullProjectName,
|
||||||
|
gradleVersion = gradleVersion
|
||||||
|
) {
|
||||||
|
//language=groovy
|
||||||
|
buildGradle.append(
|
||||||
|
"""
|
||||||
|
tasks.named("compileKotlin").get() // Trigger task eager creation
|
||||||
|
|
||||||
|
java {
|
||||||
|
toolchain {
|
||||||
|
languageVersion.set(JavaLanguageVersion.of(11))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
|
||||||
|
build("build", buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.DEBUG)) {
|
||||||
|
val compilerArgs = output.lineSequence()
|
||||||
|
.filter { it.contains(":compileKotlin Kotlin compiler args:") }
|
||||||
|
.first()
|
||||||
|
assert(compilerArgs.contains("-jvm-target 11")) {
|
||||||
|
"Kotlin compilation jvm-target argument is ${output.substringAfter("-jvm-target ").substringBefore(" ")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-10
@@ -45,28 +45,24 @@ internal abstract class DefaultToolchainSupport @Inject constructor(
|
|||||||
.toolchain
|
.toolchain
|
||||||
|
|
||||||
init {
|
init {
|
||||||
configureToolchain()
|
wireToolchainToTasks()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun applyToolchain(
|
override fun applyToolchain(
|
||||||
action: Action<JavaToolchainSpec>
|
action: Action<JavaToolchainSpec>
|
||||||
) {
|
) {
|
||||||
action.execute(toolchainSpec)
|
action.execute(toolchainSpec)
|
||||||
configureToolchain()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun configureToolchain() {
|
private fun wireToolchainToTasks() {
|
||||||
plugins.withId("org.gradle.java-base") {
|
plugins.withId("org.gradle.java-base") {
|
||||||
|
val toolchainService = extensions.findByType(JavaToolchainService::class.java)
|
||||||
|
?: error("Gradle JavaToolchainService is not available!")
|
||||||
|
val javaLauncher = toolchainService.launcherFor(toolchainSpec)
|
||||||
tasks
|
tasks
|
||||||
.withType<UsesKotlinJavaToolchain>()
|
.withType<UsesKotlinJavaToolchain>()
|
||||||
.configureEach {
|
.configureEach {
|
||||||
// Only set when toolchain is configured
|
it.kotlinJavaToolchain.toolchain.use(javaLauncher)
|
||||||
if (toolchainSpec.languageVersion.isPresent) {
|
|
||||||
val toolchainService = extensions.findByType(JavaToolchainService::class.java)!!
|
|
||||||
it.kotlinJavaToolchain.toolchain.use(
|
|
||||||
toolchainService.launcherFor(toolchainSpec)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.gradle.internal.kapt.classloaders.rootOrSelf
|
|||||||
import org.jetbrains.kotlin.gradle.internal.kapt.incremental.KaptIncrementalChanges
|
import org.jetbrains.kotlin.gradle.internal.kapt.incremental.KaptIncrementalChanges
|
||||||
import org.jetbrains.kotlin.gradle.tasks.Kapt
|
import org.jetbrains.kotlin.gradle.tasks.Kapt
|
||||||
import org.jetbrains.kotlin.gradle.tasks.toSingleCompilerPluginOptions
|
import org.jetbrains.kotlin.gradle.tasks.toSingleCompilerPluginOptions
|
||||||
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
|
|
||||||
import org.jetbrains.kotlin.gradle.utils.listPropertyWithConvention
|
import org.jetbrains.kotlin.gradle.utils.listPropertyWithConvention
|
||||||
import org.jetbrains.kotlin.utils.PathUtil
|
import org.jetbrains.kotlin.utils.PathUtil
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
@@ -94,7 +93,7 @@ abstract class KaptWithoutKotlincTask @Inject constructor(
|
|||||||
if (addJdkClassesToClasspath.get()) {
|
if (addJdkClassesToClasspath.get()) {
|
||||||
compileClasspath.addAll(
|
compileClasspath.addAll(
|
||||||
0,
|
0,
|
||||||
PathUtil.getJdkClassesRoots(defaultKotlinJavaToolchain.get().providedJvm.get().javaHome)
|
PathUtil.getJdkClassesRoots(defaultKotlinJavaToolchain.get().buildJvm.get().javaHome)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +152,7 @@ abstract class KaptWithoutKotlincTask @Inject constructor(
|
|||||||
|
|
||||||
private fun getWorkerIsolationMode(): IsolationMode {
|
private fun getWorkerIsolationMode(): IsolationMode {
|
||||||
val toolchainProvider = defaultKotlinJavaToolchain.get()
|
val toolchainProvider = defaultKotlinJavaToolchain.get()
|
||||||
val gradleJvm = toolchainProvider.currentJvm.get()
|
val gradleJvm = toolchainProvider.gradleJvm.get()
|
||||||
// Ensuring Gradle build JDK is set to kotlin toolchain by also comparing javaExecutable paths,
|
// Ensuring Gradle build JDK is set to kotlin toolchain by also comparing javaExecutable paths,
|
||||||
// as user may set JDK with same major Java version, but from different vendor
|
// as user may set JDK with same major Java version, but from different vendor
|
||||||
val isRunningOnGradleJvm = gradleJvm.javaVersion == toolchainProvider.javaVersion.get() &&
|
val isRunningOnGradleJvm = gradleJvm.javaVersion == toolchainProvider.javaVersion.get() &&
|
||||||
|
|||||||
+53
-53
@@ -16,6 +16,7 @@ import org.gradle.api.tasks.Internal
|
|||||||
import org.gradle.internal.jvm.Jvm
|
import org.gradle.internal.jvm.Jvm
|
||||||
import org.gradle.jvm.toolchain.*
|
import org.gradle.jvm.toolchain.*
|
||||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.*
|
||||||
import org.jetbrains.kotlin.gradle.utils.chainedFinalizeValueOnRead
|
import org.jetbrains.kotlin.gradle.utils.chainedFinalizeValueOnRead
|
||||||
import org.jetbrains.kotlin.gradle.utils.property
|
import org.jetbrains.kotlin.gradle.utils.property
|
||||||
import org.jetbrains.kotlin.gradle.utils.propertyWithConvention
|
import org.jetbrains.kotlin.gradle.utils.propertyWithConvention
|
||||||
@@ -26,36 +27,65 @@ import javax.inject.Inject
|
|||||||
internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
|
internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
|
||||||
private val objects: ObjectFactory,
|
private val objects: ObjectFactory,
|
||||||
projectLayout: ProjectLayout,
|
projectLayout: ProjectLayout,
|
||||||
kotlinCompileTaskProvider: () -> KotlinCompile?
|
private val kotlinCompileTaskProvider: () -> KotlinCompile?
|
||||||
) : KotlinJavaToolchain {
|
) : KotlinJavaToolchain {
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal val currentJvm: Provider<Jvm> = objects
|
internal val gradleJvm: Provider<Jvm> = objects
|
||||||
.property(Jvm.current())
|
.property(Jvm.current())
|
||||||
|
.chainedDisallowChanges()
|
||||||
.chainedFinalizeValueOnRead()
|
.chainedFinalizeValueOnRead()
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal val providedJvm: Property<Jvm> = objects
|
internal val providedJvm: Property<Jvm> = objects
|
||||||
.propertyWithConvention(currentJvm)
|
.property<Jvm>()
|
||||||
|
.chainedFinalizeValueOnRead()
|
||||||
|
|
||||||
|
@get:Internal
|
||||||
|
internal val buildJvm: Provider<Jvm> = objects
|
||||||
|
.property(providedJvm.orElse(gradleJvm))
|
||||||
|
.chainedDisallowChanges()
|
||||||
.chainedFinalizeValueOnRead()
|
.chainedFinalizeValueOnRead()
|
||||||
|
|
||||||
final override val javaVersion: Provider<JavaVersion> = objects
|
final override val javaVersion: Provider<JavaVersion> = objects
|
||||||
.property(
|
.property(
|
||||||
providedJvm.map { jvm ->
|
buildJvm
|
||||||
jvm.javaVersion
|
.map { jvm ->
|
||||||
?: throw GradleException(
|
jvm.javaVersion
|
||||||
"Kotlin could not get java version for the JDK installation: " +
|
?: throw GradleException(
|
||||||
jvm.javaHome?.let { "'$it' " }.orEmpty()
|
"Kotlin could not get java version for the JDK installation: " +
|
||||||
)
|
jvm.javaHome?.let { "'$it' " }.orEmpty()
|
||||||
}
|
)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
.chainedFinalizeValueOnRead()
|
.chainedFinalizeValueOnRead()
|
||||||
|
|
||||||
|
init {
|
||||||
|
wireJvmTargetToToolchain()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun wireJvmTargetToToolchain() {
|
||||||
|
kotlinCompileTaskProvider()?.let { task ->
|
||||||
|
task.compilerOptions.jvmTarget.convention(
|
||||||
|
providedJvm.map { jvm ->
|
||||||
|
// For Java 9 and Java 10 JavaVersion returns "1.9" or "1.10" accordingly
|
||||||
|
// that is not accepted by Kotlin compiler
|
||||||
|
val normalizedVersion = when (jvm.javaVersion) {
|
||||||
|
JavaVersion.VERSION_1_9 -> "9"
|
||||||
|
JavaVersion.VERSION_1_10 -> "10"
|
||||||
|
else -> jvm.javaVersion.toString()
|
||||||
|
}
|
||||||
|
JvmTarget.fromTarget(normalizedVersion)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal val javaExecutable: RegularFileProperty = objects
|
internal val javaExecutable: RegularFileProperty = objects
|
||||||
.fileProperty()
|
.fileProperty()
|
||||||
.value(
|
.value(
|
||||||
providedJvm.flatMap { jvm ->
|
buildJvm.flatMap { jvm ->
|
||||||
projectLayout.file(
|
projectLayout.file(
|
||||||
objects.property<File>(
|
objects.property<File>(
|
||||||
jvm.javaExecutable
|
jvm.javaExecutable
|
||||||
@@ -91,12 +121,12 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal val jdkToolsJar: Provider<File?> = getToolsJarFromJvm(providedJvm, javaVersion)
|
internal val jdkToolsJar: Provider<File?> = getToolsJarFromJvm(buildJvm, javaVersion)
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal val currentJvmJdkToolsJar: Provider<File?> = getToolsJarFromJvm(
|
internal val currentJvmJdkToolsJar: Provider<File?> = getToolsJarFromJvm(
|
||||||
currentJvm,
|
gradleJvm,
|
||||||
currentJvm.map {
|
gradleJvm.map {
|
||||||
// Current JVM should always have java version
|
// Current JVM should always have java version
|
||||||
it.javaVersion!!
|
it.javaVersion!!
|
||||||
}
|
}
|
||||||
@@ -104,42 +134,16 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
|
|||||||
|
|
||||||
final override val jdk: KotlinJavaToolchain.JdkSetter = DefaultJdkSetter(
|
final override val jdk: KotlinJavaToolchain.JdkSetter = DefaultJdkSetter(
|
||||||
providedJvm,
|
providedJvm,
|
||||||
objects,
|
objects
|
||||||
kotlinCompileTaskProvider
|
|
||||||
)
|
)
|
||||||
|
|
||||||
final override val toolchain: KotlinJavaToolchain.JavaToolchainSetter =
|
final override val toolchain: KotlinJavaToolchain.JavaToolchainSetter =
|
||||||
DefaultJavaToolchainSetter(providedJvm, kotlinCompileTaskProvider)
|
DefaultJavaToolchainSetter(providedJvm)
|
||||||
|
|
||||||
private abstract class JvmTargetUpdater(
|
private class DefaultJdkSetter(
|
||||||
private val kotlinCompileTaskProvider: () -> KotlinCompile?
|
|
||||||
) {
|
|
||||||
fun updateJvmTarget(
|
|
||||||
jdkVersion: Provider<JavaVersion>
|
|
||||||
) {
|
|
||||||
kotlinCompileTaskProvider()?.let { task ->
|
|
||||||
task.compilerOptions.jvmTarget.convention(
|
|
||||||
jdkVersion.map { version ->
|
|
||||||
// For Java 9 and Java 10 JavaVersion returns "1.9" or "1.10" accordingly
|
|
||||||
// that is not accepted by Kotlin compiler
|
|
||||||
val normalizedVersion = when (version) {
|
|
||||||
JavaVersion.VERSION_1_9 -> "9"
|
|
||||||
JavaVersion.VERSION_1_10 -> "10"
|
|
||||||
else -> version.toString()
|
|
||||||
}
|
|
||||||
JvmTarget.fromTarget(normalizedVersion)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private inner class DefaultJdkSetter(
|
|
||||||
private val providedJvm: Property<Jvm>,
|
private val providedJvm: Property<Jvm>,
|
||||||
private val objects: ObjectFactory,
|
private val objects: ObjectFactory,
|
||||||
kotlinCompileTaskProvider: () -> KotlinCompile?
|
) : KotlinJavaToolchain.JdkSetter {
|
||||||
) : JvmTargetUpdater(kotlinCompileTaskProvider),
|
|
||||||
KotlinJavaToolchain.JdkSetter {
|
|
||||||
|
|
||||||
override fun use(
|
override fun use(
|
||||||
jdkHomeLocation: File,
|
jdkHomeLocation: File,
|
||||||
@@ -152,7 +156,6 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
|
|||||||
"Supplied jdkHomeLocation does not exist. You supplied: $jdkHomeLocation"
|
"Supplied jdkHomeLocation does not exist. You supplied: $jdkHomeLocation"
|
||||||
}
|
}
|
||||||
|
|
||||||
updateJvmTarget(javaVersion)
|
|
||||||
providedJvm.set(
|
providedJvm.set(
|
||||||
objects.providerWithLazyConvention {
|
objects.providerWithLazyConvention {
|
||||||
Jvm.discovered(jdkHomeLocation, null, jdkVersion)
|
Jvm.discovered(jdkHomeLocation, null, jdkVersion)
|
||||||
@@ -161,18 +164,15 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class DefaultJavaToolchainSetter(
|
private class DefaultJavaToolchainSetter(
|
||||||
private val providedJvm: Property<Jvm>,
|
private val providedJvm: Property<Jvm>
|
||||||
kotlinCompileTaskProvider: () -> KotlinCompile?
|
) : KotlinJavaToolchain.JavaToolchainSetter {
|
||||||
) : JvmTargetUpdater(kotlinCompileTaskProvider),
|
|
||||||
KotlinJavaToolchain.JavaToolchainSetter {
|
|
||||||
override fun use(
|
override fun use(
|
||||||
javaLauncher: Provider<JavaLauncher>
|
javaLauncher: Provider<JavaLauncher>
|
||||||
) {
|
) {
|
||||||
updateJvmTarget(javaVersion)
|
|
||||||
providedJvm.set(
|
providedJvm.set(
|
||||||
javaLauncher.map {
|
javaLauncher.map { launcher ->
|
||||||
val metadata = javaLauncher.get().metadata
|
val metadata = launcher.metadata
|
||||||
val javaVersion = JavaVersion.toVersion(metadata.languageVersion.asInt())
|
val javaVersion = JavaVersion.toVersion(metadata.languageVersion.asInt())
|
||||||
Jvm.discovered(
|
Jvm.discovered(
|
||||||
metadata.installationPath.asFile,
|
metadata.installationPath.asFile,
|
||||||
|
|||||||
+1
-1
@@ -773,7 +773,7 @@ abstract class KotlinCompile @Inject constructor(
|
|||||||
javaPackagePrefix,
|
javaPackagePrefix,
|
||||||
args,
|
args,
|
||||||
environment,
|
environment,
|
||||||
defaultKotlinJavaToolchain.get().providedJvm.get().javaHome,
|
defaultKotlinJavaToolchain.get().buildJvm.get().javaHome,
|
||||||
taskOutputsBackup
|
taskOutputsBackup
|
||||||
)
|
)
|
||||||
compilerRunner.errorsFile?.also { gradleMessageCollector.flush(it) }
|
compilerRunner.errorsFile?.also { gradleMessageCollector.flush(it) }
|
||||||
|
|||||||
Reference in New Issue
Block a user