[Commonizer] move commonizer setting keys to the commonizer-cli module

Get rid of `OptionAlias` as unnecessary; keys will be used directly
This commit is contained in:
Pavel Kirpichenkov
2022-01-26 20:47:12 +03:00
parent b17737d7de
commit a220624769
25 changed files with 83 additions and 100 deletions
@@ -6,16 +6,12 @@
package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.OutputDirectory
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.base64Hash
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.ensureMaxFileNameLength
import org.jetbrains.kotlin.commonizer.AdditionalCommonizerSetting
import org.jetbrains.kotlin.commonizer.cli.OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_OPTION_ALIAS
import org.jetbrains.kotlin.commonizer.identityString
import org.jetbrains.kotlin.commonizer.setTo
import org.jetbrains.kotlin.gradle.utils.outputFilesProvider
import java.io.File
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.Project
import org.jetbrains.kotlin.commonizer.AdditionalCommonizerSetting
import org.jetbrains.kotlin.commonizer.CommonizerLogLevel
import org.jetbrains.kotlin.commonizer.cli.OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_OPTION_ALIAS
import org.jetbrains.kotlin.commonizer.OptimisticNumberCommonizationEnabledKey
import org.jetbrains.kotlin.commonizer.setTo
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
@@ -22,7 +22,7 @@ internal val Project.commonizerLogLevel: CommonizerLogLevel
return if (logger.isInfoEnabled) CommonizerLogLevel.Info else CommonizerLogLevel.Quiet
}
internal val Project.additionalCommonizerSettings: List<AdditionalCommonizerSetting>
internal val Project.additionalCommonizerSettings: List<AdditionalCommonizerSetting<*>>
get() = listOf(
OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_OPTION_ALIAS setTo isOptimisticNumberCommonizationEnabled
OptimisticNumberCommonizationEnabledKey setTo isOptimisticNumberCommonizationEnabled
)
@@ -27,7 +27,7 @@ internal class NativeDistributionCommonizationCache(
outputDirectory: File,
outputTargets: Set<SharedCommonizerTarget>,
logLevel: CommonizerLogLevel,
additionalSettings: List<AdditionalCommonizerSetting>,
additionalSettings: List<AdditionalCommonizerSetting<*>>,
) {
if (!project.isNativeDistributionCommonizationCacheEnabled) {
logInfo("Cache disabled")
@@ -29,21 +29,21 @@ public class CliCommonizer(private val executor: Executor) : NativeDistributionC
outputTargets: Set<SharedCommonizerTarget>,
outputDirectory: File,
logLevel: CommonizerLogLevel,
additionalSettings: List<AdditionalCommonizerSetting>,
additionalSettings: List<AdditionalCommonizerSetting<*>>,
) {
if (inputLibraries.isEmpty()) return
val arguments = mutableListOf<String>().apply {
add("native-klib-commonize")
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)
add("-$NATIVE_DISTRIBUTION_PATH_ALIAS"); add(konanHome.absolutePath)
add("-$INPUT_LIBRARIES_ALIAS"); add(inputLibraries.joinToString(";") { it.absolutePath })
add("-$OUTPUT_COMMONIZER_TARGETS_ALIAS"); add(outputTargets.joinToString(";") { it.identityString })
add("-$OUTPUT_PATH_ALIAS"); add(outputDirectory.absolutePath)
if (dependencyLibraries.isNotEmpty()) {
add(DEPENDENCY_LIBRARIES_OPTION_ALIAS.argumentString); add(dependencyLibraries.joinToString(";"))
add("-$DEPENDENCY_LIBRARIES_ALIAS"); 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_ALIAS"); add(logLevel.name.lowercase())
for ((settingKey, settingValue) in additionalSettings) {
add("-${settingKey.alias}"); add(settingValue.toString())
}
}
executor(arguments)
@@ -54,16 +54,16 @@ public class CliCommonizer(private val executor: Executor) : NativeDistributionC
outputDirectory: File,
outputTargets: Set<SharedCommonizerTarget>,
logLevel: CommonizerLogLevel,
additionalSettings: List<AdditionalCommonizerSetting>,
additionalSettings: List<AdditionalCommonizerSetting<*>>,
) {
val arguments = mutableListOf<String>().apply {
add("native-dist-commonize")
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())
add("-$NATIVE_DISTRIBUTION_PATH_ALIAS"); add(konanHome.absolutePath)
add("-$OUTPUT_PATH_ALIAS"); add(outputDirectory.absolutePath)
add("-$OUTPUT_COMMONIZER_TARGETS_ALIAS"); add(outputTargets.joinToString(";") { it.identityString })
add("-$LOG_LEVEL_ALIAS"); add(logLevel.name.lowercase())
for ((settingKey, settingValue) in additionalSettings) {
add("-${settingKey.alias}"); add(settingValue.toString())
}
}
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.commonizer
import org.jetbrains.kotlin.commonizer.cli.OptionAlias
import java.io.File
import java.io.Serializable
@@ -18,7 +17,7 @@ public interface CInteropCommonizer : Serializable {
outputTargets: Set<SharedCommonizerTarget>,
outputDirectory: File,
logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet,
additionalSettings: List<AdditionalCommonizerSetting> = emptyList(),
additionalSettings: List<AdditionalCommonizerSetting<*>> = emptyList(),
)
}
@@ -29,14 +28,14 @@ public interface NativeDistributionCommonizer : Serializable {
outputDirectory: File,
outputTargets: Set<SharedCommonizerTarget>,
logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet,
additionalSettings: List<AdditionalCommonizerSetting> = emptyList(),
additionalSettings: List<AdditionalCommonizerSetting<*>> = emptyList(),
)
}
public data class AdditionalCommonizerSetting(
public val key: String,
public val value: Any,
public data class AdditionalCommonizerSetting<T : Any>(
public val key: CommonizerSettings.Key<T>,
public val value: T,
)
public infix fun OptionAlias.setTo(settingValue: Any): AdditionalCommonizerSetting =
AdditionalCommonizerSetting(this.argumentString, settingValue)
public infix fun <T : Any> CommonizerSettings.Key<T>.setTo(settingValue: T): AdditionalCommonizerSetting<T> =
AdditionalCommonizerSetting(this, settingValue)
@@ -0,0 +1,24 @@
/*
* 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
import org.jetbrains.kotlin.commonizer.cli.OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_ALIAS
public interface CommonizerSettings {
public sealed class Key<T : Any> {
public abstract val defaultValue: T
public abstract val alias: String
}
public fun <T : Any> getSetting(key: Key<T>): T
}
public object OptimisticNumberCommonizationEnabledKey : CommonizerSettings.Key<Boolean>() {
override val defaultValue: Boolean = true
override val alias: String
get() = OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_ALIAS
}
@@ -7,37 +7,16 @@ 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)
public const val DEPENDENCY_LIBRARIES_ALIAS: String = "dependency-libraries"
public const val INPUT_LIBRARIES_ALIAS: String = "input-libraries"
public const val LOG_LEVEL_ALIAS: String = "log-level"
public const val NATIVE_DISTRIBUTION_PATH_ALIAS: String = "distribution-path"
public const val OUTPUT_COMMONIZER_TARGETS_ALIAS: String = "output-targets"
public const val OUTPUT_PATH_ALIAS: String = "output-path"
public const val STATS_TYPE_ALIAS: String = "log-stats"
public const val NATIVE_TARGETS_ALIAS: String = "targets"
public const val COPY_STDLIB_ALIAS: String = "copy-stdlib"
public const val COPY_ENDORSED_LIBS_ALIAS: String = "copy-endorsed-libs"
// 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
}
public const val OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_ALIAS: String = "optimistic-numbers"
@@ -5,19 +5,6 @@
package org.jetbrains.kotlin.commonizer
interface CommonizerSettings {
sealed class Key<T : Any> {
abstract val defaultValue: T
}
fun <T : Any> getSetting(key: Key<T>): T
}
object OptimisticNumberCommonizationEnabledKey : CommonizerSettings.Key<Boolean>() {
override val defaultValue: Boolean = true
}
internal object DefaultCommonizerSettings : CommonizerSettings {
override fun <T : Any> getSetting(key: CommonizerSettings.Key<T>): T {
return key.defaultValue
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.commonizer.cli
internal class BooleanOptionType(
alias: OptionAlias,
alias: String,
description: String,
mandatory: Boolean
) : OptionType<Boolean>(alias, description, mandatory) {
@@ -8,11 +8,10 @@ package org.jetbrains.kotlin.commonizer.cli
import org.jetbrains.kotlin.commonizer.CommonizerSettings
internal sealed class CommonizerSettingOptionType<T : Any>(
alias: OptionAlias,
val commonizerSettingKey: CommonizerSettings.Key<T>,
description: String,
val commonizerSettingKey: CommonizerSettings.Key<T>
) : OptionType<T>(
alias,
commonizerSettingKey.alias,
description,
mandatory = false,
)
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.commonizer.parseCommonizerDependency
internal abstract class DependenciesLibrariesSetOptionType(
mandatory: Boolean,
alias: OptionAlias,
alias: String,
description: String
) : OptionType<List<CommonizerDependency>>(
mandatory = mandatory,
@@ -7,6 +7,6 @@ package org.jetbrains.kotlin.commonizer.cli
internal object DependencyLibrariesOptionType : DependenciesLibrariesSetOptionType(
mandatory = false,
alias = DEPENDENCY_LIBRARIES_OPTION_ALIAS,
alias = DEPENDENCY_LIBRARIES_ALIAS,
description = "';' separated list of klib file paths that can be used as dependency"
)
@@ -7,6 +7,6 @@ package org.jetbrains.kotlin.commonizer.cli
internal object InputLibrariesOptionType : LibrariesSetOptionType(
mandatory = true,
alias = INPUT_LIBRARIES_OPTION_ALIAS,
alias = INPUT_LIBRARIES_ALIAS,
description = "';' separated list of klib file paths that will get commonized"
)
@@ -9,7 +9,7 @@ import java.io.File
internal abstract class LibrariesSetOptionType(
mandatory: Boolean,
alias: OptionAlias,
alias: String,
description: String
) : OptionType<List<File>>(
mandatory = mandatory,
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.commonizer.cli
import org.jetbrains.kotlin.commonizer.CommonizerLogLevel
internal object LogLevelOptionType : OptionType<CommonizerLogLevel>(LOG_LEVEL_OPTION_ALIAS, "{quiet, info}", false) {
internal object LogLevelOptionType : OptionType<CommonizerLogLevel>(LOG_LEVEL_ALIAS, "{quiet, info}", false) {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<CommonizerLogLevel> {
return when (rawValue.lowercase().trim()) {
"quiet" -> Option(this, CommonizerLogLevel.Quiet)
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.commonizer.cli
import java.io.File
internal object NativeDistributionOptionType : OptionType<File>(NATIVE_DISTRIBUTION_OPTION_ALIAS, "Path to the Kotlin/Native distribution") {
internal object NativeDistributionOptionType : OptionType<File>(NATIVE_DISTRIBUTION_PATH_ALIAS, "Path to the Kotlin/Native distribution") {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<File> {
val file = File(rawValue)
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.konan.target.KonanTarget.Companion.predefinedTargets
internal object NativeTargetsOptionType : OptionType<List<KonanTarget>>(
NATIVE_TARGETS_OPTION_ALIAS, "Comma-separated list of hardware targets", mandatory = false
NATIVE_TARGETS_ALIAS, "Comma-separated list of hardware targets", mandatory = false
) {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<List<KonanTarget>> {
val targetNames = rawValue.split(',')
@@ -8,9 +8,8 @@ package org.jetbrains.kotlin.commonizer.cli
import org.jetbrains.kotlin.commonizer.OptimisticNumberCommonizationEnabledKey
internal object OptimisticNumberCommonizationOptionType : CommonizerSettingOptionType<Boolean>(
OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_OPTION_ALIAS,
"Boolean (default true)\nEnable commonization of integer types with different bit width to the most narrow among them",
OptimisticNumberCommonizationEnabledKey,
"Boolean (default true)\nEnable commonization of integer types with different bit width to the most narrow among them",
) {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<Boolean> =
Option(this, parseBoolean(rawValue, onError))
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.commonizer.cli
internal abstract class OptionType<T>(
val alias: OptionAlias,
val alias: String,
val description: String,
val mandatory: Boolean = true
) {
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.commonizer.parseCommonizerTarget
internal object OutputCommonizerTargetsOptionType : OptionType<Set<SharedCommonizerTarget>>(
alias = OUTPUT_COMMONIZER_TARGET_OPTION_ALIAS,
alias = OUTPUT_COMMONIZER_TARGETS_ALIAS,
description = "All output targets separated with ';'",
mandatory = true
) {
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.commonizer.cli
import java.io.File
internal object OutputOptionType : OptionType<File>(OUTPUT_OPTION_ALIAS, "Destination for commonized libraries") {
internal object OutputOptionType : OptionType<File>(OUTPUT_PATH_ALIAS, "Destination for commonized libraries") {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<File> {
val file = File(rawValue)
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.commonizer.cli
import org.jetbrains.kotlin.commonizer.stats.StatsType
internal object StatsTypeOptionType : OptionType<StatsType>(STATS_TYPE_OPTION_ALIAS, DESCRIPTION, mandatory = false) {
internal object StatsTypeOptionType : OptionType<StatsType>(STATS_TYPE_ALIAS, DESCRIPTION, mandatory = false) {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<StatsType> {
val value = StatsType.values().firstOrNull { it.name.equals(rawValue, ignoreCase = true) }
?: onError("Invalid stats type: $rawValue")
@@ -30,7 +30,7 @@ internal abstract class Task(private val options: Collection<Option<*>>) : Compa
abstract fun execute(logPrefix: String = "")
protected inline fun <reified T, reified O : OptionType<T>> getMandatory(nameFilter: (String) -> Boolean = { true }): T {
val option = options.filter { it.type is O }.single { nameFilter(it.type.alias.aliasString) }
val option = options.filter { it.type is O }.single { nameFilter(it.type.alias) }
check(option.type.mandatory)
@Suppress("UNCHECKED_CAST")
@@ -38,7 +38,7 @@ internal abstract class Task(private val options: Collection<Option<*>>) : Compa
}
internal inline fun <reified T, reified O : OptionType<T>> getOptional(nameFilter: (String) -> Boolean = { true }): T? {
val option = options.filter { it.type is O }.singleOrNull { nameFilter(it.type.alias.aliasString) }
val option = options.filter { it.type is O }.singleOrNull { nameFilter(it.type.alias) }
if (option != null) check(!option.type.mandatory)
@Suppress("UNCHECKED_CAST")
@@ -20,12 +20,12 @@ internal enum class TaskType(
NativeTargetsOptionType,
OutputCommonizerTargetsOptionType,
BooleanOptionType(
COPY_STDLIB_OPTION_ALIAS,
COPY_STDLIB_ALIAS,
"Boolean (default false);\nwhether to copy Kotlin/Native endorsed libraries to the destination",
mandatory = false
),
BooleanOptionType(
COPY_ENDORSED_LIBS_OPTION_ALIAS,
COPY_ENDORSED_LIBS_ALIAS,
"Boolean (default false);\nwhether to copy Kotlin/Native endorsed libraries to the destination",
mandatory = false
),
@@ -46,7 +46,7 @@ private fun parseTask(
tasks: MutableList<Task>
): String? {
val taskType = TaskType.getByAlias(taskAlias) ?: printUsageAndExit("Unknown task $taskAlias")
val optionTypes = taskType.optionTypes.associateBy { it.alias.aliasString }
val optionTypes = taskType.optionTypes.associateBy { it.alias }
val options = mutableMapOf<String, Option<*>>()
fun buildOngoingTask() {
@@ -117,7 +117,7 @@ private fun printUsageAndExit(errorMessage: String? = null): Nothing {
println(formatLeft(1, if (taskType.optionTypes.isNotEmpty()) "Options:" else "No options."))
for (optionType in taskType.optionTypes) {
val lines = optionType.description.split('\n')
println(formatBoth(2, "-${optionType.alias.aliasString}", lines.first()))
println(formatBoth(2, "-${optionType.alias}", lines.first()))
lines.drop(1).forEach { println(StringBuilder().formatRight(it)) }
}
println()