From b48850c993e9fd7c05ba0d07995f55252585ff80 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Thu, 29 Apr 2021 14:09:46 +0200 Subject: [PATCH] [Commonizer] Logging: Implement CommonizerLogLevel and hide verbose output by default ^KT-36679 Fixed --- .../org/jetbrains/kotlin/util/WithLogger.kt | 2 +- .../kotlin/gradle/plugin/KotlinProperties.kt | 4 ++++ .../native/internal/CInteropCommonizerTask.kt | 3 ++- .../native/internal/CommonizerLogLevel.kt | 20 ++++++++++++++++ ...rchicalNativeDistributionCommonizerTask.kt | 3 +++ .../kotlin/commonizer/CliCommonizer.kt | 4 +++- .../jetbrains/kotlin/commonizer/Commonizer.kt | 3 ++- .../kotlin/commonizer/CommonizerLogLevel.kt | 11 +++++++++ .../kotlin/commonizer/cli/CliLoggerAdapter.kt | 24 +++++++++++++------ .../commonizer/cli/LogLevelOptionType.kt | 18 ++++++++++++++ .../jetbrains/kotlin/commonizer/cli/Task.kt | 2 +- .../kotlin/commonizer/cli/TaskType.kt | 4 +++- .../kotlin/commonizer/cli/nativeTasks.kt | 18 +++++++------- .../kotlin/commonizer/utils/ProgressLogger.kt | 3 ++- 14 files changed, 97 insertions(+), 22 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerLogLevel.kt create mode 100644 native/commonizer-api/src/org/jetbrains/kotlin/commonizer/CommonizerLogLevel.kt create mode 100644 native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/LogLevelOptionType.kt diff --git a/compiler/util-io/src/org/jetbrains/kotlin/util/WithLogger.kt b/compiler/util-io/src/org/jetbrains/kotlin/util/WithLogger.kt index 12c0ce919ba..df03ffc5863 100644 --- a/compiler/util-io/src/org/jetbrains/kotlin/util/WithLogger.kt +++ b/compiler/util-io/src/org/jetbrains/kotlin/util/WithLogger.kt @@ -21,4 +21,4 @@ object DummyLogger : Logger { println("e: $message") exitProcess(1) } -} \ No newline at end of file +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index 5c7cc849f4e..7579c175afd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -224,6 +224,10 @@ internal class PropertiesProvider private constructor(private val project: Proje val enableCInteropCommonization: Boolean get() = booleanProperty("kotlin.mpp.enableCInteropCommonization") ?: false + + val commonizerLogLevel: String? + get() = property("kotlin.mpp.commonizerLogLevel") + /** * Enables experimental commonization of 'higher level' shared native source sets */ diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt index e79135cfdbe..47f6152ffd6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt @@ -100,7 +100,8 @@ internal open class CInteropCommonizerTask : AbstractCInteropCommonizerTask() { inputLibraries = cinteropsForTarget.map { it.libraryFile.get() }.filter { it.exists() }.toSet(), dependencyLibraries = cinteropsForTarget.flatMap { it.dependencies.files }.map(::NonTargetedCommonizerDependency).toSet() + nativeDistributionDependencies(parameters), - outputDirectory = outputDirectory(parameters) + outputDirectory = outputDirectory(parameters), + logLevel = project.commonizerLogLevel ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerLogLevel.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerLogLevel.kt new file mode 100644 index 00000000000..0bb285f75c1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerLogLevel.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2021 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.gradle.targets.native.internal + +import org.gradle.api.Project +import org.jetbrains.kotlin.commonizer.CommonizerLogLevel +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider + +internal val Project.commonizerLogLevel: CommonizerLogLevel + get() { + PropertiesProvider(this).commonizerLogLevel?.let { logLevelString -> + val matchingLevel = CommonizerLogLevel.values().firstOrNull { logLevel -> logLevel.name.equals(logLevelString, true) } + if (matchingLevel != null) return matchingLevel + } + + return if (logger.isInfoEnabled) CommonizerLogLevel.Info else CommonizerLogLevel.Quiet + } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalNativeDistributionCommonizerTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalNativeDistributionCommonizerTask.kt index 4f239bcb741..784fc80d171 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalNativeDistributionCommonizerTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalNativeDistributionCommonizerTask.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.native.internal import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.tasks.* +import org.jetbrains.kotlin.commonizer.CommonizerLogLevel import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget import org.jetbrains.kotlin.commonizer.identityString import org.jetbrains.kotlin.commonizer.isAncestorOf @@ -106,6 +107,8 @@ internal open class HierarchicalNativeDistributionCommonizerTask : DefaultTask() this += getRootOutputDirectory(target).absolutePath this += "-output-commonizer-target" this += target.identityString + this += "-log-level" + this += project.commonizerLogLevel.name } } } diff --git a/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/CliCommonizer.kt b/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/CliCommonizer.kt index 8dd0042f641..6cdd491a111 100644 --- a/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/CliCommonizer.kt +++ b/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/CliCommonizer.kt @@ -27,7 +27,8 @@ public class CliCommonizer(private val executor: Executor) : Commonizer { inputLibraries: Set, dependencyLibraries: Set, outputCommonizerTarget: SharedCommonizerTarget, - outputDirectory: File + outputDirectory: File, + logLevel: CommonizerLogLevel ) { if (inputLibraries.isEmpty()) return val arguments = mutableListOf().apply { @@ -39,6 +40,7 @@ public class CliCommonizer(private val executor: Executor) : Commonizer { if (dependencyLibraries.isNotEmpty()) { add("-dependency-libraries"); add(dependencyLibraries.joinToString(";")) } + add("-log-level"); add(logLevel.name.lowercase()) } executor(arguments) } diff --git a/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/Commonizer.kt b/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/Commonizer.kt index 25b2191f9af..3f6e7ff13a5 100644 --- a/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/Commonizer.kt +++ b/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/Commonizer.kt @@ -15,6 +15,7 @@ public interface Commonizer : Serializable { inputLibraries: Set, dependencyLibraries: Set, outputCommonizerTarget: SharedCommonizerTarget, - outputDirectory: File + outputDirectory: File, + logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet ) } diff --git a/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/CommonizerLogLevel.kt b/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/CommonizerLogLevel.kt new file mode 100644 index 00000000000..ae90f861979 --- /dev/null +++ b/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/CommonizerLogLevel.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2010-2021 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 + +public enum class CommonizerLogLevel { + Quiet, + Info +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/CliLoggerAdapter.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/CliLoggerAdapter.kt index 31a9d4471ac..9035d536e84 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/CliLoggerAdapter.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/CliLoggerAdapter.kt @@ -5,24 +5,34 @@ package org.jetbrains.kotlin.commonizer.cli +import org.jetbrains.kotlin.commonizer.CommonizerLogLevel import org.jetbrains.kotlin.util.Logger import kotlin.system.exitProcess -internal class CliLoggerAdapter(indentSize: Int = 0) : Logger { + +internal class CliLoggerAdapter( + private val level: CommonizerLogLevel, + indentSize: Int = 0 +) : Logger { private val indent = " ".repeat(indentSize) - override fun log(message: String) = printlnIndented(message) + override fun log(message: String) = printlnIndented(message, CommonizerLogLevel.Info) - override fun warning(message: String) = printlnIndented("Warning: $message") + override fun warning(message: String) = printlnIndented("Warning: $message", *CommonizerLogLevel.values()) override fun error(message: String) = fatal(message) override fun fatal(message: String): Nothing { - printlnIndented("Error: $message\n") + printlnIndented("Error: $message\n", *CommonizerLogLevel.values()) exitProcess(1) } - private fun printlnIndented(text: String) = - if (indent.isEmpty()) println(text) - else text.split('\n').forEach { println(indent + it) } + private fun printlnIndented(text: String, vararg levels: CommonizerLogLevel) { + if (level in levels) { + if (indent.isEmpty()) println(text) + else text.split('\n').forEach { + println(indent + it) + } + } + } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/LogLevelOptionType.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/LogLevelOptionType.kt new file mode 100644 index 00000000000..331c2ceddee --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/LogLevelOptionType.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2021 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 + +import org.jetbrains.kotlin.commonizer.CommonizerLogLevel + +internal object LogLevelOptionType : OptionType("log-level", "{quiet, info}", false) { + override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option { + return when (rawValue.lowercase().trim()) { + "quiet" -> Option(this, CommonizerLogLevel.Quiet) + "info" -> Option(this, CommonizerLogLevel.Info) + else -> Option(this, CommonizerLogLevel.Quiet) + } + } +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/Task.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/Task.kt index 9f1f051984a..197558d4eda 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/Task.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/Task.kt @@ -17,7 +17,7 @@ internal abstract class Task(private val options: Collection>) : Compa INFORMATIONAL, COMMONIZATION( prologue = null, - epilogue = "\n", + epilogue = null, logEachStep = true ) } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/TaskType.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/TaskType.kt index e0ccc8ae22c..a5a5e5b4104 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/TaskType.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/TaskType.kt @@ -29,7 +29,8 @@ internal enum class TaskType( "Boolean (default false);\nwhether to copy Kotlin/Native endorsed libraries to the destination", mandatory = false ), - StatsTypeOptionType + StatsTypeOptionType, + LogLevelOptionType, ), ::NativeDistributionCommonize ), @@ -52,6 +53,7 @@ internal enum class TaskType( InputLibrariesOptionType, DependencyLibrariesOptionType, OutputCommonizerTargetOptionType, + LogLevelOptionType ), ::NativeKlibCommonize ) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/nativeTasks.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/nativeTasks.kt index ec85c783d06..ea3a4623fce 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/nativeTasks.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/nativeTasks.kt @@ -50,12 +50,14 @@ internal class NativeKlibCommonize(options: Collection>) : Task(option val dependencyLibraries = getOptional, DependencyLibrariesOptionType>().orEmpty() val outputCommonizerTarget = compatGetOutputTarget() val statsType = getOptional { it == "log-stats" } ?: StatsType.NONE + val logLevel = getOptional() ?: CommonizerLogLevel.Quiet + val konanTargets = outputCommonizerTarget.konanTargets val commonizerTargets = konanTargets.map(::CommonizerTarget) - val progressLogger = ProgressLogger(CliLoggerAdapter(2)) - val libraryLoader = DefaultNativeLibraryLoader(progressLogger) + val logger = ProgressLogger(CliLoggerAdapter(logLevel, 2)) + val libraryLoader = DefaultNativeLibraryLoader(logger) val statsCollector = StatsCollector(statsType, commonizerTargets) val repository = FilesRepository(targetLibraries.toSet(), libraryLoader) @@ -74,7 +76,7 @@ internal class NativeKlibCommonize(options: Collection>) : Task(option CommonizerDependencyRepository(dependencyLibraries.toSet(), libraryLoader), resultsConsumer = resultsConsumer, statsCollector = statsCollector, - progressLogger = progressLogger + progressLogger = logger ).run() statsCollector?.writeTo(FileStatsOutput(destination, statsType.name.lowercase())) @@ -97,9 +99,10 @@ internal class NativeDistributionCommonize(options: Collection>) : Tas val copyStdlib = getOptional { it == "copy-stdlib" } ?: false val copyEndorsedLibs = getOptional { it == "copy-endorsed-libs" } ?: false val statsType = getOptional { it == "log-stats" } ?: StatsType.NONE + val logLevel = getOptional() ?: CommonizerLogLevel.Quiet - val progressLogger = ProgressLogger(CliLoggerAdapter(2)) - val libraryLoader = DefaultNativeLibraryLoader(progressLogger) + val logger = ProgressLogger(CliLoggerAdapter(logLevel, 2)) + val libraryLoader = DefaultNativeLibraryLoader(logger) val repository = KonanDistributionRepository(distribution, outputTarget.konanTargets, libraryLoader) val statsCollector = StatsCollector(statsType, outputTarget.withAllAncestors().toList()) @@ -112,8 +115,7 @@ internal class NativeDistributionCommonize(options: Collection>) : Tas } val descriptionSuffix = estimateLibrariesCount(repository, outputTarget.allLeaves()).let { " ($it items)" } - val description = "${logPrefix}Preparing commonized Kotlin/Native libraries for $outputTarget$descriptionSuffix" - println(description) + logger.log("${logPrefix}Preparing commonized Kotlin/Native libraries for $outputTarget$descriptionSuffix") LibraryCommonizer( outputTarget = outputTarget, @@ -121,7 +123,7 @@ internal class NativeDistributionCommonize(options: Collection>) : Tas dependencies = StdlibRepository(distribution, libraryLoader), resultsConsumer = resultsConsumer, statsCollector = statsCollector, - progressLogger = progressLogger + progressLogger = logger ).run() statsCollector?.writeTo(FileStatsOutput(destination, statsType.name.lowercase())) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/utils/ProgressLogger.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/utils/ProgressLogger.kt index 1279d44dedb..801e05f30a0 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/utils/ProgressLogger.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/utils/ProgressLogger.kt @@ -6,10 +6,11 @@ package org.jetbrains.kotlin.commonizer.utils import org.jetbrains.kotlin.commonizer.cli.CliLoggerAdapter +import org.jetbrains.kotlin.commonizer.CommonizerLogLevel import org.jetbrains.kotlin.util.Logger class ProgressLogger( - private val wrapped: Logger = CliLoggerAdapter(0), + private val wrapped: Logger = CliLoggerAdapter(CommonizerLogLevel.Info, 0), private val indent: Int = 0, ) : Logger by wrapped { private val clockMark = ResettableClockMark()