diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt index fe12fef41ea..69204be8f8b 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt @@ -236,6 +236,7 @@ class CachedLibraries( fun computeVersionedCacheDirectory(baseCacheDirectory: File, library: KotlinLibrary, allLibraries: List): File { val dependencies = getAllDependencies(library, allLibraries) val messageDigest = MessageDigest.getInstance("SHA-256") + messageDigest.update(compilerMarker) messageDigest.digestLibrary(library) dependencies.sortedBy { it.uniqueName }.forEach { messageDigest.digestLibrary(it) } @@ -252,5 +253,8 @@ class CachedLibraries( const val INLINE_FUNCTION_BODIES_FILE_NAME = "inline_bodies" const val CLASS_FIELDS_FILE_NAME = "class_fields" const val EAGER_INITIALIZED_PROPERTIES_FILE_NAME = "eager_init" + + // TODO: Remove after dropping Gradle cache orchestration. + private val compilerMarker = "K/N orchestration".encodeToByteArray() } } 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 7ee50fff4bc..d292fb9a590 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 @@ -10,6 +10,7 @@ import org.gradle.api.file.FileCollection import org.gradle.api.tasks.* 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.isAtLeast import org.jetbrains.kotlin.gradle.plugin.mpp.nativeUseEmbeddableCompilerJar @@ -48,6 +49,10 @@ internal fun Project.getKonanCacheKind(target: KonanTarget): NativeCacheKind { } } +internal fun Project.getKonanCacheOrchestration(): NativeCacheOrchestration { + return PropertiesProvider(this).nativeCacheOrchestration ?: NativeCacheOrchestration.Compiler +} + 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/dsl/KotlinProjectExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt index 2d5941029fe..c8b2177ecb3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt @@ -409,3 +409,14 @@ enum class NativeCacheKind(val produce: String?, val outputKind: CompilerOutputK NativeCacheKind.values().firstOrNull { it.name.equals(argument, ignoreCase = true) } } } + +// This is a temporary parameter for the translation period. +enum class NativeCacheOrchestration { + Gradle, + Compiler; + + companion object { + fun byCompilerArgument(argument: String): NativeCacheOrchestration? = + NativeCacheOrchestration.values().firstOrNull { it.name.equals(argument, ignoreCase = true) } + } +} 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 a6de58fb30e..6d00f966988 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 @@ -10,6 +10,7 @@ import org.gradle.util.GradleVersion import org.jetbrains.kotlin.cli.common.CompilerSystemProperties import org.jetbrains.kotlin.cli.common.toBooleanLenient import org.jetbrains.kotlin.gradle.dsl.NativeCacheKind +import org.jetbrains.kotlin.gradle.dsl.NativeCacheOrchestration import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessageOutputStreamHandler.Companion.IGNORE_TCSM_OVERFLOW import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.Companion.jsCompilerProperty import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_ABI_SNAPSHOT @@ -396,6 +397,12 @@ internal class PropertiesProvider private constructor(private val project: Proje fun nativeCacheKindForTarget(target: KonanTarget): NativeCacheKind? = this.property("kotlin.native.cacheKind.${target.presetName}")?.let { NativeCacheKind.byCompilerArgument(it) } + /** + * Dependencies caching orchestration machinery. + */ + val nativeCacheOrchestration: NativeCacheOrchestration? + get() = this.property(PropertyNames.KOTLIN_NATIVE_CACHE_ORCHESTRATION)?.let { NativeCacheOrchestration.byCompilerArgument(it) } + /** * Ignore overflow in [org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessageOutputStreamHandler] */ @@ -530,6 +537,7 @@ internal class PropertiesProvider private constructor(private val project: Proje const val KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_ANDROID_STYLE_NO_WARN = "kotlin.mpp.androidSourceSetLayoutV2AndroidStyleDirs.nowarn" const val KOTLIN_MPP_IMPORT_ENABLE_SLOW_SOURCES_JAR_RESOLVER = "kotlin.mpp.import.enableSlowSourcesJarResolver" const val KOTLIN_NATIVE_DEPENDENCY_PROPAGATION = "kotlin.native.enableDependencyPropagation" + const val KOTLIN_NATIVE_CACHE_ORCHESTRATION = "kotlin.native.cacheOrchestration" 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 2b26541a508..1b91831f74c 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 @@ -21,6 +21,7 @@ import org.gradle.process.ExecOperations import org.jetbrains.kotlin.compilerRunner.KotlinNativeCompilerRunner import org.jetbrains.kotlin.compilerRunner.KotlinToolRunner import org.jetbrains.kotlin.compilerRunner.getKonanCacheKind +import org.jetbrains.kotlin.compilerRunner.getKonanCacheOrchestration import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.cocoapods.asValidFrameworkName @@ -192,6 +193,12 @@ constructor( CacheBuilder.Settings.createWithProject(project, binary, konanTarget, toolOptions, externalDependenciesArgs) } + private class CacheSettings(val orchestration: NativeCacheOrchestration, val kind: NativeCacheKind, val gradleUserHomeDir: File) + + private val cacheSettings by lazy { + CacheSettings(project.getKonanCacheOrchestration(), project.getKonanCacheKind(konanTarget), project.gradle.gradleUserHomeDir) + } + override fun createCompilerArgs(): StubK2NativeCompilerArguments = StubK2NativeCompilerArguments() override fun setupCompilerArgs( @@ -297,11 +304,23 @@ constructor( ) val executionContext = KotlinToolRunner.GradleExecutionContext.fromTaskContext(objectFactory, execOperations, logger) - val cacheArgs = CacheBuilder( - executionContext = executionContext, - settings = cacheBuilderSettings, - konanPropertiesService = konanPropertiesService.get() - ).buildCompilerArgs(resolvedDependencyGraph) + val additionalOptions = mutableListOf().apply { + addAll(externalDependenciesArgs) + when (cacheSettings.orchestration) { + NativeCacheOrchestration.Compiler -> { + if (cacheSettings.kind != NativeCacheKind.NONE && konanPropertiesService.get().cacheWorksFor(konanTarget)) + add("-Xauto-cache-from=${cacheSettings.gradleUserHomeDir}") + } + NativeCacheOrchestration.Gradle -> { + val cacheBuilder = CacheBuilder( + executionContext = executionContext, + settings = cacheBuilderSettings, + konanPropertiesService = konanPropertiesService.get() + ) + addAll(cacheBuilder.buildCompilerArgs(resolvedDependencyGraph)) + } + } + } @Suppress("DEPRECATION") val enableEndorsedLibs = this.enableEndorsedLibs // TODO: remove before 1.9.0, see KT-54098 @@ -324,7 +343,7 @@ constructor( isStaticFramework, exportLibraries.files.filterKlibsPassedToCompiler(), sources.asFileTree.files.toList(), - externalDependenciesArgs + cacheArgs + additionalOptions ) KotlinNativeCompilerRunner(