From 8158d34bdac8d4299677a8bd83623f19b1faf989 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 15 Jan 2020 18:16:05 +0700 Subject: [PATCH] Gradle, native: Escape spaces in K/N compiler args We use an argument file to pass arguments to the K/N compiler. Earlier each line of such a file was treated by the compiler as a separate argument. But this logic was updated some time ago and now content for this file is treated as a space separated list of arguments. This patch takes this into account at the Gradle side and quotes arguments written to the arg file. Issue #KT-35934 Fixed --- .../kotlin/gradle/NewMultiplatformIT.kt | 16 ++++++++++++++++ .../compilerRunner/KotlinNativeToolRunner.kt | 7 +++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 6612a4b4709..c20d0ed260b 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -2249,4 +2249,20 @@ class NewMultiplatformIT : BaseGradleIT() { } } } + + @Test + fun testNativeArgsWithSpaces() = with(Project("sample-lib", directoryPrefix = "new-mpp-lib-and-app")) { + setupWorkingDir() + val fileWithSpacesInPath = projectDir.resolve("src/commonMain/kotlin/path with spaces and special symbols like \"") + .apply { mkdirs() } + .resolve("B.kt") + fileWithSpacesInPath.writeText("fun foo() = 42") + + build("compileKotlin${nativeHostTargetName.capitalize()}") { + assertSuccessful() + checkNativeCommandLineFor(":compileKotlin${nativeHostTargetName.capitalize()}") { + it.contains(fileWithSpacesInPath.absolutePath) + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt index a4c8b215da8..87ffc0b9245 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt @@ -227,8 +227,11 @@ internal class KonanCompilerRunner( deleteOnExit() } argFile.printWriter().use { writer -> - args.forEach { - writer.println(it) + args.forEach { arg -> + val escapedArg = arg + .replace("\\", "\\\\") + .replace("\"", "\\\"") + writer.println("\"$escapedArg\"") } }