Fix child default toolchain configuration overwrites parent one

Caused by configure actions ordering - parent are applied first.

^KT-55004 Fixed
This commit is contained in:
Yahor Berdnikau
2022-11-17 14:12:50 +01:00
committed by Space Team
parent 1d76bce3dd
commit f6dd302dc7
7 changed files with 68 additions and 12 deletions
@@ -14,6 +14,7 @@ import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName
import java.io.File
import kotlin.io.path.appendText
@JvmGradlePluginTests
@DisplayName("Kotlin Java Toolchain support")
@@ -659,6 +660,37 @@ class KotlinJavaToolchainTest : KGPBaseTest() {
}
}
@DisplayName("KT-55004: Should use non-default toolchain for parent project")
@GradleTest
internal fun toolchainFromParentProject(gradleVersion: GradleVersion) {
project(
projectName = "multiproject".fullProjectName,
gradleVersion = gradleVersion,
buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.DEBUG)
) {
//language=Groovy
buildGradle.appendText(
"""
|
|allprojects {
| tasks.withType(org.jetbrains.kotlin.gradle.tasks.UsesKotlinJavaToolchain.class)
| .configureEach {
| kotlinJavaToolchain.jdk.use(
| "${getJdk11Path()}",
| JavaVersion.VERSION_11
| )
| }
|}
""".trimMargin()
)
build(":lib:compileKotlin") {
assertOutputDoesNotContain("-jvm-target 1.8")
assertOutputContains("-jvm-target 11")
}
}
}
private fun BuildResult.assertJdkHomeIsUsingJdk(
javaexecPath: String
) = assertOutputContains("[KOTLIN] Kotlin compilation 'jdkHome' argument: $javaexecPath")
@@ -0,0 +1,3 @@
plugins {
id "org.jetbrains.kotlin.jvm" apply false
}
@@ -0,0 +1,8 @@
plugins {
id("org.jetbrains.kotlin.jvm")
}
repositories {
mavenLocal()
mavenCentral()
}
@@ -0,0 +1,3 @@
fun main() {
println("I know what you've done last summer...")
}
@@ -13,6 +13,7 @@ import org.gradle.api.plugins.PluginContainer
import org.gradle.api.tasks.TaskContainer
import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.jvm.toolchain.JavaToolchainSpec
import org.jetbrains.kotlin.gradle.tasks.DefaultKotlinJavaToolchain
import org.jetbrains.kotlin.gradle.tasks.UsesKotlinJavaToolchain
import org.jetbrains.kotlin.gradle.tasks.withType
import org.jetbrains.kotlin.gradle.utils.newInstance
@@ -62,7 +63,8 @@ internal abstract class DefaultToolchainSupport @Inject constructor(
tasks
.withType<UsesKotlinJavaToolchain>()
.configureEach {
it.kotlinJavaToolchain.toolchain.use(javaLauncher)
(it.kotlinJavaToolchain.toolchain as DefaultKotlinJavaToolchain.DefaultJavaToolchainSetter)
.useAsConvention(javaLauncher)
}
}
}
@@ -164,22 +164,29 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor(
}
}
private class DefaultJavaToolchainSetter(
internal class DefaultJavaToolchainSetter(
private val providedJvm: Property<Jvm>
) : KotlinJavaToolchain.JavaToolchainSetter {
internal fun useAsConvention(
javaLauncher: Provider<JavaLauncher>
) {
providedJvm.convention(javaLauncher.map(::mapToJvm))
}
override fun use(
javaLauncher: Provider<JavaLauncher>
) {
providedJvm.set(
javaLauncher.map { launcher ->
val metadata = launcher.metadata
val javaVersion = JavaVersion.toVersion(metadata.languageVersion.asInt())
Jvm.discovered(
metadata.installationPath.asFile,
null,
javaVersion
)
}
providedJvm.set(javaLauncher.map(::mapToJvm))
}
private fun mapToJvm(javaLauncher: JavaLauncher): Jvm {
val metadata = javaLauncher.metadata
val javaVersion = JavaVersion.toVersion(metadata.languageVersion.asInt())
return Jvm.discovered(
metadata.installationPath.asFile,
null,
javaVersion
)
}
}