[Native] JDK toolchains in KonanToolRunner

Use JDK toolchains in KonanToolRunner to make build able to change JDK
Use JDK 17 for MacOS aarch64 hosts
This commit is contained in:
Pavel Punegov
2021-07-23 15:44:18 +03:00
committed by Space
parent 5338705402
commit afa8e16c25
2 changed files with 47 additions and 33 deletions
+3 -1
View File
@@ -3,6 +3,8 @@ import org.jetbrains.kotlin.gradle.plugin.konan.tasks.KonanCacheTask
import org.jetbrains.kotlin.EndorsedLibraryInfo import org.jetbrains.kotlin.EndorsedLibraryInfo
import org.jetbrains.kotlin.UtilsKt import org.jetbrains.kotlin.UtilsKt
apply plugin: 'java'
buildscript { buildscript {
repositories { repositories {
if (UtilsKt.getCacheRedirectorEnabled(project)) if (UtilsKt.getCacheRedirectorEnabled(project))
@@ -20,7 +22,7 @@ ext {
Collection<EndorsedLibraryInfo> endorsedLibrariesList = ext.endorsedLibraries.values() Collection<EndorsedLibraryInfo> endorsedLibrariesList = ext.endorsedLibraries.values()
task clean { tasks.named("clean") {
doFirst { doFirst {
delete buildDir delete buildDir
} }
@@ -20,7 +20,11 @@ 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.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.gradle.plugin.konan.KonanPlugin.ProjectProperty.KONAN_HOME
import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.Family
import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.HostManager
@@ -29,7 +33,7 @@ import org.jetbrains.kotlin.konan.util.DependencyProcessor
import java.nio.file.Files import java.nio.file.Files
import org.jetbrains.kotlin.* import org.jetbrains.kotlin.*
internal interface KonanToolRunner: Named { internal interface KonanToolRunner : Named {
val mainClass: String val mainClass: String
val classpath: FileCollection val classpath: FileCollection
val jvmArgs: List<String> val jvmArgs: List<String>
@@ -45,7 +49,7 @@ internal abstract class KonanCliRunner(
val project: Project, val project: Project,
private val additionalJvmArgs: List<String>, private val additionalJvmArgs: List<String>,
private val konanHome: String private val konanHome: String
): KonanToolRunner { ) : KonanToolRunner {
override val mainClass = "org.jetbrains.kotlin.cli.utilities.MainKt" override val mainClass = "org.jetbrains.kotlin.cli.utilities.MainKt"
override fun getName() = toolName override fun getName() = toolName
@@ -58,18 +62,18 @@ internal abstract class KonanCliRunner(
} }
protected val blacklistProperties: Set<String> = protected val blacklistProperties: Set<String> =
setOf( setOf(
"java.endorsed.dirs", // Fix for KT-25887 "java.endorsed.dirs", // Fix for KT-25887
"user.dir" // Don't propagate the working dir of the current Gradle process "user.dir" // Don't propagate the working dir of the current Gradle process
) )
override val classpath: FileCollection = override val classpath: FileCollection =
project.fileTree("$konanHome/konan/lib/") project.fileTree("$konanHome/konan/lib/")
.apply { include("*.jar") } .apply { include("*.jar") }
override val jvmArgs = HostManager.defaultJvmArgs.toMutableList().apply { override val jvmArgs = HostManager.defaultJvmArgs.toMutableList().apply {
if (additionalJvmArgs.none { it.startsWith("-Xmx") } && if (additionalJvmArgs.none { it.startsWith("-Xmx") } &&
project.jvmArgs.none { it.startsWith("-Xmx") }) { project.jvmArgs.none { it.startsWith("-Xmx") }) {
add("-Xmx3G") add("-Xmx3G")
} }
addAll(additionalJvmArgs) addAll(additionalJvmArgs)
@@ -81,11 +85,11 @@ internal abstract class KonanCliRunner(
private fun String.escapeQuotes() = replace("\"", "\\\"") private fun String.escapeQuotes() = replace("\"", "\\\"")
private fun Sequence<Pair<String, String>>.escapeQuotesForWindows() = private fun Sequence<Pair<String, String>>.escapeQuotesForWindows() =
if (HostManager.hostIsMingw) { if (HostManager.hostIsMingw) {
map { (key, value) -> key.escapeQuotes() to value.escapeQuotes() } map { (key, value) -> key.escapeQuotes() to value.escapeQuotes() }
} else { } else {
this this
} }
open protected fun transformArgs(args: List<String>): List<String> = args open protected fun transformArgs(args: List<String>): List<String> = args
@@ -97,21 +101,30 @@ 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.")
} }
project.javaexec(object :Action<JavaExecSpec> { val toolchain = project.extensions.getByType(JavaPluginExtension::class.java).toolchain
override fun execute(exec: JavaExecSpec) { val launcher = project.extensions.getByType(JavaToolchainService::class.java).launcherFor(toolchain)
exec.main = mainClass
exec.classpath = classpath project.exec(object : Action<ExecSpec> {
exec.jvmArgs(jvmArgs) override fun execute(exec: ExecSpec) {
exec.systemProperties( exec.executable = launcher.get().executablePath.toString()
System.getProperties().asSequence() val properties = System.getProperties().asSequence()
.map { (k, v) -> k.toString() to v.toString() } .map { (k, v) -> k.toString() to v.toString() }
.filter { (k, _) -> k !in this@KonanCliRunner.blacklistProperties } .filter { (k, _) -> k !in this@KonanCliRunner.blacklistProperties }
.filter { (k, _) -> !k.startsWith("sun") && !k.startsWith("java") }
.escapeQuotesForWindows() .escapeQuotesForWindows()
.toMap() .toMap()
) .toMutableMap()
exec.systemProperty("konan.home", project.kotlinNativeDist.absolutePath) properties.put("konan.home", project.kotlinNativeDist.absolutePath)
exec.args(listOf(toolName) + transformArgs(args))
this@KonanCliRunner.blacklistEnvironment.forEach { environment.remove(it) } exec.args(mutableListOf<String>().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) exec.environment(environment)
} }
}) })
@@ -125,7 +138,7 @@ internal class KonanInteropRunner(
) : KonanCliRunner("cinterop", "Kotlin/Native cinterop tool", project, additionalJvmArgs, konanHome) { ) : KonanCliRunner("cinterop", "Kotlin/Native cinterop tool", project, additionalJvmArgs, konanHome) {
init { init {
if (HostManager.host == KonanTarget.MINGW_X64) { 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 + environment.put("PATH", DependencyProcessor.defaultDependenciesRoot.absolutePath +
"\\llvm-11.1.0-windows-x64" + "\\llvm-11.1.0-windows-x64" +
"\\bin;${environment.get("PATH")}") "\\bin;${environment.get("PATH")}")
@@ -134,12 +147,11 @@ internal class KonanInteropRunner(
} }
internal class KonanCompilerRunner( internal class KonanCompilerRunner(
project: Project, project: Project,
additionalJvmArgs: List<String> = emptyList(), additionalJvmArgs: List<String> = emptyList(),
val useArgFile: Boolean = true, val useArgFile: Boolean = true,
konanHome: String = project.konanHome konanHome: String = project.konanHome
) : KonanCliRunner("konanc", "Kotlin/Native compiler", project, additionalJvmArgs, konanHome) ) : KonanCliRunner("konanc", "Kotlin/Native compiler", project, additionalJvmArgs, konanHome) {
{
override fun transformArgs(args: List<String>): List<String> { override fun transformArgs(args: List<String>): List<String> {
if (!useArgFile) { if (!useArgFile) {
return args return args