diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 4bb428d24de..690233f698e 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -85,8 +85,12 @@ class K2Native : CLICompiler() { try { val konanConfig = KonanConfig(project, configuration) - ensureModuleName(konanConfig, environment) - runTopLevelPhases(konanConfig, environment) + try { + ensureModuleName(konanConfig, environment) + runTopLevelPhases(konanConfig, environment) + } finally { + konanConfig.dispose() + } } catch (e: Throwable) { if (e is KonanCompilationException || e is CompilationErrorException) return ExitCode.COMPILATION_ERROR diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index ba4362ff9ca..192ce45f5e8 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -29,6 +29,10 @@ import org.jetbrains.kotlin.utils.addToStdlib.cast class KonanConfig(val project: Project, val configuration: CompilerConfiguration) { + fun dispose() { + tempFiles.dispose() + } + internal val distribution = run { val overridenProperties = mutableMapOf().apply { configuration.get(KonanConfigKeys.OVERRIDE_KONAN_PROPERTIES)?.let(this::putAll) diff --git a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/TempFiles.kt b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/TempFiles.kt index 63fcef8ca12..fc78c37ee12 100644 --- a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/TempFiles.kt +++ b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/TempFiles.kt @@ -23,6 +23,13 @@ import org.jetbrains.kotlin.konan.file.* * If pathToTemporaryDir is given and is not empty then temporary outputs will be preserved */ class TempFiles(outputPath: String, pathToTemporaryDir: String? = null) { + fun dispose() { + if (deleteOnExit) { + // Note: this can throw an exception if a file deletion is failed for some reason (e.g. OS is Windows and the file is in use). + dir.deleteRecursively() + } + } + private val outputName = File(outputPath).name val deleteOnExit = pathToTemporaryDir == null || pathToTemporaryDir.isEmpty() @@ -36,7 +43,7 @@ class TempFiles(outputPath: String, pathToTemporaryDir: String? = null) { private val dir by lazy { if (deleteOnExit) { - createTempDir("konan_temp").deleteOnExit() + createTempDir("konan_temp") } else { createDirForTemporaryFiles(pathToTemporaryDir!!) } @@ -55,8 +62,6 @@ class TempFiles(outputPath: String, pathToTemporaryDir: String? = null) { * Create file named {name}{suffix} inside temporary dir */ fun create(prefix: String, suffix: String = ""): File = - File(dir, "$prefix$suffix").also { - if (deleteOnExit) it.deleteOnExit() - } + File(dir, "$prefix$suffix") }