[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.project.ProjectInternal
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.maven.MavenPublication
import org.gradle.api.publish.maven.internal.publication.MavenPublicationInternal
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.tooling.provider.model.ToolingModelBuilderRegistry
import org.gradle.util.GradleVersion
@@ -168,6 +174,26 @@ internal fun Project.konanCompilerName(): String =
internal fun Project.konanCompilerDownloadDir(): String =
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 ---------------------------------------
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_BUILD_TARGETS ("konan.build.targets"),
KONAN_JVM_ARGS ("konan.jvmArgs"),
KONAN_JVM_LAUNCHER ("konan.javaLauncher"),
KONAN_USE_ENVIRONMENT_VARIABLES("konan.useEnvironmentVariables"),
DOWNLOAD_COMPILER ("download.compiler"),
@@ -340,6 +367,7 @@ class KonanPlugin @Inject constructor(private val registry: ToolingModelBuilderR
KonanArtifactContainer::class.java,
project
)
project.setProperty(ProjectProperty.KONAN_JVM_LAUNCHER, project.getJavaLauncher())
project.warnAboutDeprecatedProperty(ProjectProperty.KONAN_HOME)
@@ -20,10 +20,14 @@ import org.gradle.api.Named
import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.gradle.api.Action
import org.gradle.api.GradleException
import org.gradle.api.plugins.JavaPluginExtension
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.JavaToolchainService
import org.gradle.jvm.toolchain.JavaToolchainSpec
import org.gradle.process.ExecSpec
import org.jetbrains.kotlin.gradle.plugin.konan.KonanPlugin.ProjectProperty.KONAN_HOME
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.")
}
val toolchain = project.extensions.getByType(JavaPluginExtension::class.java).toolchain
val launcher = project.extensions.getByType(JavaToolchainService::class.java).launcherFor(toolchain)
@Suppress("UNCHECKED_CAST")
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> {
override fun execute(exec: ExecSpec) {