From 4b53a8e3c70cf0ce1cd0233bbc6ff845bdd714a6 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Fri, 26 Nov 2021 14:01:40 +0500 Subject: [PATCH] Revert "[K/N][gradle][interop] Refactored ToolConfig" This reverts commit d9c1b1f6f78370d1ee56c9cc54a262aa85f8b477. --- .../native/interop/gen/defFileDependencies.kt | 12 +++--- .../native/interop/gen/jvm/ToolConfig.kt | 32 ++++++++++++---- .../kotlin/native/interop/gen/jvm/main.kt | 27 +++++++------ .../kotlin/konan/target/AbstractToolConfig.kt | 38 ------------------- .../gradle/plugin/konan/KonanToolRunner.kt | 19 +--------- .../plugin/konan/tasks/KonanInteropTask.kt | 6 +-- .../utilities/GeneratePlatformLibraries.kt | 2 +- .../kotlin/cli/utilities/InteropCompiler.kt | 5 +-- .../jetbrains/kotlin/cli/utilities/main.kt | 12 +++--- 9 files changed, 57 insertions(+), 96 deletions(-) delete mode 100644 kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/AbstractToolConfig.kt diff --git a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/defFileDependencies.kt b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/defFileDependencies.kt index e8768fc144c..3badf996c6b 100644 --- a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/defFileDependencies.kt +++ b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/defFileDependencies.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.native.interop.indexer.getHeaderPaths import org.jetbrains.kotlin.native.interop.tool.CInteropArguments import java.io.File -fun defFileDependencies(args: Array, runFromDaemon: Boolean) { +fun defFileDependencies(args: Array) { val defFiles = mutableListOf() val targets = mutableListOf() @@ -30,14 +30,14 @@ fun defFileDependencies(args: Array, runFromDaemon: Boolean) { } } - defFileDependencies(makeDependencyAssigner(targets, defFiles, runFromDaemon)) + defFileDependencies(makeDependencyAssigner(targets, defFiles)) } -private fun makeDependencyAssigner(targets: List, defFiles: List, runFromDaemon: Boolean) = - CompositeDependencyAssigner(targets.map { makeDependencyAssignerForTarget(it, defFiles, runFromDaemon) }) +private fun makeDependencyAssigner(targets: List, defFiles: List) = + CompositeDependencyAssigner(targets.map { makeDependencyAssignerForTarget(it, defFiles) }) -private fun makeDependencyAssignerForTarget(target: String, defFiles: List, runFromDaemon: Boolean): SingleTargetDependencyAssigner { - val tool = prepareTool(target, KotlinPlatform.NATIVE, runFromDaemon) +private fun makeDependencyAssignerForTarget(target: String, defFiles: List): SingleTargetDependencyAssigner { + val tool = prepareTool(target, KotlinPlatform.NATIVE) val cinteropArguments = CInteropArguments() cinteropArguments.argParser.parse(arrayOf()) val libraries = defFiles.associateWith { diff --git a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/ToolConfig.kt b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/ToolConfig.kt index 46e4b592487..7520cad2c04 100644 --- a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/ToolConfig.kt +++ b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/ToolConfig.kt @@ -18,28 +18,44 @@ package org.jetbrains.kotlin.native.interop.tool import org.jetbrains.kotlin.konan.target.* import org.jetbrains.kotlin.konan.util.KonanHomeProvider -import org.jetbrains.kotlin.konan.target.AbstractToolConfig +import org.jetbrains.kotlin.konan.util.defaultTargetSubstitutions import org.jetbrains.kotlin.native.interop.gen.jvm.KotlinPlatform import org.jetbrains.kotlin.native.interop.indexer.Language -class ToolConfig(userProvidedTargetName: String?, flavor: KotlinPlatform, propertyOverrides: Map) - : AbstractToolConfig(KonanHomeProvider.determineKonanHome(), userProvidedTargetName, propertyOverrides) { +class ToolConfig(userProvidedTargetName: String?, private val flavor: KotlinPlatform, private val propertyOverrides: Map) { + + private val konanHome = KonanHomeProvider.determineKonanHome() + private val distribution = Distribution(konanHome, propertyOverrides = propertyOverrides) + private val platformManager = PlatformManager(distribution) + private val targetManager = platformManager.targetManager(userProvidedTargetName) + private val host = HostManager.host + val target = targetManager.target + + private val platform = platformManager.platform(target) val clang = when (flavor) { KotlinPlatform.JVM -> platform.clangForJni KotlinPlatform.NATIVE -> platform.clang } + val substitutions = defaultTargetSubstitutions(target) + + fun downloadDependencies() = platform.downloadDependencies() + fun getDefaultCompilerOptsForLanguage(language: Language): List = when (language) { Language.C, Language.OBJECTIVE_C -> clang.libclangArgs.toList() Language.CPP -> clang.libclangXXArgs.toList() } - val platformCompilerOpts = - if (clang is ClangArgs.Jni) - clang.hostCompilerArgsForJni.toList() - else emptyList() + val platformCompilerOpts = if (clang is ClangArgs.Jni) + clang.hostCompilerArgsForJni.toList() else emptyList() - override fun loadLibclang() { System.load(libclang) } + val llvmHome = platform.absoluteLlvmHome + val sysRoot = platform.absoluteTargetSysRoot + + val libclang = when (host) { + KonanTarget.MINGW_X64 -> "$llvmHome/bin/libclang.dll" + else -> "$llvmHome/lib/${System.mapLibraryName("clang")}" + } } diff --git a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt index 0efcd2d3a43..f73e9c0b1fa 100644 --- a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt +++ b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt @@ -64,19 +64,18 @@ fun main(args: Array) { val arguments = FullCInteropArguments() arguments.argParser.parse(args) val flavorName = arguments.flavor - processCLibSafe(flavorName, arguments, InternalInteropOptions(arguments.generated, arguments.natives), runFromDaemon = false) + processCLibSafe(flavorName, arguments, InternalInteropOptions(arguments.generated, arguments.natives)) } fun interop( flavor: String, args: Array, - additionalArgs: InternalInteropOptions, - runFromDaemon: Boolean + additionalArgs: InternalInteropOptions ): Array? = when (flavor) { "jvm", "native" -> { val cinteropArguments = CInteropArguments() cinteropArguments.argParser.parse(args) val platform = KotlinPlatform.values().single { it.name.equals(flavor, ignoreCase = true) } - processCLibSafe(platform, cinteropArguments, additionalArgs, runFromDaemon) + processCLibSafe(platform, cinteropArguments, additionalArgs) } "wasm" -> processIdlLib(args, additionalArgs) else -> error("Unexpected flavor") @@ -207,15 +206,15 @@ private fun findFilesByGlobs(roots: List, globs: List): Map? { + additionalArgs: InternalInteropOptions): Array? { val ktGenRoot = additionalArgs.generated val nativeLibsDir = additionalArgs.natives val defFile = cinteropArguments.def?.let { File(it) } @@ -225,7 +224,7 @@ private fun processCLib(flavor: KotlinPlatform, cinteropArguments: CInteropArgum cinteropArguments.argParser.printError("-def or -pkg should be provided!") } - val tool = prepareTool(cinteropArguments.target, flavor, runFromDaemon, parseKeyValuePairs(cinteropArguments.overrideKonanProperties)) + val tool = prepareTool(cinteropArguments.target, flavor, parseKeyValuePairs(cinteropArguments.overrideKonanProperties)) val def = DefFile(defFile, tool.substitutions) val isLinkerOptsSetByUser = (cinteropArguments.linkerOpts.valueOrigin == ArgParser.ValueOrigin.SET_BY_USER) || @@ -464,10 +463,14 @@ private fun resolveDependencies( ).getFullList(TopologicalLibraryOrder) } -internal fun prepareTool(target: String?, flavor: KotlinPlatform, runFromDaemon: Boolean, propertyOverrides: Map = emptyMap()) = - ToolConfig(target, flavor, propertyOverrides).also { - if (!runFromDaemon) it.prepare() // Daemon prepares the tool himself. (See KonanToolRunner.kt) - } +internal fun prepareTool(target: String?, flavor: KotlinPlatform, propertyOverrides: Map = emptyMap()): ToolConfig { + val tool = ToolConfig(target, flavor, propertyOverrides) + tool.downloadDependencies() + + System.load(tool.libclang) + + return tool +} internal fun buildNativeLibrary( tool: ToolConfig, diff --git a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/AbstractToolConfig.kt b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/AbstractToolConfig.kt deleted file mode 100644 index 5c2c8fbb51d..00000000000 --- a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/AbstractToolConfig.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.konan.target - -import org.jetbrains.kotlin.konan.util.defaultTargetSubstitutions - -abstract class AbstractToolConfig(konanHome: String, userProvidedTargetName: String?, propertyOverrides: Map) { - private val distribution = Distribution(konanHome, propertyOverrides = propertyOverrides) - private val platformManager = PlatformManager(distribution) - private val targetManager = platformManager.targetManager(userProvidedTargetName) - private val host = HostManager.host - val target = targetManager.target - - protected val platform = platformManager.platform(target) - - val substitutions = defaultTargetSubstitutions(target) - - fun downloadDependencies() = platform.downloadDependencies() - - val llvmHome = platform.absoluteLlvmHome - val sysRoot = platform.absoluteTargetSysRoot - - val libclang = when (host) { - KonanTarget.MINGW_X64 -> "$llvmHome/bin/libclang.dll" - else -> "$llvmHome/lib/${System.mapLibraryName("clang")}" - } - - abstract fun loadLibclang() - - fun prepare() { - downloadDependencies() - - loadLibclang() - } -} \ No newline at end of file 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 6604440cb71..5ed1a198419 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 @@ -27,7 +27,6 @@ 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) @@ -68,10 +67,10 @@ internal abstract class KonanCliRunner( """.trimIndent() } - data class IsolatedClassLoaderCacheKey(val classpath: Set, val project: Project) + data class IsolatedClassLoaderCacheKey(val classpath: Set) // TODO: can't we use this for other implementations too? - final override val isolatedClassLoaderCacheKey get() = IsolatedClassLoaderCacheKey(classpath, project) + final override val isolatedClassLoaderCacheKey get() = IsolatedClassLoaderCacheKey(classpath) override fun transformArgs(args: List) = listOf(toolName) + args @@ -104,16 +103,6 @@ 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, @@ -132,10 +121,6 @@ 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. diff --git a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt index 54eb5af5c9f..30f39c917eb 100644 --- a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt +++ b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt @@ -36,10 +36,8 @@ 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 = interopRunner + override val toolRunner: KonanToolRunner = KonanCliInteropRunner(project, project.konanExtension.jvmArgs) override fun init(config: KonanBuildingConfig<*>, destinationDir: File, artifactName: String, target: KonanTarget) { super.init(config, destinationDir, artifactName, target) @@ -176,8 +174,6 @@ open class KonanInteropTask @Inject constructor(@Internal val workerExecutor: Wo } override fun run() { - interopRunner.init(target) - destinationDir.mkdirs() if (dumpParameters) { dumpProperties(this) diff --git a/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt b/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt index 1405a4ed7e2..f2c8fef160c 100644 --- a/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt +++ b/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt @@ -250,7 +250,7 @@ private fun generateLibrary( *def.depends.flatMap { listOf("-l", "$outputDirectory/${it.libraryName}") }.toTypedArray() ) logger.verbose("Run cinterop with args: ${cinteropArgs.joinToString(separator = " ")}") - invokeInterop("native", cinteropArgs, runFromDaemon = false)?.let { K2Native.mainNoExit(it) } + invokeInterop("native", cinteropArgs)?.let { K2Native.mainNoExit(it) } if (rebuild) { outKlib.deleteAtomicallyIfPossible(tmpDirectory) diff --git a/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt b/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt index c3e6a33da0e..0bd241ea8b0 100644 --- a/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt +++ b/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlin.native.interop.tool.* * @return null if there is no need in compiler invocation. * Otherwise returns array of compiler args. */ -fun invokeInterop(flavor: String, args: Array, runFromDaemon: Boolean): Array? { +fun invokeInterop(flavor: String, args: Array): Array? { val arguments = if (flavor == "native") CInteropArguments() else JSInteropArguments() arguments.argParser.parse(args) val outputFileName = arguments.output @@ -46,8 +46,7 @@ fun invokeInterop(flavor: String, args: Array, runFromDaemon: Boolean): InternalInteropOptions(generatedDir.absolutePath, nativesDir.absolutePath,manifest.path, cstubsName.takeIf { flavor == "native" } - ), - runFromDaemon + ) ) ?: return null // There is no need in compiler invocation if we're generating only metadata. val nativeStubs = diff --git a/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/main.kt b/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/main.kt index 004ba54685e..5847bca519b 100644 --- a/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/main.kt +++ b/kotlin-native/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/main.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.cli.bc.mainNoExitWithGradleRenderer as konancMainFor import org.jetbrains.kotlin.backend.konan.env.setEnv import org.jetbrains.kotlin.konan.util.usingNativeMemoryAllocator -private fun mainImpl(args: Array, runFromDaemon: Boolean, konancMain: (Array) -> Unit) { +private fun mainImpl(args: Array, konancMain: (Array) -> Unit) { val utilityName = args[0] val utilityArgs = args.drop(1).toTypedArray() when (utilityName) { @@ -37,17 +37,17 @@ private fun mainImpl(args: Array, runFromDaemon: Boolean, konancMain: (A konancMain(utilityArgs) } "cinterop" -> { - val konancArgs = invokeInterop("native", utilityArgs, runFromDaemon) + val konancArgs = invokeInterop("native", utilityArgs) konancArgs?.let { konancMain(it) } } "jsinterop" -> { - val konancArgs = invokeInterop("wasm", utilityArgs, runFromDaemon) + val konancArgs = invokeInterop("wasm", utilityArgs) konancArgs?.let { konancMain(it) } } "klib" -> klibMain(utilityArgs) "defFileDependencies" -> - defFileDependencies(utilityArgs, runFromDaemon) + defFileDependencies(utilityArgs) "generatePlatformLibraries" -> generatePlatformLibraries(utilityArgs) @@ -59,7 +59,7 @@ private fun mainImpl(args: Array, runFromDaemon: Boolean, konancMain: (A } } -fun main(args: Array) = mainImpl(args, false, ::konancMain) +fun main(args: Array) = mainImpl(args, ::konancMain) private fun setupClangEnv() { setEnv("LIBCLANG_DISABLE_CRASH_RECOVERY", "1") @@ -67,5 +67,5 @@ private fun setupClangEnv() { fun daemonMain(args: Array) = usingNativeMemoryAllocator { setupClangEnv() // For in-process invocation have to setup proper environment manually. - mainImpl(args, true, ::konancMainForGradle) + mainImpl(args, ::konancMainForGradle) } \ No newline at end of file