Added build metrics for Kotlin/Native tasks

#KT-58315 Fixed

Co-authored-by: Nataliya Valtman <Nataliya.Valtman@jetbrains.com>


Merge-request: KT-MR-11343
Merged-by: Dmitrii Krasnov <Dmitrii.Krasnov@jetbrains.com>
This commit is contained in:
Nataliya.Valtman
2023-08-08 07:43:18 +00:00
committed by Space Team
parent 7cbf3b28ca
commit 2719dd188f
24 changed files with 530 additions and 265 deletions
@@ -50,6 +50,9 @@ enum class JpsBuildTime(private val parent: JpsBuildTime? = null, private val re
@Suppress("Reformat")
enum class GradleBuildTime(private val parent: GradleBuildTime? = null, private val readableString: String) : BuildTime {
// We use tabs to organize the hierarchy of metrics,
// that's why the formatter is disabled.
// @formatter:off
GRADLE_TASK(readableString = "Total Gradle task time"),
GRADLE_TASK_PREPARATION(readableString = "Spent time before task action"),
GRADLE_TASK_ACTION(readableString = "Task action"),
@@ -65,6 +68,9 @@ enum class GradleBuildTime(private val parent: GradleBuildTime? = null, private
CONNECT_TO_DAEMON(RUN_COMPILATION_IN_WORKER, "Connect to Kotlin daemon"),
CALCULATE_OUTPUT_SIZE(RUN_COMPILATION_IN_WORKER, "Calculate output size"),
RUN_COMPILATION(RUN_COMPILATION_IN_WORKER, "Run compilation"),
NATIVE_IN_PROCESS(RUN_COMPILATION, "Run native in process"),
RUN_ENTRY_POINT(NATIVE_IN_PROCESS, "Run entry point"),
NATIVE_IN_EXECUTOR(RUN_COMPILATION, "Run native in executor"),
NON_INCREMENTAL_COMPILATION_IN_PROCESS(RUN_COMPILATION, "Non incremental inprocess compilation"),
NON_INCREMENTAL_COMPILATION_OUT_OF_PROCESS(RUN_COMPILATION, "Non incremental out of process compilation"),
NON_INCREMENTAL_COMPILATION_DAEMON(RUN_COMPILATION, "Non incremental compilation in daemon"),
@@ -116,8 +122,8 @@ enum class GradleBuildTime(private val parent: GradleBuildTime? = null, private
SNAPSHOT_KOTLIN_CLASSES(parent = SNAPSHOT_CLASSES, "Snapshot Kotlin classes"),
SNAPSHOT_JAVA_CLASSES(parent = SNAPSHOT_CLASSES, "Snapshot Java classes"),
SAVE_CLASSPATH_ENTRY_SNAPSHOT(parent = CLASSPATH_ENTRY_SNAPSHOT_TRANSFORM, "Save classpath entry snapshot"),
;
// @formatter:on
override fun getReadableString(): String = readableString
override fun getParent(): BuildTime? = parent
@@ -130,7 +136,7 @@ enum class GradleBuildTime(private val parent: GradleBuildTime? = null, private
return entries
}
override fun getName(): String = this.name
override fun getName(): String = this.name
companion object {
const val serialVersionUID = 1L
@@ -15,9 +15,9 @@ import io.ktor.server.netty.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.util.*
import io.ktor.util.collections.*
import org.gradle.api.logging.LogLevel
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
import org.jetbrains.kotlin.build.report.statistics.*
import org.jetbrains.kotlin.gradle.report.BuildReportType
import org.jetbrains.kotlin.gradle.report.data.GradleCompileStatisticsData
@@ -28,13 +28,11 @@ import java.net.HttpURLConnection
import java.net.InetSocketAddress
import java.net.ServerSocket
import java.net.URL
import java.util.*
import java.util.concurrent.ArrayBlockingQueue
import java.util.concurrent.TimeUnit
import kotlin.test.*
@DisplayName("Build statistics")
@JvmGradlePluginTests
class BuildStatisticsWithKtorIT : KGPBaseTest() {
companion object {
@@ -152,6 +150,7 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
@DisplayName("Http build report request problems are logged only ones")
@GradleTest
@JvmGradlePluginTests
fun testHttpServiceWithBadRequest(gradleVersion: GradleVersion) {
runWithKtorService { port ->
project("incrementalMultiproject", gradleVersion) {
@@ -192,6 +191,7 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
@DisplayName("Validate mandatory field for http request body")
@GradleTest
@JvmGradlePluginTests
fun testHttpRequest(gradleVersion: GradleVersion) {
simpleTestHttpReport(gradleVersion) { taskData ->
assertContains(taskData.getTags(), StatTag.NON_INCREMENTAL)
@@ -208,6 +208,7 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
@DisplayName("Compiler arguments reporting can be disabled")
@GradleTest
@JvmGradlePluginTests
fun testDisablingCompilerArgumentsReporting(gradleVersion: GradleVersion) {
simpleTestHttpReport(gradleVersion, { project ->
project.gradleProperties.append(
@@ -231,6 +232,7 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
@DisplayName("Validate configuration cache tag")
@GradleTest
@JvmGradlePluginTests
fun testConfigurationCache(gradleVersion: GradleVersion) {
runWithKtorService { port ->
@@ -253,16 +255,24 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
StatTag.NON_INCREMENTAL,
StatTag.CONFIGURATION_CACHE,
StatTag.KOTLIN_1,
), taskData.getTags().sorted(),
),
taskData.getTags().sorted(),
)
assertEquals(
defaultBuildOptions.kotlinVersion, taskData.getKotlinVersion(),
"Unexpected kotlinVersion: ${taskData.getKotlinVersion()} instead of ${defaultBuildOptions.kotlinVersion}"
"Unexpected kotlinVersion: ${taskData.getKotlinVersion()} instead of ${defaultBuildOptions.kotlinVersion}"
)
}
validateTaskData(port) { taskData ->
assertEquals(":app:compileKotlin", taskData.getTaskName())
assertContentEquals(listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.NON_INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1), taskData.getTags().sorted())
assertContentEquals(
listOf(
StatTag.ARTIFACT_TRANSFORM,
StatTag.NON_INCREMENTAL,
StatTag.CONFIGURATION_CACHE,
StatTag.KOTLIN_1
), taskData.getTags().sorted()
)
assertEquals(
defaultBuildOptions.kotlinVersion, taskData.getKotlinVersion(),
"Unexpected kotlinVersion: ${taskData.getKotlinVersion()} instead of ${defaultBuildOptions.kotlinVersion}"
@@ -274,15 +284,86 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
//second build
validateTaskData(port) { taskData ->
assertEquals(":lib:compileKotlin", taskData.getTaskName())
assertContentEquals(listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1), taskData.getTags().sorted())
assertContentEquals(
listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1),
taskData.getTags().sorted()
)
}
validateTaskData(port) { taskData ->
assertEquals(":app:compileKotlin", taskData.getTaskName())
assertContentEquals(listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1), taskData.getTags().sorted())
assertContentEquals(
listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1),
taskData.getTags().sorted()
)
}
}
}
@DisplayName("Build reports for native")
@GradleTest
@NativeGradlePluginTests
fun buildReportForNative(gradleVersion: GradleVersion) {
runWithKtorService { port ->
nativeProject(
"k2-native-intermediate-metadata",
gradleVersion,
buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.WARN)
) {
setProjectForTest(port)
build(
"build",
// Disables cache for explicit task execution and metric collection
"-Pkotlin.mpp.enableNativeDistributionCommonizationCache=false",
) {
assertOutputDoesNotContain("Failed to send statistic to")
}
}
val commonizerNativeDistributionTask = ":commonizeNativeDistribution"
validateTaskData(port) { taskReport ->
assertEquals(commonizerNativeDistributionTask, taskReport.getTaskName())
assertContains(
taskReport.getBuildTimesMetrics().keys,
GradleBuildTime.NATIVE_IN_EXECUTOR,
"Assertion failed for task \"$commonizerNativeDistributionTask\""
)
assertEquals(
defaultBuildOptions.kotlinVersion, taskReport.getKotlinVersion(),
"Unexpected kotlinVersion: ${taskReport.getKotlinVersion()} instead of ${defaultBuildOptions.kotlinVersion}"
)
}
val compileNativeTasks = listOf(
":compileCommonMainKotlinMetadata",
":compileNativeMainKotlinMetadata",
)
for (task in compileNativeTasks) {
validateTaskData(port) { taskReport ->
//can be sure in task execution order
assertEquals(task, taskReport.getTaskName())
assertContains(
taskReport.getBuildTimesMetrics().keys,
GradleBuildTime.NATIVE_IN_PROCESS,
"Assertion failed for task \"$task\""
)
assertContains(
taskReport.getBuildTimesMetrics().keys,
GradleBuildTime.RUN_ENTRY_POINT,
"Assertion failed for task \"$task\""
)
assertEquals(
defaultBuildOptions.kotlinVersion, taskReport.getKotlinVersion(),
"Unexpected kotlinVersion: ${taskReport.getKotlinVersion()} instead of ${defaultBuildOptions.kotlinVersion}"
)
}
}
}
}
private fun TestProject.setProjectForTest(port: Int) {
enableStatisticReports(BuildReportType.HTTP, "http://localhost:$port/put")
}
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.cli.common.arguments.K2NativeCompilerArguments
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.testbase.*
import org.jetbrains.kotlin.gradle.util.parseCompilerArgumentsFromBuildOutput
import org.jetbrains.kotlin.konan.target.HostManager
import org.junit.jupiter.api.DisplayName
import kotlin.io.path.appendText
@@ -65,7 +66,7 @@ class TryK2IT : KGPBaseTest() {
) {
build("build") {
assertOutputDoesNotContain(
"##### 'kotlin.experimental.tryK2' results (Kotlin/Native not checked) #####"
"##### 'kotlin.experimental.tryK2' results #####"
)
}
}
@@ -85,7 +86,7 @@ class TryK2IT : KGPBaseTest() {
build("build") {
assertOutputContains(
"""
|##### 'kotlin.experimental.tryK2' results (Kotlin/Native not checked) #####
|##### 'kotlin.experimental.tryK2' results #####
|:lib:compileKotlin: 2.0 language version
|:app:compileKotlin: 2.0 language version
|##### 100% (2/2) tasks have been compiled with Kotlin 2.0 #####
@@ -95,6 +96,36 @@ class TryK2IT : KGPBaseTest() {
}
}
@DisplayName("Native: report is printed at the end of the build")
@MppGradlePluginTests
@GradleTest
fun buildReportForNative(gradleVersion: GradleVersion) {
project(
"k2-native-intermediate-metadata",
gradleVersion,
buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.WARN)
) {
enableTryK2()
build("build") {
assertOutputContains(
"""
|##### 'kotlin.experimental.tryK2' results #####
|:compileCommonMainKotlinMetadata: 2.0 language version
|:compileNativeMainKotlinMetadata: 2.0 language version
|:compileKotlinLinuxX64: 2.0 language version${
if (HostManager.hostIsMac)
"\n|:compileKotlinMacosArm64: 2.0 language version\n|:compileKotlinMacosX64: 2.0 language version"
else ""
}
|:compileKotlinMingwX64: 2.0 language version
|##### 100% ${if (HostManager.hostIsMac) "(6/6)" else "(4/4)"} tasks have been compiled with Kotlin 2.0 #####
""".trimMargin().normalizeLineEndings()
)
}
}
}
@DisplayName("JVM: report is printed at the end of the build in case of compilation error")
@JvmGradlePluginTests
@GradleTest
@@ -116,7 +147,7 @@ class TryK2IT : KGPBaseTest() {
buildAndFail("build", forceOutput = true) {
assertOutputContains(
"""
|##### 'kotlin.experimental.tryK2' results (Kotlin/Native not checked) #####
|##### 'kotlin.experimental.tryK2' results #####
|:lib:compileKotlin: 2.0 language version
|:app:compileKotlin: 2.0 language version
|##### 100% (2/2) tasks have been compiled with Kotlin 2.0 #####
@@ -243,12 +243,6 @@ internal open class GradleCompilerRunner(
)
}
//Copy of CommonCompilerArguments.parseOrConfigureLanguageVersion to avoid direct dependency
private fun parseLanguageVersion(languageVersion: String?, useK2: Boolean): KotlinVersion {
val explicitVersion = languageVersion?.let { KotlinVersion.fromVersion(languageVersion) } ?: KotlinVersion.DEFAULT
return if (useK2 && (explicitVersion < KotlinVersion.KOTLIN_2_0)) KotlinVersion.KOTLIN_2_0 else explicitVersion
}
protected open fun runCompilerAsync(
workArgs: GradleKotlinCompilerWorkArguments,
taskOutputsBackup: TaskOutputsBackup?
@@ -5,12 +5,16 @@
package org.jetbrains.kotlin.compilerRunner
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
import java.io.File
internal class KotlinNativeCommonizerToolRunner(
context: GradleExecutionContext,
private val settings: Settings,
) : KotlinToolRunner(context) {
metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
) : KotlinToolRunner(context, metricsReporter) {
class Settings(
val kotlinPluginVersion: String,
@@ -13,6 +13,7 @@ import org.gradle.api.model.ObjectFactory
import org.gradle.process.ExecOperations
import org.gradle.process.ExecResult
import org.gradle.process.JavaExecSpec
import org.jetbrains.kotlin.build.report.metrics.*
import org.jetbrains.kotlin.konan.target.HostManager
import java.io.File
import java.lang.reflect.InvocationTargetException
@@ -22,14 +23,15 @@ import java.util.concurrent.ConcurrentHashMap
// Note: this class is public because it is used in the K/N build infrastructure.
abstract class KotlinToolRunner(
private val executionContext: GradleExecutionContext
private val executionContext: GradleExecutionContext,
private val metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric> = DoNothingBuildMetricsReporter
) {
@Deprecated(
"Using Project object is not compatible with Gradle Configuration Cache",
ReplaceWith("KotlinToolRunner(GradleExecutionContext.fromTaskContext())"),
DeprecationLevel.WARNING
)
constructor(project: Project): this(GradleExecutionContext.fromProject(project))
constructor(project: Project) : this(GradleExecutionContext.fromProject(project))
/**
* Context Services that are required for [KotlinToolRunner] during Gradle Task Execution Phase
@@ -60,7 +62,7 @@ abstract class KotlinToolRunner(
fun fromTaskContext(
objectFactory: ObjectFactory,
execOperations: ExecOperations,
logger: Logger
logger: Logger,
) = GradleExecutionContext(
filesProvider = objectFactory.fileCollection()::from,
javaexec = { spec -> execOperations.javaexec(spec) }, // execOperations::javaexec won't work due to different Classloaders
@@ -127,68 +129,77 @@ abstract class KotlinToolRunner(
}
open fun run(args: List<String>) {
checkClasspath()
metricsReporter.measure(GradleBuildTime.RUN_COMPILATION_IN_WORKER) {
checkClasspath()
if (mustRunViaExec) runViaExec(args) else runInProcess(args)
}
private fun runViaExec(args: List<String>) {
val transformedArgs = transformArgs(args)
val classpath = executionContext.filesProvider(classpath)
val systemProperties = System.getProperties()
/* Capture 'System.getProperties()' current state to avoid potential 'ConcurrentModificationException' */
.snapshot()
.asSequence()
.map { (k, v) -> k.toString() to v.toString() }
.filter { (k, _) -> k !in execSystemPropertiesBlacklist }
.escapeQuotesForWindows()
.toMap() + execSystemProperties
executionContext.logger.info(
"""|Run "$displayName" tool in a separate JVM process
|Main class = $mainClass
|Arguments = ${args.toPrettyString()}
|Transformed arguments = ${if (transformedArgs == args) "same as arguments" else transformedArgs.toPrettyString()}
|Classpath = ${classpath.files.map { it.absolutePath }.toPrettyString()}
|JVM options = ${jvmArgs.toPrettyString()}
|Java system properties = ${systemProperties.toPrettyString()}
|Suppressed ENV variables = ${execEnvironmentBlacklist.toPrettyString()}
|Custom ENV variables = ${execEnvironment.toPrettyString()}
""".trimMargin()
)
executionContext.javaexec { spec ->
spec.mainClass.set(mainClass)
spec.classpath = classpath
spec.jvmArgs(jvmArgs)
spec.systemProperties(systemProperties)
execEnvironmentBlacklist.forEach { spec.environment.remove(it) }
spec.environment(execEnvironment)
spec.args(transformedArgs)
if (mustRunViaExec) runViaExec(args, metricsReporter) else runInProcess(args, metricsReporter)
}
}
private fun runInProcess(args: List<String>) {
val transformedArgs = transformArgs(args)
val isolatedClassLoader = getIsolatedClassLoader()
executionContext.logger.info(
"""|Run in-process tool "$displayName"
|Entry point method = $mainClass.$daemonEntryPoint
|Classpath = ${isolatedClassLoader.urLs.map { it.file }.toPrettyString()}
|Arguments = ${args.toPrettyString()}
|Transformed arguments = ${if (transformedArgs == args) "same as arguments" else transformedArgs.toPrettyString()}
""".trimMargin()
)
private fun runViaExec(args: List<String>, metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>) {
metricsReporter.measure(GradleBuildTime.NATIVE_IN_EXECUTOR) {
val transformedArgs = transformArgs(args)
val classpath = executionContext.filesProvider(classpath)
val systemProperties = System.getProperties()
/* Capture 'System.getProperties()' current state to avoid potential 'ConcurrentModificationException' */
.snapshot()
.asSequence()
.map { (k, v) -> k.toString() to v.toString() }
.filter { (k, _) -> k !in execSystemPropertiesBlacklist }
.escapeQuotesForWindows()
.toMap() + execSystemProperties
try {
val mainClass = isolatedClassLoader.loadClass(mainClass)
val entryPoint = mainClass.methods
.singleOrNull { it.name == daemonEntryPoint } ?: error("Couldn't find daemon entry point '$daemonEntryPoint'")
executionContext.logger.info(
"""|Run "$displayName" tool in a separate JVM process
|Main class = $mainClass
|Arguments = ${args.toPrettyString()}
|Transformed arguments = ${if (transformedArgs == args) "same as arguments" else transformedArgs.toPrettyString()}
|Classpath = ${classpath.files.map { it.absolutePath }.toPrettyString()}
|JVM options = ${jvmArgs.toPrettyString()}
|Java system properties = ${systemProperties.toPrettyString()}
|Suppressed ENV variables = ${execEnvironmentBlacklist.toPrettyString()}
|Custom ENV variables = ${execEnvironment.toPrettyString()}
""".trimMargin()
)
entryPoint.invoke(null, transformedArgs.toTypedArray())
} catch (t: InvocationTargetException) {
throw t.targetException
executionContext.javaexec { spec ->
spec.mainClass.set(mainClass)
spec.classpath = classpath
spec.jvmArgs(jvmArgs)
spec.systemProperties(systemProperties)
execEnvironmentBlacklist.forEach { spec.environment.remove(it) }
spec.environment(execEnvironment)
spec.args(transformedArgs)
}
}
}
private fun runInProcess(args: List<String>, metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric> = DoNothingBuildMetricsReporter) {
metricsReporter.measure(GradleBuildTime.NATIVE_IN_PROCESS) {
val transformedArgs = transformArgs(args)
val isolatedClassLoader = getIsolatedClassLoader()
executionContext.logger.info(
"""|Run in-process tool "$displayName"
|Entry point method = $mainClass.$daemonEntryPoint
|Classpath = ${isolatedClassLoader.urLs.map { it.file }.toPrettyString()}
|Arguments = ${args.toPrettyString()}
|Transformed arguments = ${if (transformedArgs == args) "same as arguments" else transformedArgs.toPrettyString()}
""".trimMargin()
)
try {
val mainClass = isolatedClassLoader.loadClass(mainClass)
val entryPoint = mainClass.methods
.singleOrNull { it.name == daemonEntryPoint } ?: error("Couldn't find daemon entry point '$daemonEntryPoint'")
metricsReporter.measure(GradleBuildTime.RUN_ENTRY_POINT) {
entryPoint.invoke(null, transformedArgs.toTypedArray())
}
} catch (t: InvocationTargetException) {
throw t.targetException
}
}
}
@@ -7,12 +7,16 @@ package org.jetbrains.kotlin.compilerRunner
import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
import org.jetbrains.kotlin.gradle.dsl.NativeCacheKind
import org.jetbrains.kotlin.gradle.dsl.NativeCacheOrchestration
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.useXcodeMessageStyle
import org.jetbrains.kotlin.gradle.plugin.mpp.nativeUseEmbeddableCompilerJar
import org.jetbrains.kotlin.gradle.report.GradleBuildMetricsReporter
import org.jetbrains.kotlin.gradle.targets.native.KonanPropertiesBuildService
import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader
import org.jetbrains.kotlin.konan.properties.resolvablePropertyString
@@ -73,7 +77,8 @@ internal abstract class KotlinNativeToolRunner(
protected val toolName: String,
private val settings: Settings,
executionContext: GradleExecutionContext,
) : KotlinToolRunner(executionContext) {
metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
) : KotlinToolRunner(executionContext, metricsReporter) {
class Settings(
val konanVersion: String,
@@ -151,7 +156,8 @@ internal abstract class AbstractKotlinNativeCInteropRunner(
toolName: String,
settings: Settings,
executionContext: GradleExecutionContext,
) : KotlinNativeToolRunner(toolName, settings, executionContext) {
metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
) : KotlinNativeToolRunner(toolName, settings, executionContext, metricsReporter) {
override val mustRunViaExec get() = true
@@ -187,17 +193,19 @@ internal class KotlinNativeCInteropRunner
private constructor(
private val settings: Settings,
gradleExecutionContext: GradleExecutionContext,
) : AbstractKotlinNativeCInteropRunner("cinterop", settings, gradleExecutionContext) {
metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
) : AbstractKotlinNativeCInteropRunner("cinterop", settings, gradleExecutionContext, metricsReporter) {
interface ExecutionContext {
val runnerSettings: Settings
val gradleExecutionContext: GradleExecutionContext
val metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
fun runWithContext(action: () -> Unit)
}
companion object {
fun ExecutionContext.run(args: List<String>) {
val runner = KotlinNativeCInteropRunner(runnerSettings, gradleExecutionContext)
val runner = KotlinNativeCInteropRunner(runnerSettings, gradleExecutionContext, metricsReporter)
runWithContext { runner.run(args) }
}
}
@@ -207,7 +215,8 @@ private constructor(
internal class KotlinNativeCompilerRunner(
private val settings: Settings,
executionContext: GradleExecutionContext,
) : KotlinNativeToolRunner("konanc", settings.parent, executionContext) {
metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
) : KotlinNativeToolRunner("konanc", settings.parent, executionContext, metricsReporter) {
class Settings(
val parent: KotlinNativeToolRunner.Settings,
val disableKonanDaemon: Boolean,
@@ -245,13 +254,15 @@ internal class KotlinNativeCompilerRunner(
internal class KotlinNativeLibraryGenerationRunner(
private val settings: Settings,
executionContext: GradleExecutionContext,
metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
) :
AbstractKotlinNativeCInteropRunner("generatePlatformLibraries", settings, executionContext) {
AbstractKotlinNativeCInteropRunner("generatePlatformLibraries", settings, executionContext, metricsReporter) {
companion object {
fun fromProject(project: Project) = KotlinNativeLibraryGenerationRunner(
settings = Settings.fromProject(project),
executionContext = GradleExecutionContext.fromProject(project)
executionContext = GradleExecutionContext.fromProject(project),
metricsReporter = GradleBuildMetricsReporter()
)
}
@@ -16,7 +16,10 @@
package org.jetbrains.kotlin.compilerRunner
import org.gradle.internal.impldep.org.apache.commons.lang.StringEscapeUtils
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
import org.jetbrains.kotlin.buildtools.api.KotlinLogger
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
@@ -26,8 +29,13 @@ import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
import org.jetbrains.kotlin.config.KotlinCompilerVersion
import org.jetbrains.kotlin.daemon.client.DaemonReportingTargets
import org.jetbrains.kotlin.daemon.client.launchProcessWithFallback
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.logging.GradleErrorMessageCollector
import org.jetbrains.kotlin.gradle.logging.GradleKotlinLogger
import org.jetbrains.kotlin.gradle.plugin.internal.state.TaskExecutionResults
import org.jetbrains.kotlin.gradle.report.TaskExecutionInfo
import org.jetbrains.kotlin.gradle.report.TaskExecutionResult
import org.jetbrains.kotlin.gradle.report.UsesBuildMetricsService
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import org.jetbrains.org.objectweb.asm.ClassReader
@@ -35,7 +43,6 @@ import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.FieldVisitor
import org.jetbrains.org.objectweb.asm.Opcodes
import java.io.File
import java.io.StringWriter
import java.nio.file.Files
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
@@ -240,4 +247,36 @@ internal fun exitCodeFromProcessExitCode(log: KotlinLogger, code: Int): ExitCode
log.debug("Could not find exit code by value: $code")
return if (code == 0) ExitCode.OK else ExitCode.COMPILATION_ERROR
}
//Copy of CommonCompilerArguments.parseOrConfigureLanguageVersion to avoid direct dependency
internal fun parseLanguageVersion(languageVersion: String?, useK2: Boolean): KotlinVersion {
val explicitVersion = languageVersion?.let { KotlinVersion.fromVersion(languageVersion) } ?: KotlinVersion.DEFAULT
return if (useK2 && (explicitVersion < KotlinVersion.KOTLIN_2_0)) KotlinVersion.KOTLIN_2_0 else explicitVersion
}
internal fun parseLanguageVersion(args: List<String>): KotlinVersion {
val languageVersionIndex = args.indexOf("-language-version")
val languageVersion = if (languageVersionIndex >= 0) {
args[languageVersionIndex + 1]
} else null
val useK2 = args.indexOf("-Xuse-k2") >= 0
return parseLanguageVersion(languageVersion, useK2)
}
internal fun UsesBuildMetricsService.addBuildMetricsForTaskAction(
metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>,
languageVersion: KotlinVersion?,
fn: () -> Any
) {
metricsReporter.addTimeMetric(GradleBuildPerformanceMetric.START_TASK_ACTION_EXECUTION)
buildMetricsService.orNull?.also { it.addTask(path, this.javaClass, metricsReporter) }
try {
fn.invoke()
} finally {
val result = TaskExecutionResult(buildMetrics = BuildMetrics(), taskInfo = TaskExecutionInfo(kotlinLanguageVersion = languageVersion))
TaskExecutionResults[path] = result
}
}
@@ -288,6 +288,7 @@ abstract class BuildMetricsService : BuildService<BuildMetricsService.Parameters
fun registerIfAbsent(project: Project) = registerIfAbsentImpl(project)?.also { serviceProvider ->
SingleActionPerProject.run(project, UsesBuildMetricsService::class.java.name) {
project.tasks.withType<UsesBuildMetricsService>().configureEach { task ->
task.buildMetricsService.value(serviceProvider).disallowChanges()
task.usesService(serviceProvider)
}
}
@@ -270,7 +270,7 @@ class BuildReportsService {
// Filtering by only KGP tasks and by those that actually do compilation
it.isFromKotlinPlugin && it.kotlinLanguageVersion != null
}
log.warn("##### 'kotlin.experimental.tryK2' results (Kotlin/Native not checked) #####")
log.warn("##### 'kotlin.experimental.tryK2' results #####")
if (tasksData.isEmpty()) {
log.warn("No Kotlin compilation tasks have been run")
log.warn("#####")
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Action
import org.gradle.api.DomainObjectCollection
import org.gradle.api.DomainObjectSet
import org.gradle.api.Task
import org.gradle.api.provider.Property
@@ -16,9 +15,7 @@ import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.dsl.JsModuleKind
import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
import org.jetbrains.kotlin.gradle.report.BuildMetricsService
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDceDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl
@@ -225,9 +222,6 @@ abstract class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
task.description = "build webpack ${mode.name.toLowerCaseAsciiOnly()} bundle"
task.outputDirectory.fileValue(binary.distribution.directory).finalizeValueOnRead()
BuildMetricsService.registerIfAbsent(project)?.let {
task.buildMetricsService.value(it)
}
task.dependsOn(
distributeResourcesTask
@@ -8,14 +8,10 @@ package org.jetbrains.kotlin.gradle.targets.js.npm
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.file.ArchiveOperations
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Internal
import org.jetbrains.kotlin.gradle.report.BuildMetricsService
import org.jetbrains.kotlin.gradle.report.UsesBuildMetricsService
import org.jetbrains.kotlin.gradle.report.reportingSettings
import org.jetbrains.kotlin.gradle.tasks.withType
import org.jetbrains.kotlin.gradle.utils.SingleActionPerProject
import java.io.File
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.isMain
import org.jetbrains.kotlin.gradle.plugin.mpp.isTest
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.distsDirectory
import org.jetbrains.kotlin.gradle.report.BuildMetricsService
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.*
import org.jetbrains.kotlin.gradle.targets.js.ir.executeTaskBaseName
@@ -230,10 +229,6 @@ abstract class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
task.description = "build webpack ${type.name.toLowerCaseAsciiOnly()} bundle"
task.outputDirectory.fileValue(distribution.directory).finalizeValueOnRead()
BuildMetricsService.registerIfAbsent(project)?.let {
task.buildMetricsService.value(it)
}
task.commonConfigure(
compilation = compilation,
dceTaskProvider = dceTaskProvider,
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPI
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo.KPM
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.ReadyForExecution
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.KOTLIN_NATIVE_IGNORE_INCORRECT_DEPENDENCIES
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.internal.artifactTypeAttribute
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XcodeVersionTask
@@ -38,10 +37,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
import org.jetbrains.kotlin.gradle.targets.native.*
import org.jetbrains.kotlin.gradle.targets.native.internal.*
import org.jetbrains.kotlin.gradle.targets.native.internal.commonizeCInteropTask
import org.jetbrains.kotlin.gradle.targets.native.internal.createCInteropApiElementsKlibArtifact
import org.jetbrains.kotlin.gradle.targets.native.internal.locateOrCreateCInteropApiElementsConfiguration
import org.jetbrains.kotlin.gradle.targets.native.internal.locateOrCreateCInteropDependencyConfiguration
import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeHostTest
import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeSimulatorTest
import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTest
@@ -415,6 +410,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
}
)
.finalizeValueOnRead()
}
compilationInfo.classesDirs.from(compileTaskProvider.map { it.outputFile })
@@ -13,13 +13,14 @@ 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.identityString
import org.jetbrains.kotlin.gradle.report.UsesBuildMetricsService
import org.jetbrains.kotlin.gradle.utils.changing
import org.jetbrains.kotlin.gradle.utils.future
import org.jetbrains.kotlin.gradle.utils.outputFilesProvider
import java.io.File
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
internal abstract class AbstractCInteropCommonizerTask : DefaultTask() {
internal abstract class AbstractCInteropCommonizerTask : DefaultTask(), UsesBuildMetricsService {
@get:OutputDirectory
abstract val outputDirectory: File
@@ -15,10 +15,13 @@ import org.gradle.api.provider.Provider
import org.gradle.api.provider.SetProperty
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
import org.jetbrains.kotlin.commonizer.*
import org.jetbrains.kotlin.compilerRunner.*
import org.jetbrains.kotlin.compilerRunner.GradleCliCommonizer
import org.jetbrains.kotlin.compilerRunner.KotlinNativeCommonizerToolRunner
import org.jetbrains.kotlin.compilerRunner.KotlinToolRunner
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
@@ -26,6 +29,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure
import org.jetbrains.kotlin.gradle.report.GradleBuildMetricsReporter
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerTask.CInteropCommonizerDependencies
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerTask.CInteropGist
import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
@@ -38,7 +42,7 @@ private typealias GroupedCommonizerDependencies = Map<CInteropCommonizerGroup, L
@CacheableTask
internal open class CInteropCommonizerTask
internal abstract class CInteropCommonizerTask
@Inject constructor(
private val objectFactory: ObjectFactory,
private val execOperations: ExecOperations,
@@ -177,6 +181,10 @@ internal open class CInteropCommonizerTask
val allOutputDirectories: Set<File>
get() = allInteropGroups.getOrThrow().map { outputDirectory(it) }.toSet()
@get:Internal
val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
.property(GradleBuildMetricsReporter())
internal fun from(task: TaskProvider<CInteropProcess>) {
dependsOn(task)
cinterops.add(task.map { it.toGist() })
@@ -185,7 +193,10 @@ internal open class CInteropCommonizerTask
@TaskAction
protected fun commonizeCInteropLibraries() {
allInteropGroups.getOrThrow().forEach(::commonize)
val metricReporter = metrics.get()
addBuildMetricsForTaskAction(metricsReporter = metricReporter, languageVersion = null) {
allInteropGroups.getOrThrow().forEach(::commonize)
}
}
private fun commonize(group: CInteropCommonizerGroup) {
@@ -195,7 +206,8 @@ internal open class CInteropCommonizerTask
val commonizerRunner = KotlinNativeCommonizerToolRunner(
context = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger),
settings = runnerSettings.get()
settings = runnerSettings.get(),
metricsReporter = metrics.get(),
)
GradleCliCommonizer(commonizerRunner).commonizeLibraries(
@@ -5,15 +5,22 @@
package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
import org.jetbrains.kotlin.compilerRunner.addBuildMetricsForTaskAction
import org.jetbrains.kotlin.gradle.report.GradleBuildMetricsReporter
import org.jetbrains.kotlin.gradle.utils.property
import java.io.File
import javax.inject.Inject
@DisableCachingByDefault
internal open class CopyCommonizeCInteropForIdeTask @Inject constructor(
internal abstract class CopyCommonizeCInteropForIdeTask @Inject constructor(
private val commonizeCInteropTask: TaskProvider<CInteropCommonizerTask>
) : AbstractCInteropCommonizerTask() {
@@ -32,15 +39,22 @@ internal open class CopyCommonizeCInteropForIdeTask @Inject constructor(
return commonizeCInteropTask.get().findInteropsGroup(dependent)
}
@get:Internal
val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
.property(GradleBuildMetricsReporter())
@TaskAction
protected fun copy() {
outputDirectory.mkdirs()
for (group in commonizeCInteropTask.get().allInteropGroups.getOrThrow()) {
val source = commonizeCInteropTask.get().outputDirectory(group)
if (!source.exists()) continue
val target = outputDirectory(group)
if (target.exists()) target.deleteRecursively()
source.copyRecursively(target, true)
val metricReporter = metrics.get()
addBuildMetricsForTaskAction(metricsReporter = metricReporter, languageVersion = null) {
outputDirectory.mkdirs()
for (group in commonizeCInteropTask.get().allInteropGroups.getOrThrow()) {
val source = commonizeCInteropTask.get().outputDirectory(group)
if (!source.exists()) continue
val target = outputDirectory(group)
if (target.exists()) target.deleteRecursively()
source.copyRecursively(target, true)
}
}
}
}
@@ -18,14 +18,19 @@ import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.compilerRunner.*
import org.jetbrains.kotlin.compilerRunner.GradleCliCommonizer
import org.jetbrains.kotlin.compilerRunner.KotlinNativeCommonizerToolRunner
import org.jetbrains.kotlin.compilerRunner.KotlinToolRunner
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.report.GradleBuildMetricsReporter
import org.jetbrains.kotlin.gradle.report.UsesBuildMetricsService
import org.jetbrains.kotlin.gradle.utils.chainedFinalizeValueOnRead
import org.jetbrains.kotlin.gradle.utils.listProperty
import org.jetbrains.kotlin.gradle.utils.property
@@ -36,11 +41,11 @@ import java.net.URLEncoder
import javax.inject.Inject
@DisableCachingByDefault(because = "Native Distribution Commonizer Task uses internal caching mechanism with fine grained cache control")
internal open class NativeDistributionCommonizerTask
internal abstract class NativeDistributionCommonizerTask
@Inject constructor(
private val objectFactory: ObjectFactory,
private val execOperations: ExecOperations,
) : DefaultTask() {
) : DefaultTask(), UsesBuildMetricsService {
private val konanHome = project.file(project.konanHome)
@@ -89,19 +94,28 @@ internal open class NativeDistributionCommonizerTask
isCachingEnabled = project.kotlinPropertiesProvider.enableNativeDistributionCommonizationCache
)
@get:Internal
val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
.property(GradleBuildMetricsReporter())
@TaskAction
protected fun run() {
val commonizerRunner = KotlinNativeCommonizerToolRunner(
context = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger),
settings = runnerSettings.get()
)
val metricsReporter = metrics.get()
commonizerCache.writeCacheForUncachedTargets(commonizerTargets) { todoOutputTargets ->
val commonizer = GradleCliCommonizer(commonizerRunner)
/* Invoke commonizer with only 'to do' targets */
commonizer.commonizeNativeDistribution(
konanHome, rootOutputDirectory, todoOutputTargets, logLevel, additionalSettings
addBuildMetricsForTaskAction(metricsReporter = metricsReporter, languageVersion = null) {
val commonizerRunner = KotlinNativeCommonizerToolRunner(
context = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger),
settings = runnerSettings.get(),
metricsReporter = metricsReporter,
)
commonizerCache.writeCacheForUncachedTargets(commonizerTargets) { todoOutputTargets ->
val commonizer = GradleCliCommonizer(commonizerRunner)
/* Invoke commonizer with only 'to do' targets */
commonizer.commonizeNativeDistribution(
konanHome, rootOutputDirectory, todoOutputTargets, logLevel, additionalSettings
)
}
}
}
@@ -6,23 +6,30 @@
package org.jetbrains.kotlin.gradle.targets.native.tasks
import org.gradle.api.Task
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
import org.jetbrains.kotlin.compilerRunner.KotlinNativeCInteropRunner
import org.jetbrains.kotlin.compilerRunner.KotlinNativeToolRunner
import org.jetbrains.kotlin.compilerRunner.KotlinToolRunner
import org.jetbrains.kotlin.gradle.report.GradleBuildMetricsReporter
internal fun KotlinNativeCInteropRunner.Companion.createExecutionContext(
task: Task,
isInIdeaSync: Boolean,
runnerSettings: KotlinNativeToolRunner.Settings,
gradleExecutionContext: KotlinToolRunner.GradleExecutionContext
gradleExecutionContext: KotlinToolRunner.GradleExecutionContext,
metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
): KotlinNativeCInteropRunner.ExecutionContext {
return if (isInIdeaSync) IdeaSyncKotlinNativeCInteropRunnerExecutionContext(runnerSettings, gradleExecutionContext, task)
else DefaultKotlinNativeCInteropRunnerExecutionContext(runnerSettings, gradleExecutionContext)
return if (isInIdeaSync) IdeaSyncKotlinNativeCInteropRunnerExecutionContext(runnerSettings, gradleExecutionContext, task, metricsReporter)
else DefaultKotlinNativeCInteropRunnerExecutionContext(runnerSettings, gradleExecutionContext, metricsReporter)
}
private class DefaultKotlinNativeCInteropRunnerExecutionContext(
override val runnerSettings: KotlinNativeToolRunner.Settings,
override val gradleExecutionContext: KotlinToolRunner.GradleExecutionContext
override val gradleExecutionContext: KotlinToolRunner.GradleExecutionContext,
override val metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
) : KotlinNativeCInteropRunner.ExecutionContext {
override fun runWithContext(action: () -> Unit) = action()
}
@@ -30,7 +37,8 @@ private class DefaultKotlinNativeCInteropRunnerExecutionContext(
private class IdeaSyncKotlinNativeCInteropRunnerExecutionContext(
override val runnerSettings: KotlinNativeToolRunner.Settings,
override val gradleExecutionContext: KotlinToolRunner.GradleExecutionContext,
private val task: Task
private val task: Task,
override val metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
) : KotlinNativeCInteropRunner.ExecutionContext {
override fun runWithContext(action: () -> Unit) {
@@ -14,9 +14,13 @@ import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileCollection
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
import org.jetbrains.kotlin.cli.common.arguments.K2NativeCompilerArguments
import org.jetbrains.kotlin.compilerRunner.*
import org.jetbrains.kotlin.gradle.dsl.*
@@ -25,6 +29,8 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.Create
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.cocoapods.asValidFrameworkName
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.report.GradleBuildMetricsReporter
import org.jetbrains.kotlin.gradle.report.UsesBuildMetricsService
import org.jetbrains.kotlin.gradle.targets.native.UsesKonanPropertiesBuildService
import org.jetbrains.kotlin.gradle.targets.native.tasks.CompilerPluginData
import org.jetbrains.kotlin.gradle.utils.*
@@ -49,6 +55,7 @@ constructor(
private val execOperations: ExecOperations,
) : AbstractKotlinCompileTool<K2NativeCompilerArguments>(objectFactory),
UsesKonanPropertiesBuildService,
UsesBuildMetricsService,
KotlinToolTask<KotlinCommonCompilerToolOptions> {
@Deprecated("Visibility will be lifted to private in the future releases")
@@ -346,52 +353,60 @@ constructor(
@TaskAction
fun compile() {
validatedExportedLibraries()
val metricsReporter = metrics.get()
val output = outputFile.get()
output.parentFile.mkdirs()
addBuildMetricsForTaskAction(metricsReporter = metricsReporter, languageVersion = parseLanguageVersion(externalDependenciesArgs)) {
validatedExportedLibraries()
val executionContext = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger)
val additionalOptions = mutableListOf<String>().apply {
addAll(externalDependenciesArgs)
when (cacheSettings.orchestration) {
NativeCacheOrchestration.Compiler -> {
if (cacheSettings.kind != NativeCacheKind.NONE
&& !optimized
&& konanPropertiesService.get().cacheWorksFor(konanTarget)
) {
add("-Xauto-cache-from=${cacheSettings.gradleUserHomeDir}")
add("-Xbackend-threads=${cacheSettings.threads}")
if (cacheSettings.icEnabled) {
val icCacheDir = cacheSettings.gradleBuildDir.resolve("kotlin-native-ic-cache")
icCacheDir.mkdirs()
add("-Xenable-incremental-compilation")
add("-Xic-cache-dir=$icCacheDir")
val output = outputFile.get()
output.parentFile.mkdirs()
val executionContext = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger)
val additionalOptions = mutableListOf<String>().apply {
addAll(externalDependenciesArgs)
when (cacheSettings.orchestration) {
NativeCacheOrchestration.Compiler -> {
if (cacheSettings.kind != NativeCacheKind.NONE
&& !optimized
&& konanPropertiesService.get().cacheWorksFor(konanTarget)
) {
add("-Xauto-cache-from=${cacheSettings.gradleUserHomeDir}")
add("-Xbackend-threads=${cacheSettings.threads}")
if (cacheSettings.icEnabled) {
val icCacheDir = cacheSettings.gradleBuildDir.resolve("kotlin-native-ic-cache")
icCacheDir.mkdirs()
add("-Xenable-incremental-compilation")
add("-Xic-cache-dir=$icCacheDir")
}
}
}
}
NativeCacheOrchestration.Gradle -> {
if (cacheSettings.icEnabled) {
executionContext.logger.warn(
"K/N incremental compilation only works in conjunction with kotlin.native.cacheOrchestration=compiler")
NativeCacheOrchestration.Gradle -> {
if (cacheSettings.icEnabled) {
executionContext.logger.warn(
"K/N incremental compilation only works in conjunction with kotlin.native.cacheOrchestration=compiler"
)
}
val cacheBuilder = CacheBuilder(
executionContext = executionContext,
settings = cacheBuilderSettings,
konanPropertiesService = konanPropertiesService.get(),
metricsReporter = metricsReporter
)
addAll(cacheBuilder.buildCompilerArgs(resolvedConfiguration))
}
val cacheBuilder = CacheBuilder(
executionContext = executionContext,
settings = cacheBuilderSettings,
konanPropertiesService = konanPropertiesService.get()
)
addAll(cacheBuilder.buildCompilerArgs(resolvedConfiguration))
}
}
val arguments = createCompilerArguments()
val buildArguments = ArgumentUtils.convertArgumentsToStringList(arguments) + additionalOptions
KotlinNativeCompilerRunner(
settings = runnerSettings,
executionContext = executionContext,
metricsReporter = metricsReporter
).run(buildArguments)
}
val arguments = createCompilerArguments()
val buildArguments = ArgumentUtils.convertArgumentsToStringList(arguments) + additionalOptions
KotlinNativeCompilerRunner(
settings = runnerSettings,
executionContext = executionContext
).run(buildArguments)
}
private inline fun <reified T : Any> lazyConvention(noinline lazyConventionValue: () -> T): Provider<T> {
@@ -23,6 +23,7 @@ import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.build.report.metrics.*
import org.jetbrains.kotlin.cli.common.arguments.*
import org.jetbrains.kotlin.compilerRunner.*
import org.jetbrains.kotlin.compilerRunner.KotlinNativeCInteropRunner.Companion.run
@@ -39,9 +40,12 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmMetadataCompilationData
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmNativeCompilationData
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.report.*
import org.jetbrains.kotlin.gradle.report.UsesBuildMetricsService
import org.jetbrains.kotlin.gradle.targets.native.KonanPropertiesBuildService
import org.jetbrains.kotlin.gradle.targets.native.tasks.*
import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.GradleLoggerAdapter
import org.jetbrains.kotlin.gradle.utils.listFilesOrEmpty
import org.jetbrains.kotlin.ir.linkage.partial.PartialLinkageMode
import org.jetbrains.kotlin.konan.library.KLIB_INTEROP_IR_PROVIDER_IDENTIFIER
@@ -122,10 +126,10 @@ internal fun FileCollection.filterKlibsPassedToCompiler(): FileCollection = filt
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
abstract class AbstractKotlinNativeCompile<
T : KotlinCommonToolOptions,
M : CommonToolArguments
M : CommonToolArguments,
>
@Inject constructor(
private val objectFactory: ObjectFactory
private val objectFactory: ObjectFactory,
) : AbstractKotlinCompileTool<M>(objectFactory) {
@get:Inject
@@ -309,10 +313,11 @@ internal constructor(
override val compilerOptions: KotlinNativeCompilerOptions,
private val objectFactory: ObjectFactory,
private val providerFactory: ProviderFactory,
private val execOperations: ExecOperations
private val execOperations: ExecOperations,
) : AbstractKotlinNativeCompile<KotlinCommonOptions, K2NativeCompilerArguments>(objectFactory),
KotlinCompile<KotlinCommonOptions>,
K2MultiplatformCompilationTask,
UsesBuildMetricsService,
KotlinCompilationTask<KotlinNativeCompilerOptions> {
@get:Input
@@ -518,17 +523,27 @@ internal constructor(
@TaskAction
fun compile() {
val output = outputFile.get()
output.parentFile.mkdirs()
val buildMetrics = metrics.get()
addBuildMetricsForTaskAction(
metricsReporter = buildMetrics,
languageVersion = parseLanguageVersion(compilerOptions.languageVersion.orNull?.version, compilerOptions.useK2.get())
) {
val arguments = createCompilerArguments()
val buildArguments = buildMetrics.measure(GradleBuildTime.OUT_OF_WORKER_TASK_ACTION) {
val output = outputFile.get()
output.parentFile.mkdirs()
collectCommonCompilerStats()
val arguments = createCompilerArguments()
val buildArguments = ArgumentUtils.convertArgumentsToStringList(arguments)
collectCommonCompilerStats()
ArgumentUtils.convertArgumentsToStringList(arguments)
}
KotlinNativeCompilerRunner(
settings = runnerSettings,
executionContext = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger),
metricsReporter = buildMetrics
).run(buildArguments)
}
KotlinNativeCompilerRunner(
settings = runnerSettings,
executionContext = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger)
).run(buildArguments)
}
private fun collectCommonCompilerStats() {
@@ -547,7 +562,7 @@ internal constructor(
internal class ExternalDependenciesBuilder(
val project: Project,
val compilation: KotlinCompilation<*>,
intermediateLibraryName: String?
intermediateLibraryName: String?,
) {
constructor(project: Project, compilation: KotlinNativeCompilation) : this(
project, compilation, compilation.compileKotlinTask.moduleName
@@ -721,6 +736,7 @@ internal class CacheBuilder(
private val executionContext: KotlinToolRunner.GradleExecutionContext,
private val settings: Settings,
private val konanPropertiesService: KonanPropertiesBuildService,
private val metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
) {
class Settings(
val runnerSettings: KotlinNativeCompilerRunner.Settings,
@@ -747,7 +763,7 @@ internal class CacheBuilder(
binary: NativeBinary,
konanTarget: KonanTarget,
toolOptions: KotlinCommonCompilerToolOptions,
externalDependenciesArgs: List<String>
externalDependenciesArgs: List<String>,
): Settings {
val konanCacheKind = project.getKonanCacheKind(konanTarget)
return Settings(
@@ -800,7 +816,7 @@ internal class CacheBuilder(
private fun getCacheDirectory(
resolvedConfiguration: LazyResolvedConfiguration,
dependency: ResolvedDependencyResult
dependency: ResolvedDependencyResult,
): File = getCacheDirectory(
rootCacheDirectory = rootCacheDirectory,
dependency = dependency,
@@ -814,7 +830,7 @@ internal class CacheBuilder(
private fun LazyResolvedConfiguration.ensureDependencyPrecached(
dependency: ResolvedDependencyResult,
visitedDependencies: MutableSet<ResolvedDependencyResult>
visitedDependencies: MutableSet<ResolvedDependencyResult>,
) {
if (dependency in visitedDependencies)
return
@@ -903,7 +919,7 @@ internal class CacheBuilder(
args += "-l"
args += it.libraryFile.absolutePath
}
KotlinNativeCompilerRunner(settings.runnerSettings, executionContext).run(args)
KotlinNativeCompilerRunner(settings.runnerSettings, executionContext, GradleBuildMetricsReporter()).run(args)
}
}
@@ -913,7 +929,7 @@ internal class CacheBuilder(
private fun ensureCompilerProvidedLibPrecached(
platformLibName: String,
platformLibs: Map<String, File>,
visitedLibs: MutableSet<String>
visitedLibs: MutableSet<String>,
) {
if (platformLibName in visitedLibs)
return
@@ -944,7 +960,7 @@ internal class CacheBuilder(
}
args += "-Xadd-cache=${platformLib.absolutePath}"
args += "-Xcache-directory=${rootCacheDirectory.absolutePath}"
KotlinNativeCompilerRunner(settings.runnerSettings, executionContext).run(args)
KotlinNativeCompilerRunner(settings.runnerSettings, executionContext, metricsReporter).run(args)
}
private fun ensureCompilerProvidedLibsPrecached() {
@@ -995,7 +1011,8 @@ internal class CacheBuilder(
}
@CacheableTask
open class CInteropProcess @Inject internal constructor(params: Params) : DefaultTask() {
abstract class CInteropProcess @Inject internal constructor(params: Params) :
DefaultTask(), UsesBuildMetricsService {
internal class Params(
val settings: DefaultCInteropSettings,
@@ -1003,11 +1020,11 @@ open class CInteropProcess @Inject internal constructor(params: Params) : Defaul
val compilationName: String,
val konanTarget: KonanTarget,
val baseKlibName: String,
val services: Services
val services: Services,
) {
internal open class Services @Inject constructor(
val objectFactory: ObjectFactory,
val execOperations: ExecOperations
val execOperations: ExecOperations,
)
}
@@ -1104,48 +1121,57 @@ open class CInteropProcess @Inject internal constructor(params: Params) : Defaul
@get:Input
val extraOpts: List<String> get() = settings.extraOpts
@get:Internal
val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
.property(GradleBuildMetricsReporter())
private val isInIdeaSync = project.isInIdeaSync
// Task action.
@TaskAction
fun processInterop() {
val args = mutableListOf<String>().apply {
addArg("-o", outputFile.absolutePath)
val buildMetrics = metrics.get()
addArgIfNotNull("-target", konanTarget.visibleName)
addArgIfNotNull("-def", defFile.canonicalPath)
addArgIfNotNull("-pkg", packageName)
val args =
mutableListOf<String>().apply {
addArg("-o", outputFile.absolutePath)
addFileArgs("-header", headers)
addArgIfNotNull("-target", konanTarget.visibleName)
addArgIfNotNull("-def", defFile.canonicalPath)
addArgIfNotNull("-pkg", packageName)
addFileArgs("-header", headers)
compilerOpts.forEach {
addArg("-compiler-option", it)
}
linkerOpts.forEach {
addArg("-linker-option", it)
}
libraries.files.filterKlibsPassedToCompiler().forEach { library ->
addArg("-library", library.absolutePath)
}
addArgs("-compiler-option", allHeadersDirs.map { "-I${it.absolutePath}" })
addArgs("-headerFilterAdditionalSearchPrefix", headerFilterDirs.map { it.absolutePath })
addArg("-Xmodule-name", moduleName)
addArg("-libraryVersion", libraryVersion)
addAll(extraOpts)
compilerOpts.forEach {
addArg("-compiler-option", it)
}
linkerOpts.forEach {
addArg("-linker-option", it)
}
libraries.files.filterKlibsPassedToCompiler().forEach { library ->
addArg("-library", library.absolutePath)
}
addArgs("-compiler-option", allHeadersDirs.map { "-I${it.absolutePath}" })
addArgs("-headerFilterAdditionalSearchPrefix", headerFilterDirs.map { it.absolutePath })
addArg("-Xmodule-name", moduleName)
// TODO: uncomment after advancing bootstrap.
//addArg("-libraryVersion", libraryVersion)
addAll(extraOpts)
addBuildMetricsForTaskAction(buildMetrics, languageVersion = parseLanguageVersion(args)) {
outputFile.parentFile.mkdirs()
KotlinNativeCInteropRunner.createExecutionContext(
task = this,
isInIdeaSync = isInIdeaSync,
runnerSettings = runnerSettings,
gradleExecutionContext = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger),
metricsReporter = buildMetrics
).run(args)
}
outputFile.parentFile.mkdirs()
KotlinNativeCInteropRunner.createExecutionContext(
task = this,
isInIdeaSync = isInIdeaSync,
runnerSettings = runnerSettings,
gradleExecutionContext = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger)
).run(args)
}
}
@@ -10,7 +10,10 @@ import org.gradle.api.Task
import org.gradle.api.plugins.BasePlugin
import org.gradle.api.plugins.ExtensionAware
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerToolOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonToolOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeLibrary
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeLibraryConfig
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeOutputKind
import org.jetbrains.kotlin.gradle.plugin.mpp.enabledOnCurrentHost
@@ -20,16 +20,23 @@ import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
import org.jetbrains.kotlin.compilerRunner.KotlinNativeCompilerRunner
import org.jetbrains.kotlin.compilerRunner.KotlinToolRunner
import org.jetbrains.kotlin.compilerRunner.addBuildMetricsForTaskAction
import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.internal.ensureParentDirsCreated
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode
import org.jetbrains.kotlin.gradle.report.GradleBuildMetricsReporter
import org.jetbrains.kotlin.gradle.report.UsesBuildMetricsService
import org.jetbrains.kotlin.gradle.targets.native.tasks.buildKotlinNativeBinaryLinkerArgs
import org.jetbrains.kotlin.gradle.tasks.KotlinToolTask
import org.jetbrains.kotlin.gradle.utils.XcodeUtils
import org.jetbrains.kotlin.gradle.utils.newInstance
import org.jetbrains.kotlin.gradle.utils.property
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.konan.util.visibleName
@@ -45,6 +52,7 @@ abstract class KotlinNativeLinkArtifactTask @Inject constructor(
private val execOperations: ExecOperations,
private val projectLayout: ProjectLayout
) : DefaultTask(),
UsesBuildMetricsService,
KotlinToolTask<KotlinCommonCompilerToolOptions> {
@get:Input
@@ -163,6 +171,10 @@ abstract class KotlinNativeLinkArtifactTask @Inject constructor(
destinationDir.asFile.get().resolve(outFileName)
}
@get:Internal
val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
.property(GradleBuildMetricsReporter())
private val runnerSettings = KotlinNativeCompilerRunner.Settings.fromProject(project)
init {
@@ -183,36 +195,42 @@ abstract class KotlinNativeLinkArtifactTask @Inject constructor(
@TaskAction
fun link() {
val outFile = outputFile.get()
outFile.ensureParentDirsCreated()
val metricReporter = metrics.get()
fun FileCollection.klibs() = files.filter { it.extension == "klib" }
addBuildMetricsForTaskAction(metricsReporter = metricReporter, languageVersion = null) {
val buildArgs = buildKotlinNativeBinaryLinkerArgs(
outFile = outFile,
optimized = optimized.get(),
debuggable = debuggable.get(),
target = konanTarget,
outputKind = outputKind,
libraries = libraries.klibs(),
friendModules = emptyList(), //FriendModules aren't needed here because it's no test artifact
toolOptions = toolOptions,
compilerPlugins = emptyList(),//CompilerPlugins aren't needed here because it's no compilation but linking
processTests = processTests.get(),
entryPoint = entryPoint.getOrNull(),
embedBitcode = bitcodeEmbeddingMode(),
linkerOpts = linkerOptions.get(),
binaryOptions = allBinaryOptions.get(),
isStaticFramework = staticFramework.get(),
exportLibraries = exportLibraries.klibs(),
includeLibraries = includeLibraries.klibs(),
additionalOptions = emptyList()//todo support org.jetbrains.kotlin.gradle.tasks.CacheBuilder and org.jetbrains.kotlin.gradle.tasks.ExternalDependenciesBuilder
)
val outFile = outputFile.get()
outFile.ensureParentDirsCreated()
KotlinNativeCompilerRunner(
settings = runnerSettings,
executionContext = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger)
).run(buildArgs)
fun FileCollection.klibs() = files.filter { it.extension == "klib" }
val buildArgs = buildKotlinNativeBinaryLinkerArgs(
outFile = outFile,
optimized = optimized.get(),
debuggable = debuggable.get(),
target = konanTarget,
outputKind = outputKind,
libraries = libraries.klibs(),
friendModules = emptyList(), //FriendModules aren't needed here because it's no test artifact
toolOptions = toolOptions,
compilerPlugins = emptyList(),//CompilerPlugins aren't needed here because it's no compilation but linking
processTests = processTests.get(),
entryPoint = entryPoint.getOrNull(),
embedBitcode = bitcodeEmbeddingMode(),
linkerOpts = linkerOptions.get(),
binaryOptions = allBinaryOptions.get(),
isStaticFramework = staticFramework.get(),
exportLibraries = exportLibraries.klibs(),
includeLibraries = includeLibraries.klibs(),
additionalOptions = emptyList()//todo support org.jetbrains.kotlin.gradle.tasks.CacheBuilder and org.jetbrains.kotlin.gradle.tasks.ExternalDependenciesBuilder
)
KotlinNativeCompilerRunner(
settings = runnerSettings,
executionContext = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger),
metricReporter,
).run(buildArgs)
}
}
private fun bitcodeEmbeddingMode(): BitcodeEmbeddingMode {
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.gradle.plugin.internal.BuildIdService
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.internal
import org.jetbrains.kotlin.gradle.report.BuildMetricsService
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_BUILD_DIR_NAME
import org.jetbrains.kotlin.gradle.utils.providerWithLazyConvention
@@ -43,7 +42,6 @@ internal abstract class AbstractKotlinCompileConfig<TASK : AbstractKotlinCompile
init {
val compilerSystemPropertiesService = CompilerSystemPropertiesService.registerIfAbsent(project)
val buildMetricsService = BuildMetricsService.registerIfAbsent(project)
val incrementalModuleInfoProvider =
IncrementalModuleInfoBuildService.registerIfAbsent(project, objectFactory.providerWithLazyConvention {
GradleCompilerRunner.buildModulesInfo(project.gradle)
@@ -62,9 +60,6 @@ internal abstract class AbstractKotlinCompileConfig<TASK : AbstractKotlinCompile
.disallowChanges()
task.localStateDirectories.from(task.taskBuildLocalStateDirectory).disallowChanges()
buildMetricsService?.also { metricsService ->
task.buildMetricsService.value(metricsService).disallowChanges()
}
task.systemPropertiesService.value(compilerSystemPropertiesService).disallowChanges()
task.incrementalModuleInfoProvider.value(incrementalModuleInfoProvider).disallowChanges()