[Gradle] Implement disable native cache api
^KT-80715
diff --git a/libraries/tools/kotlin-gradle-plugin/api/all/kotlin-gradle-plugin.api b/libraries/tools/kotlin-gradle-plugin/api/all/kotlin-gradle-plugin.api
index d4da499..41e2510 100644
--- a/libraries/tools/kotlin-gradle-plugin/api/all/kotlin-gradle-plugin.api
+++ b/libraries/tools/kotlin-gradle-plugin/api/all/kotlin-gradle-plugin.api
@@ -4986,6 +4986,16 @@
public fun setDeviceId (Ljava/lang/String;)V
}
+public final class org/jetbrains/kotlin/gradle/targets/native/DisableNativeCacheInKotlinVersion : java/io/Serializable {
+ public static final field Companion Lorg/jetbrains/kotlin/gradle/targets/native/DisableNativeCacheInKotlinVersion$Companion;
+ public fun toString ()Ljava/lang/String;
+}
+
+public final class org/jetbrains/kotlin/gradle/targets/native/DisableNativeCacheInKotlinVersion$Companion {
+ public final fun get2_3_0 ()Lorg/jetbrains/kotlin/gradle/targets/native/DisableNativeCacheInKotlinVersion;
+ public final fun get2_4_0 ()Lorg/jetbrains/kotlin/gradle/targets/native/DisableNativeCacheInKotlinVersion;
+}
+
public abstract class org/jetbrains/kotlin/gradle/targets/native/KonanPropertiesBuildService : org/gradle/api/services/BuildService {
public static final field Companion Lorg/jetbrains/kotlin/gradle/targets/native/KonanPropertiesBuildService$Companion;
public fun <init> ()V
@@ -4999,6 +5009,9 @@
public abstract fun setExecutionSourceFrom (Lorg/jetbrains/kotlin/gradle/plugin/mpp/TestExecutable;)V
}
+public abstract interface annotation class org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCacheApi : java/lang/annotation/Annotation {
+}
+
public abstract interface class org/jetbrains/kotlin/gradle/targets/native/KotlinNativeHostTestRun : org/jetbrains/kotlin/gradle/targets/native/KotlinNativeBinaryTestRun {
}
diff --git a/libraries/tools/kotlin-gradle-plugin/api/external/kotlin-gradle-plugin.api b/libraries/tools/kotlin-gradle-plugin/api/external/kotlin-gradle-plugin.api
index b7a36f3..28d1dfd 100644
--- a/libraries/tools/kotlin-gradle-plugin/api/external/kotlin-gradle-plugin.api
+++ b/libraries/tools/kotlin-gradle-plugin/api/external/kotlin-gradle-plugin.api
@@ -1042,6 +1042,8 @@
public abstract class org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinary : org/gradle/api/Named {
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Lorg/jetbrains/kotlin/gradle/plugin/mpp/NativeBuildType;Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinNativeCompilation;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun binaryOption (Ljava/lang/String;Ljava/lang/String;)V
+ public final fun disableNativeCache (Lorg/jetbrains/kotlin/gradle/targets/native/DisableNativeCacheInKotlinVersion;Ljava/lang/String;Ljava/net/URI;)V
+ public static synthetic fun disableNativeCache$default (Lorg/jetbrains/kotlin/gradle/plugin/mpp/NativeBinary;Lorg/jetbrains/kotlin/gradle/targets/native/DisableNativeCacheInKotlinVersion;Ljava/lang/String;Ljava/net/URI;ILjava/lang/Object;)V
public fun getBaseName ()Ljava/lang/String;
public final fun getBinaryOptions ()Ljava/util/Map;
public final fun getBuildType ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/NativeBuildType;
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DisableNativeCacheInKotlinVersion.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DisableNativeCacheInKotlinVersion.kt
new file mode 100644
index 0000000..032ffbd
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DisableNativeCacheInKotlinVersion.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.gradle.targets.native
+
+import org.jetbrains.kotlin.tooling.core.KotlinToolingVersion
+import java.io.Serializable
+import java.net.URI
+
+/**
+ * Represents a specific Kotlin version for which native caching can be disabled via the DSL.
+ *
+ * The constructor is private to ensure that only predefined, valid instances
+ * provided in the companion object can be used.
+ *
+ * This class is marked with `@KotlinNativeCacheApi` and should only be used within the
+ * context of the `disableNativeCache` function.
+ */
+@KotlinNativeCacheApi
+class DisableNativeCacheInKotlinVersion private constructor(internal val version: KotlinToolingVersion) : Serializable {
+
+ override fun toString(): String = version.toString()
+
+ @Suppress("unused")
+ companion object {
+ /** Disables native cache for Kotlin version 2.3.0 */
+ val `2_3_0` = DisableNativeCacheInKotlinVersion(KotlinToolingVersion(2, 3, 0, null))
+
+ /** Disables native cache for Kotlin version 2.4.0 */
+ val `2_4_0` = DisableNativeCacheInKotlinVersion(KotlinToolingVersion(2, 4, 0, null))
+
+ // As new versions with cache-related bugs are found,
+ // the Kotlin team would add new properties here.
+ }
+}
+
+@KotlinNativeCacheApi
+internal data class DisableNativeCacheSettings(
+ val version: DisableNativeCacheInKotlinVersion,
+ val reason: String,
+ val issueUrl: URI?,
+) : Serializable
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCacheApi.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCacheApi.kt
new file mode 100644
index 0000000..8eb6849
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCacheApi.kt
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.gradle.targets.native
+
+/**
+ * This annotation marks the API for the Native Cache DSL as experimental and context-specific.
+ *
+ * Any API component marked with `@KotlinNativeCacheApi` is intended for use only within
+ * the specific DSL scopes provided by the Kotlin Gradle Plugin, such as the `disableNativeCache` function.
+ * Using these components outside of their intended scope is not supported and may lead to
+ * unexpected behavior or compilation errors.
+ */
+@RequiresOptIn(
+ level = RequiresOptIn.Level.ERROR,
+ message = "This API is intended for use only within the Kotlin Native Cache DSL."
+)
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
+annotation class KotlinNativeCacheApi
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt
index d6c48d3..c6880f5 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt
@@ -20,6 +20,9 @@
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.KotlinGradlePluginPublicDsl
+import org.jetbrains.kotlin.gradle.targets.native.DisableNativeCacheInKotlinVersion
+import org.jetbrains.kotlin.gradle.targets.native.DisableNativeCacheSettings
+import org.jetbrains.kotlin.gradle.targets.native.KotlinNativeCacheApi
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
import org.jetbrains.kotlin.gradle.utils.attributeOf
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
@@ -28,6 +31,7 @@
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toUpperCaseAsciiOnly
import java.io.File
+import java.net.URI
/**
* A base class representing a final binary produced by the Kotlin/Native compiler
@@ -75,6 +79,21 @@
linkerOpts.addAll(options)
}
+ /**
+ * Disables the Kotlin/Native cache for a specific Kotlin version and provides a reason for the action.
+ * Optionally, a related issue tracker URL can be specified to provide more context.
+ *
+ * @param version The Kotlin version for which the native cache should be disabled.
+ * Only predefined versions available in `DisableCacheInKotlinVersion` are supported.
+ * @param reason A descriptive explanation clarifying why the native cache is being disabled.
+ * @param issueUrl An optional issue tracker URL that provides additional context or links to a documented issue.
+ */
+ @Suppress("unused")
+ @KotlinNativeCacheApi
+ fun disableNativeCache(version: DisableNativeCacheInKotlinVersion, reason: String, issueUrl: URI? = null) {
+ disableCacheSettings.set(DisableNativeCacheSettings(version, reason, issueUrl))
+ }
+
var binaryOptions: MutableMap<String, String> = mutableMapOf()
fun binaryOption(name: String, value: String) {
@@ -121,6 +140,10 @@
linkTaskProvider.flatMap { it.outputFile }
}
+ @OptIn(KotlinNativeCacheApi::class)
+ internal val disableCacheSettings: Property<DisableNativeCacheSettings> =
+ project.objects.property(DisableNativeCacheSettings::class.java)
+
val outputFile: File
get() = outputFileProvider.get()