[K/N][gradle][interop] Refactored ToolConfig

Added possibility to create different strategies for loading libclang
This commit is contained in:
Igor Chevdar
2021-11-18 19:32:05 +05:00
parent 650d4c78e9
commit bd6ea71ead
9 changed files with 96 additions and 57 deletions
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.konan.util.DependencyDirectories
import java.io.File
import java.util.Properties
import org.jetbrains.kotlin.compilerRunner.KotlinToolRunner
import org.jetbrains.kotlin.konan.target.AbstractToolConfig
internal interface KonanToolRunner {
fun run(args: List<String>)
@@ -67,10 +68,10 @@ internal abstract class KonanCliRunner(
""".trimIndent()
}
data class IsolatedClassLoaderCacheKey(val classpath: Set<java.io.File>)
data class IsolatedClassLoaderCacheKey(val classpath: Set<java.io.File>, val project: Project)
// TODO: can't we use this for other implementations too?
final override val isolatedClassLoaderCacheKey get() = IsolatedClassLoaderCacheKey(classpath)
final override val isolatedClassLoaderCacheKey get() = IsolatedClassLoaderCacheKey(classpath, project)
override fun transformArgs(args: List<String>) = listOf(toolName) + args
@@ -103,6 +104,16 @@ internal class KonanCliCompilerRunner(
}
}
private val load0 = Runtime::class.java.getDeclaredMethod("load0", Class::class.java, String::class.java).also {
it.isAccessible = true
}
internal class CliToolConfig(konanHome: String, target: String) : AbstractToolConfig(konanHome, target, emptyMap()) {
override fun loadLibclang() {
load0.invoke(Runtime.getRuntime(), String::class.java, libclang)
}
}
/** Kotlin/Native C-interop tool runner */
internal class KonanCliInteropRunner(
project: Project,
@@ -125,6 +136,10 @@ internal class KonanCliInteropRunner(
result
}
fun init(target: String) {
CliToolConfig(konanHome, target).prepare()
}
private val llvmExecutablesPath: String? by lazy {
if (HostManager.host == KonanTarget.MINGW_X64) {
// TODO: Read it from Platform properties when it is accessible.
@@ -36,8 +36,10 @@ import javax.inject.Inject
open class KonanInteropTask @Inject constructor(@Internal val workerExecutor: WorkerExecutor) : KonanBuildingTask(), KonanInteropSpec {
private val interopRunner = KonanCliInteropRunner(project, project.konanExtension.jvmArgs)
@get:Internal
override val toolRunner: KonanToolRunner = KonanCliInteropRunner(project, project.konanExtension.jvmArgs)
override val toolRunner: KonanToolRunner = interopRunner
override fun init(config: KonanBuildingConfig<*>, destinationDir: File, artifactName: String, target: KonanTarget) {
super.init(config, destinationDir, artifactName, target)
@@ -174,6 +176,8 @@ open class KonanInteropTask @Inject constructor(@Internal val workerExecutor: Wo
}
override fun run() {
interopRunner.init(target)
destinationDir.mkdirs()
if (dumpParameters) {
dumpProperties(this)