[Native] Add -Xoverride-konan-properties to cinterop.

This aligns with the flag added to kotlinc in:
https://youtrack.jetbrains.com/issue/KT-40670

Hermetic builds would benefit from being able to override dependency paths or airplaneMode using this mechanism:

```
$ bin/cinterop -Xoverride-konan-properties "apple-llvm-20200714-macos-x64-essentials.default=/tmp/llvm;airplaneMode=true" -def baz.def
```
This commit is contained in:
Martin Petrov
2021-11-10 22:49:00 -05:00
committed by Sergey Bogolepov
parent d5dd35cb20
commit aedcfe78e1
3 changed files with 21 additions and 5 deletions
@@ -65,6 +65,10 @@ open class CommonInteropArguments(val argParser: ArgParser) {
description = "save temporary files to the given directory")
val kotlincOption by argParser.option(ArgType.String, "Xkotlinc-option",
description = "additional kotlinc compiler option").multiple()
val overrideKonanProperties by argParser.option(ArgType.String,
fullName = "Xoverride-konan-properties",
description = "Override konan.properties.values"
).multiple().delimiter(";")
companion object {
val DEFAULT_MODE = GenerationMode.METADATA
@@ -22,10 +22,10 @@ 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?, private val flavor: KotlinPlatform) {
class ToolConfig(userProvidedTargetName: String?, private val flavor: KotlinPlatform, private val propertyOverrides: Map<String, String>) {
private val konanHome = KonanHomeProvider.determineKonanHome()
private val distribution = customerDistribution(konanHome)
private val distribution = Distribution(konanHome, propertyOverrides = propertyOverrides)
private val platformManager = PlatformManager(distribution)
private val targetManager = platformManager.targetManager(userProvidedTargetName)
private val host = HostManager.host
@@ -214,7 +214,7 @@ private fun processCLib(flavor: KotlinPlatform, cinteropArguments: CInteropArgum
cinteropArguments.argParser.printError("-def or -pkg should be provided!")
}
val tool = prepareTool(cinteropArguments.target, flavor)
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) ||
@@ -453,8 +453,8 @@ private fun resolveDependencies(
).getFullList(TopologicalLibraryOrder)
}
internal fun prepareTool(target: String?, flavor: KotlinPlatform): ToolConfig {
val tool = ToolConfig(target, flavor)
internal fun prepareTool(target: String?, flavor: KotlinPlatform, propertyOverrides: Map<String, String> = emptyMap()): ToolConfig {
val tool = ToolConfig(target, flavor, propertyOverrides)
tool.downloadDependencies()
System.load(tool.libclang)
@@ -527,3 +527,15 @@ internal fun buildNativeLibrary(
headerFilter = headerFilter
)
}
private fun parseKeyValuePairs(
argumentValue: List<String>,
): Map<String, String> = argumentValue.mapNotNull {
val keyValueSeparatorIndex = it.indexOf('=')
if (keyValueSeparatorIndex > 0) {
it.substringBefore('=') to it.substringAfter('=')
} else {
warn("incorrect property format: expected '<key>=<value>', got '$it'")
null
}
}.toMap()