Ensure toolchain is properly configured.

User specified toolchain maybe configured after initial task
configuration action will happen.

^KT-43095 In Progress
This commit is contained in:
Yahor Berdnikau
2021-06-22 11:52:39 +02:00
committed by Space
parent 4e556af54d
commit 6d929a8c3b
@@ -10,11 +10,10 @@ import org.gradle.api.GradleException
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.plugins.ExtensionContainer import org.gradle.api.plugins.ExtensionContainer
import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.internal.jvm.Jvm import org.gradle.api.plugins.PluginContainer
import org.gradle.jvm.toolchain.JavaLanguageVersion import org.gradle.api.tasks.TaskContainer
import org.gradle.jvm.toolchain.JavaToolchainService import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.jvm.toolchain.JavaToolchainSpec import org.gradle.jvm.toolchain.JavaToolchainSpec
import org.gradle.jvm.toolchain.internal.DefaultToolchainSpec
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinJavaToolchain.Companion.TOOLCHAIN_SUPPORTED_VERSION import org.jetbrains.kotlin.gradle.tasks.KotlinJavaToolchain.Companion.TOOLCHAIN_SUPPORTED_VERSION
import org.jetbrains.kotlin.gradle.tasks.UsesKotlinJavaToolchain import org.jetbrains.kotlin.gradle.tasks.UsesKotlinJavaToolchain
@@ -32,33 +31,11 @@ internal interface ToolchainSupport {
val currentVersion = GradleVersion.version(project.gradle.gradleVersion) val currentVersion = GradleVersion.version(project.gradle.gradleVersion)
return when { return when {
currentVersion < TOOLCHAIN_SUPPORTED_VERSION -> project.objects.newInstance<NonExistingToolchainSupport>() currentVersion < TOOLCHAIN_SUPPORTED_VERSION -> project.objects.newInstance<NonExistingToolchainSupport>()
else -> project.objects.newInstance<DefaultToolchainSupport>(project.extensions).also { else -> project.objects.newInstance<DefaultToolchainSupport>(
configureDefaultToolchain(project) project.extensions,
} project.tasks,
} project.plugins
} )
private fun configureDefaultToolchain(project: Project) {
project.plugins.withId("org.gradle.java-base") {
project
.tasks
.withType<UsesKotlinJavaToolchain>()
.configureEach {
val javaToolchainService = project
.extensions
.findByType(JavaToolchainService::class.java)!!
val javaToolchainSpec = project
.extensions
.getByType(JavaPluginExtension::class.java)
.toolchain
// Only set when toolchain is configured
if (javaToolchainSpec.languageVersion.isPresent) {
it.kotlinJavaToolchain.toolchain.use(
javaToolchainService.launcherFor(javaToolchainSpec)
)
}
}
} }
} }
} }
@@ -73,16 +50,39 @@ internal abstract class NonExistingToolchainSupport : ToolchainSupport {
} }
internal abstract class DefaultToolchainSupport @Inject constructor( internal abstract class DefaultToolchainSupport @Inject constructor(
private val extensions: ExtensionContainer private val extensions: ExtensionContainer,
private val tasks: TaskContainer,
private val plugins: PluginContainer
) : ToolchainSupport { ) : ToolchainSupport {
private val toolchainSpec: JavaToolchainSpec private val toolchainSpec: JavaToolchainSpec
get() = extensions get() = extensions
.getByType(JavaPluginExtension::class.java) .getByType(JavaPluginExtension::class.java)
.toolchain .toolchain
init {
configureToolchain()
}
override fun applyToolchain( override fun applyToolchain(
action: Action<Any> action: Action<Any>
) { ) {
action.execute(toolchainSpec) action.execute(toolchainSpec)
configureToolchain()
}
private fun configureToolchain() {
plugins.withId("org.gradle.java-base") {
tasks
.withType<UsesKotlinJavaToolchain>()
.configureEach {
// Only set when toolchain is configured
if (toolchainSpec.languageVersion.isPresent) {
val toolchainService = extensions.findByType(JavaToolchainService::class.java)!!
it.kotlinJavaToolchain.toolchain.use(
toolchainService.launcherFor(toolchainSpec)
)
}
}
}
} }
} }