From c129e91bd6c0ab64bb4fc23db66692db91835d5e Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 9 Mar 2023 10:39:35 +0200 Subject: [PATCH] [K/N][gradle] Supported IC for caches --- .../compilerRunner/nativeToolRunners.kt | 8 ++++++++ .../gradle/plugin/PropertiesProvider.kt | 11 +++++++++++ .../targets/native/tasks/KotlinNativeLink.kt | 19 +++++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/nativeToolRunners.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/nativeToolRunners.kt index 6b2a1005e64..2d6c273a17a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/nativeToolRunners.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/nativeToolRunners.kt @@ -51,6 +51,14 @@ internal fun Project.getKonanCacheOrchestration(): NativeCacheOrchestration { return PropertiesProvider(this).nativeCacheOrchestration ?: NativeCacheOrchestration.Compiler } +internal fun Project.isKonanIncrementalCompilationEnabled(): Boolean { + return PropertiesProvider(this).incrementalNative ?: false +} + +internal fun Project.getKonanParallelThreads(): Int { + return PropertiesProvider(this).nativeParallelThreads ?: 4 +} + private val Project.kotlinNativeCompilerJar: String get() = if (nativeUseEmbeddableCompilerJar) "$konanHome/konan/lib/kotlin-native-compiler-embeddable.jar" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt index 5f2f37c2e28..378e7b20dad 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt @@ -153,6 +153,9 @@ internal class PropertiesProvider private constructor(private val project: Proje val incrementalJsIr: Boolean get() = booleanProperty("kotlin.incremental.js.ir") ?: true + val incrementalNative: Boolean? + get() = booleanProperty(PropertyNames.KOTLIN_NATIVE_INCREMENTAL_COMPILATION) + val jsIrOutputGranularity: KotlinJsIrOutputGranularity get() = this.property("kotlin.js.ir.output.granularity")?.let { KotlinJsIrOutputGranularity.byArgument(it) } ?: KotlinJsIrOutputGranularity.PER_MODULE @@ -438,6 +441,12 @@ internal class PropertiesProvider private constructor(private val project: Proje val nativeCacheOrchestration: NativeCacheOrchestration? get() = this.property(PropertyNames.KOTLIN_NATIVE_CACHE_ORCHESTRATION)?.let { NativeCacheOrchestration.byCompilerArgument(it) } + /** + * Native backend threads. + */ + val nativeParallelThreads: Int? + get() = this.property(PropertyNames.KOTLIN_NATIVE_PARALLEL_THREADS)?.toInt() + /** * Ignore overflow in [org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessageOutputStreamHandler] */ @@ -610,6 +619,8 @@ internal class PropertiesProvider private constructor(private val project: Proje const val KOTLIN_MPP_ENABLE_INTRANSITIVE_METADATA_CONFIGURATION = "kotlin.mpp.enableIntransitiveMetadataConfiguration" const val KOTLIN_NATIVE_DEPENDENCY_PROPAGATION = "kotlin.native.enableDependencyPropagation" const val KOTLIN_NATIVE_CACHE_ORCHESTRATION = "kotlin.native.cacheOrchestration" + const val KOTLIN_NATIVE_PARALLEL_THREADS = "kotlin.native.parallelThreads" + const val KOTLIN_NATIVE_INCREMENTAL_COMPILATION = "kotlin.incremental.native" const val KOTLIN_MPP_ENABLE_OPTIMISTIC_NUMBER_COMMONIZATION = "kotlin.mpp.enableOptimisticNumberCommonization" const val KOTLIN_MPP_ENABLE_PLATFORM_INTEGER_COMMONIZATION = "kotlin.mpp.enablePlatformIntegerCommonization" const val KOTLIN_ABI_SNAPSHOT = "kotlin.incremental.classpath.snapshot.enabled" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeLink.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeLink.kt index 469dad5e29d..8785fe1df2e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeLink.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeLink.kt @@ -186,10 +186,14 @@ constructor( CacheBuilder.Settings.createWithProject(project, binary, konanTarget, toolOptions, externalDependenciesArgs) } - private class CacheSettings(val orchestration: NativeCacheOrchestration, val kind: NativeCacheKind, val gradleUserHomeDir: File) + private class CacheSettings(val orchestration: NativeCacheOrchestration, val kind: NativeCacheKind, + val icEnabled: Boolean, val threads: Int, + val gradleUserHomeDir: File, val gradleBuildDir: File) private val cacheSettings by lazy { - CacheSettings(project.getKonanCacheOrchestration(), project.getKonanCacheKind(konanTarget), project.gradle.gradleUserHomeDir) + CacheSettings(project.getKonanCacheOrchestration(), project.getKonanCacheKind(konanTarget), + project.isKonanIncrementalCompilationEnabled(), project.getKonanParallelThreads(), + project.gradle.gradleUserHomeDir, project.buildDir) } override fun createCompilerArguments(context: CreateCompilerArgumentsContext) = context.create { @@ -342,9 +346,20 @@ constructor( && 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") + } val cacheBuilder = CacheBuilder( executionContext = executionContext, settings = cacheBuilderSettings,