From e2cb099d2b2a30fc002e07cccd94dd4d9aeca681 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Thu, 15 Oct 2020 18:02:05 +0700 Subject: [PATCH] [KT-40670] Allow override konan.properties It is painful to edit konan.properties just to override some value (e.g. compiler flags or LLVM location), especially if it is needed only in a single project. Thus `-Xoverride-konan-properties` is added. --- .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 19 +++++++++++++++++++ .../cli/bc/K2NativeCompilerArguments.kt | 10 ++++++++++ .../kotlin/backend/konan/KonanConfig.kt | 3 ++- .../backend/konan/KonanConfigurationKeys.kt | 2 ++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index d5f0d29c9b6..c0182e46008 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -252,6 +252,7 @@ class K2Native : CLICompiler() { } put(DISABLE_FAKE_OVERRIDE_VALIDATOR, arguments.disableFakeOverrideValidator) putIfNotNull(PRE_LINK_CACHES, parsePreLinkCachesValue(configuration, arguments.preLinkCaches)) + putIfNotNull(OVERRIDE_KONAN_PROPERTIES, parseOverrideKonanProperties(arguments, configuration)) } } } @@ -455,6 +456,24 @@ private fun parseDebugPrefixMap( } }.toMap() +private fun parseOverrideKonanProperties( + arguments: K2NativeCompilerArguments, + configuration: CompilerConfiguration +): Map? = + arguments.overrideKonanProperties?.mapNotNull { + val keyValueSeparatorIndex = it.indexOf('=') + if (keyValueSeparatorIndex > 0) { + it.substringBefore('=') to it.substringAfter('=') + } else { + configuration.report( + ERROR, + "incorrect property format: expected '=', got '$it'" + ) + null + } + }?.toMap() + + fun main(args: Array) = K2Native.main(args) fun mainNoExitWithGradleRenderer(args: Array) = K2Native.mainNoExitWithGradleRenderer(args) diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt index 942d8ebe913..0b596f5269b 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt @@ -278,6 +278,16 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { ) var preLinkCaches: String? = null + // We use `;` as delimiter because properties may contain comma-separated values. + // For example, target cpu features. + @Argument( + value = "-Xoverride-konan-properties", + valueDescription = "key1=value1;key2=value2;...", + description = "Override konan.properties.values", + delimiter = ";" + ) + var overrideKonanProperties: Array? = null + override fun configureAnalysisFlags(collector: MessageCollector): MutableMap, Any> = super.configureAnalysisFlags(collector).also { val useExperimental = it[AnalysisFlags.useExperimental] as List<*> diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index 54e22cefe0e..ccfc2ccc813 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -30,7 +30,8 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration internal val distribution = Distribution( configuration.get(KonanConfigKeys.KONAN_HOME) ?: KonanHomeProvider.determineKonanHome(), false, - configuration.get(KonanConfigKeys.RUNTIME_FILE) + configuration.get(KonanConfigKeys.RUNTIME_FILE), + configuration.get(KonanConfigKeys.OVERRIDE_KONAN_PROPERTIES) ) private val platformManager = PlatformManager(distribution) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index c4e68b64aaf..8a25ab08e25 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -144,6 +144,8 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("remap file source paths in debug info") val PRE_LINK_CACHES: CompilerConfigurationKey = CompilerConfigurationKey.create("perform compiler caches pre-link") + val OVERRIDE_KONAN_PROPERTIES: CompilerConfigurationKey> + = CompilerConfigurationKey.create("override konan.properties values") } }