[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()