Reinstall native only once per build
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/KotlinNativeBundleBuildService.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/KotlinNativeBundleBuildService.kt
index 35df177..ddd5a95 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/KotlinNativeBundleBuildService.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/KotlinNativeBundleBuildService.kt
@@ -75,6 +75,11 @@
     @get:Inject
     abstract val archiveOperations: ArchiveOperations
 
+    private var canBeReinstalled: Boolean = true // we can reinstall a k/n bundle once during the build
+
+    @Synchronized
+    internal fun getReinstallLock(): Boolean = canBeReinstalled.also { canBeReinstalled = false }
+
     companion object {
         private val log = Logging.getLogger(KotlinNativeBundleBuildService::class.java)
 
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/KotlinNativeProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/KotlinNativeProvider.kt
index 3eca6b7..147ed58 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/KotlinNativeProvider.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/KotlinNativeProvider.kt
@@ -86,7 +86,7 @@
                 } else {
                     providerFactory.of(NativeVersionValueSource::class.java) {
                         it.parameters.bundleDirectory.set(project.nativeProperties.actualNativeHomeDirectory.map { it.absolutePath })
-                        it.parameters.reinstallBundle.set(reinstallBundle)
+                        it.parameters.reinstallBundle.set(kotlinNativeBundleBuildService.zip(reinstallBundle) { service, reinstallRequested -> reinstallRequested && service.getReinstallLock() })
                         it.parameters.kotlinNativeVersion.set(NativeCompilerDownloader.getDependencyNameWithOsAndVersion(project))
                         it.parameters.simpleKotlinNativeVersion.set(project.nativeProperties.kotlinNativeVersion)
                         it.parameters.kotlinNativeCompilerConfiguration.set(
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/NativeVersionValueSource.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/NativeVersionValueSource.kt
index b95ba03..062c817 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/NativeVersionValueSource.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/toolchain/NativeVersionValueSource.kt
@@ -101,10 +101,11 @@
         reinstallFlag: Boolean,
         bundleDir: File,
     ) {
-        if (reinstallFlag && canBeReinstalled) {
+        if (reinstallFlag) {
             logger.info("Removing Kotlin/Native bundle")
-            bundleDir.deleteRecursively()
-            canBeReinstalled = false // we don't need to reinstall k/n if it was reinstalled once during the same build
+            if (!bundleDir.deleteRecursively()) {
+                logger.warn("Failed to remove Kotlin/Native bundle from ${bundleDir.absolutePath}")
+            }
         }
     }
 
@@ -135,7 +136,6 @@
     }
 
     companion object {
-        private var canBeReinstalled: Boolean = true // we can reinstall a k/n bundle once during the build
         private const val MARKER_FILE = "provisioned.ok"
         val logger = LoggerFactory.getLogger("org.jetbrains.kotlin.gradle.targets.native.toolchain")
         internal fun isSnapshotVersion(kotlinNativeVersion: String): Boolean =