From 6bbfe0d503f3027d519dce11c7e81d67a80a5888 Mon Sep 17 00:00:00 2001 From: Pavel Punegov Date: Sat, 31 Jul 2021 00:44:23 +0300 Subject: [PATCH] [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. --- .../kotlin/gradle/plugin/konan/KonanPlugin.kt | 28 +++++++++++++++++++ .../gradle/plugin/konan/KonanToolRunner.kt | 9 ++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt index f53fb3ddaff..ef658b0fdc3 100644 --- a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt +++ b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt @@ -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 = 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 { + override fun execute(toolchainSpec: JavaToolchainSpec) { + toolchainSpec.languageVersion.set(JavaLanguageVersion.of(JdkMajorVersion.JDK_11.majorVersion)) + } + }).get() + } + } + konanJvmLauncher +} + // region Useful extensions and functions --------------------------------------- internal fun MutableList.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) diff --git a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt index 4431c0c22c6..0c6e43557b8 100644 --- a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt +++ b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt @@ -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 + ?: throw IllegalStateException("Missing property: ${KonanPlugin.ProjectProperty.KONAN_JVM_LAUNCHER}") project.exec(object : Action { override fun execute(exec: ExecSpec) {