[Commonizer] Introduce commonizer settings

Add settings for a more fine-grained control over commonizer features
that will be added in the future

Add setting and KGP flag for optimistic number commonization

KT-51011
This commit is contained in:
Pavel Kirpichenkov
2022-01-17 12:11:22 +03:00
parent 1aea2d0437
commit 2609175d58
56 changed files with 615 additions and 237 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.commonizer
import org.jetbrains.kotlin.commonizer.cli.*
import java.io.File
import java.net.URLClassLoader
@@ -27,19 +28,23 @@ public class CliCommonizer(private val executor: Executor) : NativeDistributionC
dependencyLibraries: Set<CommonizerDependency>,
outputTargets: Set<SharedCommonizerTarget>,
outputDirectory: File,
logLevel: CommonizerLogLevel
logLevel: CommonizerLogLevel,
additionalSettings: List<AdditionalCommonizerSetting>,
) {
if (inputLibraries.isEmpty()) return
val arguments = mutableListOf<String>().apply {
add("native-klib-commonize")
add("-distribution-path"); add(konanHome.absolutePath)
add("-input-libraries"); add(inputLibraries.joinToString(";") { it.absolutePath })
add("-output-targets"); add(outputTargets.joinToString(";") { it.identityString })
add("-output-path"); add(outputDirectory.absolutePath)
add(NATIVE_DISTRIBUTION_OPTION_ALIAS.argumentString); add(konanHome.absolutePath)
add(INPUT_LIBRARIES_OPTION_ALIAS.argumentString); add(inputLibraries.joinToString(";") { it.absolutePath })
add(OUTPUT_COMMONIZER_TARGET_OPTION_ALIAS.argumentString); add(outputTargets.joinToString(";") { it.identityString })
add(OUTPUT_OPTION_ALIAS.argumentString); add(outputDirectory.absolutePath)
if (dependencyLibraries.isNotEmpty()) {
add("-dependency-libraries"); add(dependencyLibraries.joinToString(";"))
add(DEPENDENCY_LIBRARIES_OPTION_ALIAS.argumentString); add(dependencyLibraries.joinToString(";"))
}
add(LOG_LEVEL_OPTION_ALIAS.argumentString); add(logLevel.name.lowercase())
for ((settingArgument, settingValue) in additionalSettings) {
add(settingArgument); add(settingValue.toString())
}
add("-log-level"); add(logLevel.name.lowercase())
}
executor(arguments)
}
@@ -48,14 +53,18 @@ public class CliCommonizer(private val executor: Executor) : NativeDistributionC
konanHome: File,
outputDirectory: File,
outputTargets: Set<SharedCommonizerTarget>,
logLevel: CommonizerLogLevel
logLevel: CommonizerLogLevel,
additionalSettings: List<AdditionalCommonizerSetting>,
) {
val arguments = mutableListOf<String>().apply {
add("native-dist-commonize")
add("-distribution-path"); add(konanHome.absolutePath)
add("-output-path"); add(outputDirectory.absolutePath)
add("-output-targets"); add(outputTargets.joinToString(";") { it.identityString })
add("-log-level"); add(logLevel.name.lowercase())
add(NATIVE_DISTRIBUTION_OPTION_ALIAS.argumentString); add(konanHome.absolutePath)
add(OUTPUT_OPTION_ALIAS.argumentString); add(outputDirectory.absolutePath)
add(OUTPUT_COMMONIZER_TARGET_OPTION_ALIAS.argumentString); add(outputTargets.joinToString(";") { it.identityString })
add(LOG_LEVEL_OPTION_ALIAS.argumentString); add(logLevel.name.lowercase())
for ((settingArgument, settingValue) in additionalSettings) {
add(settingArgument); add(settingValue.toString())
}
}
executor(arguments)
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.commonizer
import org.jetbrains.kotlin.commonizer.cli.OptionAlias
import java.io.File
import java.io.Serializable
@@ -16,7 +17,8 @@ public interface CInteropCommonizer : Serializable {
dependencyLibraries: Set<CommonizerDependency>,
outputTargets: Set<SharedCommonizerTarget>,
outputDirectory: File,
logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet
logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet,
additionalSettings: List<AdditionalCommonizerSetting> = emptyList(),
)
}
@@ -26,6 +28,15 @@ public interface NativeDistributionCommonizer : Serializable {
konanHome: File,
outputDirectory: File,
outputTargets: Set<SharedCommonizerTarget>,
logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet
logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet,
additionalSettings: List<AdditionalCommonizerSetting> = emptyList(),
)
}
}
public data class AdditionalCommonizerSetting(
public val key: String,
public val value: Any,
)
public infix fun OptionAlias.setTo(settingValue: Any): AdditionalCommonizerSetting =
AdditionalCommonizerSetting(this.argumentString, settingValue)
@@ -0,0 +1,43 @@
/*
* Copyright 2010-2022 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.commonizer.cli
// General
private const val DEPENDENCY_LIBRARIES_ALIAS: String = "dependency-libraries"
private const val INPUT_LIBRARIES_ALIAS: String = "input-libraries"
private const val LOG_LEVEL_ALIAS: String = "log-level"
private const val NATIVE_DISTRIBUTION_PATH_ALIAS: String = "distribution-path"
private const val OUTPUT_COMMONIZER_TARGETS_ALIAS: String = "output-targets"
private const val OUTPUT_PATH_ALIAS: String = "output-path"
private const val STATS_TYPE_ALIAS: String = "log-stats"
private const val NATIVE_TARGETS_ALIAS: String = "targets"
private const val COPY_STDLIB_ALIAS: String = "copy-stdlib"
private const val COPY_ENDORSED_LIBS_ALIAS: String = "copy-endorsed-libs"
public val DEPENDENCY_LIBRARIES_OPTION_ALIAS: OptionAlias = OptionAlias(DEPENDENCY_LIBRARIES_ALIAS)
public val INPUT_LIBRARIES_OPTION_ALIAS: OptionAlias = OptionAlias(INPUT_LIBRARIES_ALIAS)
public val LOG_LEVEL_OPTION_ALIAS: OptionAlias = OptionAlias(LOG_LEVEL_ALIAS)
public val NATIVE_DISTRIBUTION_OPTION_ALIAS: OptionAlias = OptionAlias(NATIVE_DISTRIBUTION_PATH_ALIAS)
public val OUTPUT_COMMONIZER_TARGET_OPTION_ALIAS: OptionAlias = OptionAlias(OUTPUT_COMMONIZER_TARGETS_ALIAS)
public val OUTPUT_OPTION_ALIAS: OptionAlias = OptionAlias(OUTPUT_PATH_ALIAS)
public val STATS_TYPE_OPTION_ALIAS: OptionAlias = OptionAlias(STATS_TYPE_ALIAS)
public val NATIVE_TARGETS_OPTION_ALIAS: OptionAlias = OptionAlias(NATIVE_TARGETS_ALIAS)
public val COPY_STDLIB_OPTION_ALIAS: OptionAlias = OptionAlias(COPY_STDLIB_ALIAS)
public val COPY_ENDORSED_LIBS_OPTION_ALIAS: OptionAlias = OptionAlias(COPY_ENDORSED_LIBS_ALIAS)
// Commonizer settings
private const val OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_ALIAS: String = "optimistic-numbers"
public val OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_OPTION_ALIAS: OptionAlias = OptionAlias(OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_ALIAS)
@JvmInline
public value class OptionAlias(public val aliasString: String) {
public val argumentString: String
get() = "-$aliasString"
override fun toString(): String = aliasString
}
@@ -24,7 +24,8 @@ class CliCommonizerTest {
inputLibraries = emptySet(),
dependencyLibraries = emptySet(),
outputTargets = setOf(CommonizerTarget(KonanTarget.LINUX_X64, KonanTarget.MACOS_X64)),
outputDirectory = temporaryOutputDirectory.root
outputDirectory = temporaryOutputDirectory.root,
additionalSettings = emptyList(),
)
}
}