From afa8e16c2577412fcb13c81446d085cc04267ccc Mon Sep 17 00:00:00 2001 From: Pavel Punegov Date: Fri, 23 Jul 2021 15:44:18 +0300 Subject: [PATCH] [Native] JDK toolchains in KonanToolRunner Use JDK toolchains in KonanToolRunner to make build able to change JDK Use JDK 17 for MacOS aarch64 hosts --- kotlin-native/endorsedLibraries/build.gradle | 4 +- .../gradle/plugin/konan/KonanToolRunner.kt | 76 +++++++++++-------- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/kotlin-native/endorsedLibraries/build.gradle b/kotlin-native/endorsedLibraries/build.gradle index 2cd491430f1..35c616e49c6 100644 --- a/kotlin-native/endorsedLibraries/build.gradle +++ b/kotlin-native/endorsedLibraries/build.gradle @@ -3,6 +3,8 @@ import org.jetbrains.kotlin.gradle.plugin.konan.tasks.KonanCacheTask import org.jetbrains.kotlin.EndorsedLibraryInfo import org.jetbrains.kotlin.UtilsKt +apply plugin: 'java' + buildscript { repositories { if (UtilsKt.getCacheRedirectorEnabled(project)) @@ -20,7 +22,7 @@ ext { Collection endorsedLibrariesList = ext.endorsedLibraries.values() -task clean { +tasks.named("clean") { doFirst { delete buildDir } 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 9f8088bb3c2..4431c0c22c6 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,7 +20,11 @@ import org.gradle.api.Named import org.gradle.api.Project import org.gradle.api.file.FileCollection import org.gradle.api.Action -import org.gradle.process.JavaExecSpec +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.api.provider.Property +import org.gradle.jvm.toolchain.JavaLauncher +import org.gradle.jvm.toolchain.JavaToolchainService +import org.gradle.process.ExecSpec import org.jetbrains.kotlin.gradle.plugin.konan.KonanPlugin.ProjectProperty.KONAN_HOME import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.HostManager @@ -29,7 +33,7 @@ import org.jetbrains.kotlin.konan.util.DependencyProcessor import java.nio.file.Files import org.jetbrains.kotlin.* -internal interface KonanToolRunner: Named { +internal interface KonanToolRunner : Named { val mainClass: String val classpath: FileCollection val jvmArgs: List @@ -45,7 +49,7 @@ internal abstract class KonanCliRunner( val project: Project, private val additionalJvmArgs: List, private val konanHome: String -): KonanToolRunner { +) : KonanToolRunner { override val mainClass = "org.jetbrains.kotlin.cli.utilities.MainKt" override fun getName() = toolName @@ -58,18 +62,18 @@ internal abstract class KonanCliRunner( } protected val blacklistProperties: Set = - setOf( - "java.endorsed.dirs", // Fix for KT-25887 - "user.dir" // Don't propagate the working dir of the current Gradle process - ) + setOf( + "java.endorsed.dirs", // Fix for KT-25887 + "user.dir" // Don't propagate the working dir of the current Gradle process + ) override val classpath: FileCollection = project.fileTree("$konanHome/konan/lib/") - .apply { include("*.jar") } + .apply { include("*.jar") } override val jvmArgs = HostManager.defaultJvmArgs.toMutableList().apply { if (additionalJvmArgs.none { it.startsWith("-Xmx") } && - project.jvmArgs.none { it.startsWith("-Xmx") }) { + project.jvmArgs.none { it.startsWith("-Xmx") }) { add("-Xmx3G") } addAll(additionalJvmArgs) @@ -81,11 +85,11 @@ internal abstract class KonanCliRunner( private fun String.escapeQuotes() = replace("\"", "\\\"") private fun Sequence>.escapeQuotesForWindows() = - if (HostManager.hostIsMingw) { - map { (key, value) -> key.escapeQuotes() to value.escapeQuotes() } - } else { - this - } + if (HostManager.hostIsMingw) { + map { (key, value) -> key.escapeQuotes() to value.escapeQuotes() } + } else { + this + } open protected fun transformArgs(args: List): List = args @@ -97,21 +101,30 @@ internal abstract class KonanCliRunner( "Please change it to the compiler root directory and rerun the build.") } - project.javaexec(object :Action { - override fun execute(exec: JavaExecSpec) { - exec.main = mainClass - exec.classpath = classpath - exec.jvmArgs(jvmArgs) - exec.systemProperties( - System.getProperties().asSequence() + val toolchain = project.extensions.getByType(JavaPluginExtension::class.java).toolchain + val launcher = project.extensions.getByType(JavaToolchainService::class.java).launcherFor(toolchain) + + project.exec(object : Action { + override fun execute(exec: ExecSpec) { + exec.executable = launcher.get().executablePath.toString() + val properties = System.getProperties().asSequence() .map { (k, v) -> k.toString() to v.toString() } .filter { (k, _) -> k !in this@KonanCliRunner.blacklistProperties } + .filter { (k, _) -> !k.startsWith("sun") && !k.startsWith("java") } .escapeQuotesForWindows() .toMap() - ) - exec.systemProperty("konan.home", project.kotlinNativeDist.absolutePath) - exec.args(listOf(toolName) + transformArgs(args)) - this@KonanCliRunner.blacklistEnvironment.forEach { environment.remove(it) } + .toMutableMap() + properties.put("konan.home", project.kotlinNativeDist.absolutePath) + + exec.args(mutableListOf().apply { + addAll(jvmArgs) + addAll(properties.entries.map { "-D${it.key}=${it.value}" }) + add("-cp") + add(classpath.joinToString(separator = System.getProperty("path.separator"))) + add(mainClass) + addAll(listOf(toolName) + transformArgs(args)) + }) + blacklistEnvironment.forEach { environment.remove(it) } exec.environment(environment) } }) @@ -125,7 +138,7 @@ internal class KonanInteropRunner( ) : KonanCliRunner("cinterop", "Kotlin/Native cinterop tool", project, additionalJvmArgs, konanHome) { init { if (HostManager.host == KonanTarget.MINGW_X64) { - //TODO: Oh-ho-ho fix it in more convinient way. + //TODO: Oh-ho-ho fix it in more convinient way. environment.put("PATH", DependencyProcessor.defaultDependenciesRoot.absolutePath + "\\llvm-11.1.0-windows-x64" + "\\bin;${environment.get("PATH")}") @@ -134,12 +147,11 @@ internal class KonanInteropRunner( } internal class KonanCompilerRunner( - project: Project, - additionalJvmArgs: List = emptyList(), - val useArgFile: Boolean = true, - konanHome: String = project.konanHome -) : KonanCliRunner("konanc", "Kotlin/Native compiler", project, additionalJvmArgs, konanHome) -{ + project: Project, + additionalJvmArgs: List = emptyList(), + val useArgFile: Boolean = true, + konanHome: String = project.konanHome +) : KonanCliRunner("konanc", "Kotlin/Native compiler", project, additionalJvmArgs, konanHome) { override fun transformArgs(args: List): List { if (!useArgFile) { return args