diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index 1b71694d560..5f76c335a57 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -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" } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/cacheKlibUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/cacheKlibUtils.kt index b4c6aca33af..8cc0462ca15 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/cacheKlibUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/cacheKlibUtils.kt @@ -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? { 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