diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt index 4bb1f8d4aab..ed16d31a0da 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt @@ -11,9 +11,26 @@ import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.metadata.resolver.TopologicalLibraryOrder -import org.jetbrains.kotlin.library.unresolvedDependencies import org.jetbrains.kotlin.library.uniqueName import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary +import org.jetbrains.kotlin.library.unresolvedDependencies + +internal fun KotlinLibrary.getAllTransitiveDependencies(allLibraries: Map): List { + val allDependencies = mutableSetOf() + + fun traverseDependencies(library: KotlinLibrary) { + library.unresolvedDependencies.forEach { + val dependency = allLibraries[it.path]!! + if (dependency !in allDependencies) { + allDependencies += dependency + traverseDependencies(dependency) + } + } + } + + traverseDependencies(this) + return allDependencies.toList() +} class CacheBuilder( val konanConfig: KonanConfig, @@ -39,7 +56,7 @@ class CacheBuilder( if (!isLibraryAutoCacheable) return@librariesLoop - val dependencies = library.unresolvedDependencies.map { uniqueNameToLibrary[it.path]!! } + val dependencies = library.getAllTransitiveDependencies(uniqueNameToLibrary) val dependencyCaches = dependencies.map { caches[it] ?: run { configuration.report(CompilerMessageSeverity.LOGGING, @@ -54,7 +71,7 @@ class CacheBuilder( val libraryCacheDirectory = if (library.isDefault) konanConfig.systemCacheDirectory else - CachedLibraries.computeVersionedCacheDirectory(konanConfig.autoCacheDirectory, library, allLibraries) + CachedLibraries.computeVersionedCacheDirectory(konanConfig.autoCacheDirectory, library, uniqueNameToLibrary) val libraryCache = libraryCacheDirectory.child( if (makePerFileCache) CachedLibraries.getPerFileCachedLibraryName(library) 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 69204be8f8b..4a2fa83ccb4 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 @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.uniqueName -import org.jetbrains.kotlin.library.unresolvedDependencies import java.security.MessageDigest private fun MessageDigest.digestFile(file: File) = @@ -166,6 +165,8 @@ class CachedLibraries( } } + private val uniqueNameToLibrary = allLibraries.associateBy { it.uniqueName } + private val allCaches: Map = allLibraries.mapNotNull { library -> val explicitPath = explicitCaches[library] @@ -175,7 +176,7 @@ class CachedLibraries( } else { val libraryPath = library.libraryFile.absolutePath if (autoCacheableFrom.any { libraryPath.startsWith(it.absolutePath) }) { - val dir = computeVersionedCacheDirectory(autoCacheDirectory, library, allLibraries) + val dir = computeVersionedCacheDirectory(autoCacheDirectory, library, uniqueNameToLibrary) selectCache(library, dir.child(getPerFileCachedLibraryName(library))) ?: selectCache(library, dir.child(getCachedLibraryName(library))) } else { @@ -214,27 +215,9 @@ class CachedLibraries( fun getCachedLibraryName(library: KotlinLibrary): String = getCachedLibraryName(library.uniqueName) fun getCachedLibraryName(libraryName: String): String = "$libraryName-cache" - private fun getAllDependencies(library: KotlinLibrary, allLibraries: List): List { - val uniqueNameToLibrary = allLibraries.associateBy { it.uniqueName } - val allDependencies = mutableSetOf() - - fun traverseDependencies(library: KotlinLibrary) { - library.unresolvedDependencies.forEach { - val dependency = uniqueNameToLibrary[it.path]!! - if (dependency !in allDependencies) { - allDependencies += dependency - traverseDependencies(dependency) - } - } - } - - traverseDependencies(library) - return allDependencies.toList() - } - @OptIn(ExperimentalUnsignedTypes::class) - fun computeVersionedCacheDirectory(baseCacheDirectory: File, library: KotlinLibrary, allLibraries: List): File { - val dependencies = getAllDependencies(library, allLibraries) + fun computeVersionedCacheDirectory(baseCacheDirectory: File, library: KotlinLibrary, allLibraries: Map): File { + val dependencies = library.getAllTransitiveDependencies(allLibraries) val messageDigest = MessageDigest.getInstance("SHA-256") messageDigest.update(compilerMarker) messageDigest.digestLibrary(library)