From 149e596bef0cdb4b846124c71aea6db9b5b27bcc Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Tue, 25 Jan 2022 16:47:35 +0300 Subject: [PATCH] Native: support -Xoverride-konan-properties in generatePlatformLibraries --- .../kotlin/native/interop/gen/jvm/main.kt | 2 +- .../utilities/GeneratePlatformLibraries.kt | 37 ++++++++++++++++--- 2 files changed, 32 insertions(+), 7 deletions(-) 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 5f1f2b931da..9908305a085 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 @@ -541,7 +541,7 @@ internal fun buildNativeLibrary( ) } -private fun parseKeyValuePairs( +fun parseKeyValuePairs( argumentValue: List, ): Map = argumentValue.mapNotNull { val keyValueSeparatorIndex = it.indexOf('=') 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 0e38f54c54f..8782b3f4cc9 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 @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.konan.util.KonanHomeProvider import org.jetbrains.kotlin.konan.util.PlatformLibsInfo import org.jetbrains.kotlin.konan.util.visibleName import org.jetbrains.kotlin.native.interop.gen.jvm.GenerationMode +import org.jetbrains.kotlin.native.interop.gen.jvm.parseKeyValuePairs import org.jetbrains.kotlin.native.interop.tool.CommonInteropArguments.Companion.DEFAULT_MODE import org.jetbrains.kotlin.native.interop.tool.SHORT_MODULE_NAME import java.io.PrintWriter @@ -65,6 +66,8 @@ private enum class CacheKind(val outputKind: CompilerOutputKind) { STATIC_CACHE(CompilerOutputKind.STATIC_CACHE) } +private class CInteropOptions(val mode: GenerationMode, val additionalArguments: List) + // TODO: Use Distribution's paths after compiler update. fun generatePlatformLibraries(args: Array) = usingNativeMemoryAllocator { // IMPORTANT! These command line keys are used by the Gradle plugin to configure platform libraries generation, @@ -120,9 +123,20 @@ fun generatePlatformLibraries(args: Array) = usingNativeMemoryAllocator ArgType.Boolean, fullName = "rebuild", description = "Rebuild already existing libraries" ).default(false) + val overrideKonanProperties by argParser.option(ArgType.String, + fullName = "Xoverride-konan-properties", + description = "Override konan.properties.values" + ).multiple().delimiter(";") + argParser.parse(args) - val distribution = customerDistribution(KonanHomeProvider.determineKonanHome()) + val distribution = Distribution( + KonanHomeProvider.determineKonanHome(), + onlyDefaultProfiles = false, + runtimeFileOverride = null, + propertyOverrides = parseKeyValuePairs(overrideKonanProperties) + ) + val platformManager = PlatformManager(distribution) val target = platformManager.targetByName(targetName) val targetCacheArgs = platformManager.let { @@ -152,8 +166,18 @@ fun generatePlatformLibraries(args: Array) = usingNativeMemoryAllocator CacheInfo(it, cacheKind.outputKind.visibleName, cacheArgs + targetCacheArgs) } + val cinteropOptions = CInteropOptions( + mode, + additionalArguments = buildList { + if (overrideKonanProperties.isNotEmpty()) { + add("-Xoverride-konan-properties") + add(overrideKonanProperties.joinToString(";")) + } + } + ) + generatePlatformLibraries( - target, mode, + target, cinteropOptions, DirectoriesInfo(inputDirectory, outputDirectory, stdlibFile), cacheInfo, rebuild, saveTemps, logger ) @@ -221,7 +245,7 @@ private fun topoSort(defFiles: List): List { private fun generateLibrary( target: KonanTarget, - mode: GenerationMode, + cinteropOptions: CInteropOptions, def: DefFile, directories: DirectoriesInfo, tmpDirectory: File, @@ -246,7 +270,8 @@ private fun generateLibrary( "-compiler-option", "-fmodules-cache-path=${tmpDirectory.child("clangModulesCache").absolutePath}", "-repo", outputDirectory.absolutePath, "-no-default-libs", "-no-endorsed-libs", "-Xpurge-user-libs", "-nopack", - "-mode", mode.modeName, + "-mode", cinteropOptions.mode.modeName, + *cinteropOptions.additionalArguments.toTypedArray(), "-$SHORT_MODULE_NAME", def.shortLibraryName, *def.depends.flatMap { listOf("-l", "$outputDirectory/${it.libraryName}") }.toTypedArray() ) @@ -331,7 +356,7 @@ private fun buildStdlibCache( K2Native.mainNoExit(compilerArgs) } -private fun generatePlatformLibraries(target: KonanTarget, mode: GenerationMode, +private fun generatePlatformLibraries(target: KonanTarget, cinteropOptions: CInteropOptions, directories: DirectoriesInfo, cacheInfo: CacheInfo?, rebuild: Boolean, saveTemps: Boolean, logger: Logger) = with(directories) { if (cacheInfo != null) { @@ -398,7 +423,7 @@ private fun generatePlatformLibraries(target: KonanTarget, mode: GenerationMode, } logger.log("Processing ${def.name} (${countProcessed.incrementAndGet()}/$countTotal)...") - generateLibrary(target, mode, def, directories, tmpDirectory, rebuild, logger) + generateLibrary(target, cinteropOptions, def, directories, tmpDirectory, rebuild, logger) if (cacheInfo != null) { buildCache(target, def, outputDirectory, cacheInfo, rebuild, logger) }