[Native] Add project property that holds JavaLauncher provider

This property is initialized once to make ToolRunner do not query for
the launcher. Also set JDK 11 as a default in case of an unavailable JDK
set as the toolchain, like JDK 17 that is not available in the auto mode
in Gradle and requires environment variable to be set.
This commit is contained in:
Pavel Punegov
2021-07-31 00:44:23 +03:00
committed by Space
parent 2656c94535
commit 6bbfe0d503
2 changed files with 35 additions and 2 deletions
@@ -27,10 +27,16 @@ import org.gradle.api.internal.component.SoftwareComponentInternal
import org.gradle.api.internal.component.UsageContext import org.gradle.api.internal.component.UsageContext
import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.plugins.BasePlugin import org.gradle.api.plugins.BasePlugin
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.provider.Provider
import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.maven.internal.publication.MavenPublicationInternal import org.gradle.api.publish.maven.internal.publication.MavenPublicationInternal
import org.gradle.api.tasks.Exec import org.gradle.api.tasks.Exec
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.jvm.toolchain.JavaLauncher
import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.jvm.toolchain.JavaToolchainSpec
import org.gradle.language.cpp.internal.NativeVariantIdentity import org.gradle.language.cpp.internal.NativeVariantIdentity
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
@@ -168,6 +174,26 @@ internal fun Project.konanCompilerName(): String =
internal fun Project.konanCompilerDownloadDir(): String = internal fun Project.konanCompilerDownloadDir(): String =
DependencyProcessor.localKonanDir.resolve(project.konanCompilerName()).absolutePath DependencyProcessor.localKonanDir.resolve(project.konanCompilerName()).absolutePath
private lateinit var konanJvmLauncher: JavaLauncher
internal fun Project.getJavaLauncher(): Provider<JavaLauncher> = providers.provider {
if (!::konanJvmLauncher.isInitialized) {
val toolchain = project.extensions.getByType(JavaPluginExtension::class.java).toolchain
val service = project.extensions.getByType(JavaToolchainService::class.java)
konanJvmLauncher = try {
service.launcherFor(toolchain).get()
} catch (ex: GradleException) {
// If the JDK that was set is not available get the JDK 11 as a default
service.launcherFor(object : Action<JavaToolchainSpec> {
override fun execute(toolchainSpec: JavaToolchainSpec) {
toolchainSpec.languageVersion.set(JavaLanguageVersion.of(JdkMajorVersion.JDK_11.majorVersion))
}
}).get()
}
}
konanJvmLauncher
}
// region Useful extensions and functions --------------------------------------- // region Useful extensions and functions ---------------------------------------
internal fun MutableList<String>.addArg(parameter: String, value: String) { internal fun MutableList<String>.addArg(parameter: String, value: String) {
@@ -293,6 +319,7 @@ class KonanPlugin @Inject constructor(private val registry: ToolingModelBuilderR
KONAN_VERSION ("org.jetbrains.kotlin.native.version"), KONAN_VERSION ("org.jetbrains.kotlin.native.version"),
KONAN_BUILD_TARGETS ("konan.build.targets"), KONAN_BUILD_TARGETS ("konan.build.targets"),
KONAN_JVM_ARGS ("konan.jvmArgs"), KONAN_JVM_ARGS ("konan.jvmArgs"),
KONAN_JVM_LAUNCHER ("konan.javaLauncher"),
KONAN_USE_ENVIRONMENT_VARIABLES("konan.useEnvironmentVariables"), KONAN_USE_ENVIRONMENT_VARIABLES("konan.useEnvironmentVariables"),
DOWNLOAD_COMPILER ("download.compiler"), DOWNLOAD_COMPILER ("download.compiler"),
@@ -340,6 +367,7 @@ class KonanPlugin @Inject constructor(private val registry: ToolingModelBuilderR
KonanArtifactContainer::class.java, KonanArtifactContainer::class.java,
project project
) )
project.setProperty(ProjectProperty.KONAN_JVM_LAUNCHER, project.getJavaLauncher())
project.warnAboutDeprecatedProperty(ProjectProperty.KONAN_HOME) project.warnAboutDeprecatedProperty(ProjectProperty.KONAN_HOME)
@@ -20,10 +20,14 @@ import org.gradle.api.Named
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.Action import org.gradle.api.Action
import org.gradle.api.GradleException
import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.provider.Property import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.jvm.toolchain.JavaLauncher import org.gradle.jvm.toolchain.JavaLauncher
import org.gradle.jvm.toolchain.JavaToolchainService import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.jvm.toolchain.JavaToolchainSpec
import org.gradle.process.ExecSpec import org.gradle.process.ExecSpec
import org.jetbrains.kotlin.gradle.plugin.konan.KonanPlugin.ProjectProperty.KONAN_HOME import org.jetbrains.kotlin.gradle.plugin.konan.KonanPlugin.ProjectProperty.KONAN_HOME
import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.Family
@@ -101,8 +105,9 @@ internal abstract class KonanCliRunner(
"Please change it to the compiler root directory and rerun the build.") "Please change it to the compiler root directory and rerun the build.")
} }
val toolchain = project.extensions.getByType(JavaPluginExtension::class.java).toolchain @Suppress("UNCHECKED_CAST")
val launcher = project.extensions.getByType(JavaToolchainService::class.java).launcherFor(toolchain) val launcher = project.getProperty(KonanPlugin.ProjectProperty.KONAN_JVM_LAUNCHER) as? Provider<JavaLauncher>
?: throw IllegalStateException("Missing property: ${KonanPlugin.ProjectProperty.KONAN_JVM_LAUNCHER}")
project.exec(object : Action<ExecSpec> { project.exec(object : Action<ExecSpec> {
override fun execute(exec: ExecSpec) { override fun execute(exec: ExecSpec) {