Platform lib generator: Allow building metadata libraries

This commit is contained in:
Ilya Matveev
2020-02-11 17:03:14 +07:00
committed by Ilya Matveev
parent be8622053e
commit a4422c22e5
2 changed files with 20 additions and 4 deletions
@@ -50,7 +50,7 @@ open class CommonInteropArguments(val argParser: ArgParser) {
val repo by argParser.option(ArgType.String, shortName = "r", description = "repository to resolve dependencies") val repo by argParser.option(ArgType.String, shortName = "r", description = "repository to resolve dependencies")
.multiple() .multiple()
val mode by argParser.option(ArgType.Choice(listOf(MODE_METADATA, MODE_SOURCECODE)), description = "the way interop library is generated") val mode by argParser.option(ArgType.Choice(listOf(MODE_METADATA, MODE_SOURCECODE)), description = "the way interop library is generated")
.default(MODE_SOURCECODE) .default(DEFAULT_MODE)
val nodefaultlibs by argParser.option(ArgType.Boolean, NODEFAULTLIBS, val nodefaultlibs by argParser.option(ArgType.Boolean, NODEFAULTLIBS,
description = "don't link the libraries from dist/klib automatically").default(false) description = "don't link the libraries from dist/klib automatically").default(false)
val nodefaultlibsDeprecated by argParser.option(ArgType.Boolean, NODEFAULTLIBS_DEPRECATED, val nodefaultlibsDeprecated by argParser.option(ArgType.Boolean, NODEFAULTLIBS_DEPRECATED,
@@ -70,6 +70,8 @@ open class CommonInteropArguments(val argParser: ArgParser) {
companion object { companion object {
const val MODE_SOURCECODE = "sourcecode" const val MODE_SOURCECODE = "sourcecode"
const val MODE_METADATA = "metadata" const val MODE_METADATA = "metadata"
const val DEFAULT_MODE = MODE_SOURCECODE
} }
} }
@@ -17,6 +17,9 @@ import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.konan.target.customerDistribution import org.jetbrains.kotlin.konan.target.customerDistribution
import org.jetbrains.kotlin.konan.util.visibleName import org.jetbrains.kotlin.konan.util.visibleName
import org.jetbrains.kotlin.native.interop.tool.CommonInteropArguments.Companion.DEFAULT_MODE
import org.jetbrains.kotlin.native.interop.tool.CommonInteropArguments.Companion.MODE_METADATA
import org.jetbrains.kotlin.native.interop.tool.CommonInteropArguments.Companion.MODE_SOURCECODE
import java.io.PrintWriter import java.io.PrintWriter
import java.io.StringWriter import java.io.StringWriter
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
@@ -101,6 +104,13 @@ fun generatePlatformLibraries(args: Array<String>) {
val cacheDirectoryPath by argParser.option( val cacheDirectoryPath by argParser.option(
ArgType.String, "cache-directory", "c", "Cache output directory") ArgType.String, "cache-directory", "c", "Cache output directory")
val mode by argParser.option(
ArgType.Choice(listOf(MODE_METADATA, MODE_SOURCECODE)),
fullName = "mode",
shortName = "m",
description = "The way interop library is generated."
).default(DEFAULT_MODE)
val verbose by argParser.option( val verbose by argParser.option(
ArgType.Boolean, ArgType.Boolean,
"verbose", "v", "verbose", "v",
@@ -138,7 +148,8 @@ fun generatePlatformLibraries(args: Array<String>) {
val logger = Logger(if (verbose) Logger.Level.VERBOSE else Logger.Level.NORMAL) val logger = Logger(if (verbose) Logger.Level.VERBOSE else Logger.Level.NORMAL)
generatePlatformLibraries( generatePlatformLibraries(
target, inputDirectory, outputDirectory, target, mode,
inputDirectory, outputDirectory,
saveTemps, cacheDirectory, stdlibFile, saveTemps, cacheDirectory, stdlibFile,
cacheKind, cacheArgs, logger cacheKind, cacheArgs, logger
) )
@@ -175,6 +186,7 @@ private fun topoSort(defFiles: List<DefFile>): List<DefFile> {
private fun generateLibrary( private fun generateLibrary(
target: KonanTarget, target: KonanTarget,
mode: String,
def: DefFile, def: DefFile,
inputDirectory: File, inputDirectory: File,
outputDirectory: File, outputDirectory: File,
@@ -199,6 +211,7 @@ private fun generateLibrary(
"-compiler-option", "-fmodules-cache-path=${tmpDirectory.child("clangModulesCache").absolutePath}", "-compiler-option", "-fmodules-cache-path=${tmpDirectory.child("clangModulesCache").absolutePath}",
"-repo", outputDirectory.absolutePath, "-repo", outputDirectory.absolutePath,
"-no-default-libs", "-no-endorsed-libs", "-Xpurge-user-libs", "-nopack", "-no-default-libs", "-no-endorsed-libs", "-Xpurge-user-libs", "-nopack",
"-mode", mode,
*def.depends.flatMap { listOf("-l", "$outputDirectory/${it.name}") }.toTypedArray() *def.depends.flatMap { listOf("-l", "$outputDirectory/${it.name}") }.toTypedArray()
) )
logger.verbose("Run cinterop with args: ${cinteropArgs.joinToString(separator = " ")}") logger.verbose("Run cinterop with args: ${cinteropArgs.joinToString(separator = " ")}")
@@ -277,7 +290,8 @@ private fun buildStdlibCache(
K2Native.mainNoExit(compilerArgs) K2Native.mainNoExit(compilerArgs)
} }
private fun generatePlatformLibraries(target: KonanTarget, inputDirectory: File, outputDirectory: File, private fun generatePlatformLibraries(target: KonanTarget, mode: String,
inputDirectory: File, outputDirectory: File,
saveTemps: Boolean, cacheDirectory: File?, stdlibFile: File, saveTemps: Boolean, cacheDirectory: File?, stdlibFile: File,
cacheKind: String, cacheArgs: List<String>, cacheKind: String, cacheArgs: List<String>,
logger: Logger) { logger: Logger) {
@@ -345,7 +359,7 @@ private fun generatePlatformLibraries(target: KonanTarget, inputDirectory: File,
} }
logger.log("Processing ${def.name} (${countProcessed.incrementAndGet()}/$countTotal)...") logger.log("Processing ${def.name} (${countProcessed.incrementAndGet()}/$countTotal)...")
generateLibrary(target, def, inputDirectory, outputDirectory, tmpDirectory, logger) generateLibrary(target, mode, def, inputDirectory, outputDirectory, tmpDirectory, logger)
if (cacheDirectory != null) { if (cacheDirectory != null) {
buildCache(target, def, outputDirectory, cacheDirectory, cacheKind, cacheArgs, logger) buildCache(target, def, outputDirectory, cacheDirectory, cacheKind, cacheArgs, logger)
} }