[PL] Use CLI parameter -Xpartial-linkage with new semantics in Gradle plugin

This commit is contained in:
Dmitriy Dolovov
2023-03-29 19:44:18 +02:00
committed by Space Team
parent 39b385f475
commit 1aa3e54459
2 changed files with 21 additions and 12 deletions
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.gradle.targets.native.internal.isAllowCommonizer
import org.jetbrains.kotlin.gradle.targets.native.tasks.*
import org.jetbrains.kotlin.gradle.utils.*
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
import org.jetbrains.kotlin.konan.properties.saveToFile
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
@@ -760,8 +761,10 @@ internal class CacheBuilder(
private val rootCacheDirectory: File
get() = settings.rootCacheDirectory
private val partialLinkage: Boolean
get() = PARTIAL_LINKAGE in settings.toolOptions.freeCompilerArgs.get()
private val partialLinkageMode: String
get() = settings.toolOptions.freeCompilerArgs.get().mapNotNull { arg ->
arg.substringAfter("$PARTIAL_LINKAGE_PARAMETER=", missingDelimiterValue = "").takeIf(String::isNotEmpty)
}.lastOrNull() ?: PartialLinkageMode.DEFAULT.name
private fun getCacheDirectory(
resolvedConfiguration: LazyResolvedConfiguration,
@@ -771,7 +774,7 @@ internal class CacheBuilder(
dependency = dependency,
artifact = null,
resolvedConfiguration = resolvedConfiguration,
partialLinkage = partialLinkage
partialLinkageMode = partialLinkageMode
)
private fun needCache(libraryPath: String) =
@@ -800,7 +803,7 @@ internal class CacheBuilder(
dependency = dependency,
considerArtifact = false,
resolvedConfiguration = this,
partialLinkage = partialLinkage
partialLinkageMode = partialLinkageMode
) ?: return
val cacheDirectory = getCacheDirectory(this, dependency)
@@ -846,7 +849,7 @@ internal class CacheBuilder(
if (debuggable) args += "-g"
args += konanPropertiesService.additionalCacheFlags(konanTarget)
args += settings.externalDependenciesArgs
if (partialLinkage) args += PARTIAL_LINKAGE
args += "$PARTIAL_LINKAGE_PARAMETER=$partialLinkageMode"
args += "-Xadd-cache=${library.libraryFile.absolutePath}"
args += "-Xcache-directory=${cacheDirectory.absolutePath}"
args += "-Xcache-directory=${rootCacheDirectory.absolutePath}"
@@ -955,7 +958,7 @@ internal class CacheBuilder(
"${baseName}-cache"
} ?: error("No output for kind $cacheKind")
private const val PARTIAL_LINKAGE = "-Xpartial-linkage"
private const val PARTIAL_LINKAGE_PARAMETER = "-Xpartial-linkage"
}
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.utils
import org.gradle.api.artifacts.result.ResolvedArtifactResult
import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.gradle.api.logging.Logger
import org.jetbrains.kotlin.ir.linkage.partial.PartialLinkageMode
import org.jetbrains.kotlin.library.resolveSingleFileKlib
import org.jetbrains.kotlin.library.uniqueName
import java.io.File
@@ -19,7 +20,7 @@ internal fun getCacheDirectory(
dependency: ResolvedDependencyResult,
artifact: ResolvedArtifactResult?,
resolvedConfiguration: LazyResolvedConfiguration,
partialLinkage: Boolean
partialLinkageMode: String
): File {
val moduleCacheDirectory = File(rootCacheDirectory, dependency.selected.moduleVersion?.name ?: "undefined")
val versionCacheDirectory = File(moduleCacheDirectory, dependency.selected.moduleVersion?.version ?: "undefined")
@@ -41,14 +42,19 @@ internal fun getCacheDirectory(
versionCacheDirectory.resolve(hash)
} else versionCacheDirectory
return File(cacheDirectory, computeDependenciesHash(dependency, resolvedConfiguration, partialLinkage))
return File(cacheDirectory, computeDependenciesHash(dependency, resolvedConfiguration, partialLinkageMode))
}
internal fun ByteArray.toHexString() = joinToString("") { (0xFF and it.toInt()).toString(16).padStart(2, '0') }
private fun computeDependenciesHash(dependency: ResolvedDependencyResult, resolvedConfiguration: LazyResolvedConfiguration, partialLinkage: Boolean): String {
private fun computeDependenciesHash(
dependency: ResolvedDependencyResult,
resolvedConfiguration: LazyResolvedConfiguration,
partialLinkageMode: String
): String {
val hashedValue = buildString {
if (partialLinkage) append("#__PL__#")
if (PartialLinkageMode.resolveMode(partialLinkageMode)?.isEnabled == true)
append("#__PL__#")
(listOf(dependency) + getAllDependencies(dependency))
.flatMap { resolvedConfiguration.getArtifacts(it) }
@@ -68,7 +74,7 @@ internal fun getDependenciesCacheDirectories(
dependency: ResolvedDependencyResult,
resolvedConfiguration: LazyResolvedConfiguration,
considerArtifact: Boolean,
partialLinkage: Boolean
partialLinkageMode: String
): List<File>? {
return getAllDependencies(dependency)
.flatMap { childDependency ->
@@ -79,7 +85,7 @@ internal fun getDependenciesCacheDirectories(
dependency = childDependency,
artifact = if (considerArtifact) it else null,
resolvedConfiguration = resolvedConfiguration,
partialLinkage = partialLinkage
partialLinkageMode = partialLinkageMode
)
if (!cacheDirectory.exists()) return null
cacheDirectory