[K/N] Pass transitive dependencies for forked caching compilation

This commit is contained in:
Igor Chevdar
2023-01-12 16:41:28 +02:00
committed by Space Team
parent e2618ca9d3
commit df778b8a6e
2 changed files with 25 additions and 25 deletions
@@ -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<String, KotlinLibrary>): List<KotlinLibrary> {
val allDependencies = mutableSetOf<KotlinLibrary>()
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)
@@ -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<KotlinLibrary, Cache> = 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<KotlinLibrary>): List<KotlinLibrary> {
val uniqueNameToLibrary = allLibraries.associateBy { it.uniqueName }
val allDependencies = mutableSetOf<KotlinLibrary>()
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<KotlinLibrary>): File {
val dependencies = getAllDependencies(library, allLibraries)
fun computeVersionedCacheDirectory(baseCacheDirectory: File, library: KotlinLibrary, allLibraries: Map<String, KotlinLibrary>): File {
val dependencies = library.getAllTransitiveDependencies(allLibraries)
val messageDigest = MessageDigest.getInstance("SHA-256")
messageDigest.update(compilerMarker)
messageDigest.digestLibrary(library)