From 9295f44eda715c61e17fb21bad1b053f751a8094 Mon Sep 17 00:00:00 2001 From: Timofey Solonin Date: Wed, 13 Mar 2024 19:48:01 +0100 Subject: [PATCH] Quote module name in the generated modulemap This fixes an issue where Kotlin projects named "umbrella" or "framework" produce unimportable framework modules. ^KT-66565 --- .../kotlin/gradle/native/AppleFrameworkIT.kt | 4 ++-- .../targets/native/tasks/FatFrameworkTask.kt | 2 +- .../testData/framework/kt66565/kt66565.kt | 0 .../testData/framework/kt66565/kt66565.swift | 1 + .../konan/test/blackbox/FrameworkTest.kt | 21 ++++++++++++++++++- .../konan/objcexport/ModuleMapBuilder.kt | 2 +- 6 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 native/native.tests/testData/framework/kt66565/kt66565.kt create mode 100644 native/native.tests/testData/framework/kt66565/kt66565.swift diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/AppleFrameworkIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/AppleFrameworkIT.kt index e481f8556c5..8318aefbca9 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/AppleFrameworkIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/AppleFrameworkIT.kt @@ -50,7 +50,7 @@ class AppleFrameworkIT : KGPBaseTest() { assertDirectoryInProjectExists("shared/build/builtProductsDir/sdk.framework.dSYM") assertFileInProjectContains( "shared/build/builtProductsDir/sdk.framework/Modules/module.modulemap", - "framework module sdk", + "framework module \"sdk\"", ) assertDirectoryInProjectDoesNotExist("shared/build/xcode-frameworks/sdk.framework") } @@ -103,7 +103,7 @@ class AppleFrameworkIT : KGPBaseTest() { assertDirectoryInProjectExists("shared/build/xcode-frameworks/Release/iphonesimulator/sdk.framework.dSYM") assertFileInProjectContains( "shared/build/xcode-frameworks/Release/iphonesimulator/sdk.framework/Modules/module.modulemap", - "framework module sdk", + "framework module \"sdk\"", ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/FatFrameworkTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/FatFrameworkTask.kt index 2bcb7a554d7..0a0a9a8dce7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/FatFrameworkTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/FatFrameworkTask.kt @@ -370,7 +370,7 @@ internal constructor( private fun createModuleFile(outputFile: File, frameworkName: String) { outputFile.writeText(""" - framework module $frameworkName { + framework module "$frameworkName" { umbrella header "$frameworkName.h" export * diff --git a/native/native.tests/testData/framework/kt66565/kt66565.kt b/native/native.tests/testData/framework/kt66565/kt66565.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/native/native.tests/testData/framework/kt66565/kt66565.swift b/native/native.tests/testData/framework/kt66565/kt66565.swift new file mode 100644 index 00000000000..2152cda70ef --- /dev/null +++ b/native/native.tests/testData/framework/kt66565/kt66565.swift @@ -0,0 +1 @@ +import umbrella \ No newline at end of file diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/FrameworkTest.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/FrameworkTest.kt index 60caf682e4a..e63d4a6610b 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/FrameworkTest.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/FrameworkTest.kt @@ -203,6 +203,24 @@ abstract class FrameworkTestBase : AbstractNativeSimpleTest() { compileAndRunSwift(testName, testCase) } + @Test + fun testKT66565_usingModuleMapSyntaxInKotlinModuleNameMakesImportableModule() { + Assumptions.assumeTrue(targets.testTarget.family.isAppleFamily) + val reservedModuleMapSyntax = "umbrella" + val testName = "kt66565" + generateObjCFramework(testName, moduleName = reservedModuleMapSyntax) + SwiftCompilation( + testRunSettings, + listOf(testSuiteDir.resolve(testName).resolve("$testName.swift")), + TestCompilationArtifact.BinaryLibrary(buildDir.resolve("swiftObject")), + listOf( + "-c", + "-F", buildDir.absolutePath + ), + outputFile = { library -> library.libraryFile } + ).result.assertSuccess() + } + @Test fun testStacktrace() { val testName = "stacktrace" @@ -468,13 +486,14 @@ abstract class FrameworkTestBase : AbstractNativeSimpleTest() { testCompilerArgs: List = emptyList(), givenDependencies: Set = emptySet(), checks: TestRunChecks = TestRunChecks.Default(testRunSettings.get().executionTimeout), + moduleName: String = name.replaceFirstChar { it.uppercase() }, ): TestCase { Assumptions.assumeTrue(targets.testTarget.family.isAppleFamily) val testCase = generateObjCFrameworkTestCase( TestKind.STANDALONE_NO_TR, extras, - name.replaceFirstChar { it.uppercase() }, + moduleName, listOf(testSuiteDir.resolve(name).resolve("$name.kt")), TestCompilerArgs(testCompilerArgs + listOf("-Xbinary=bundleId=$name")), givenDependencies, diff --git a/native/objcexport-header-generator/src/org/jetbrains/kotlin/backend/konan/objcexport/ModuleMapBuilder.kt b/native/objcexport-header-generator/src/org/jetbrains/kotlin/backend/konan/objcexport/ModuleMapBuilder.kt index 87a60653f6e..f0f7b43224c 100644 --- a/native/objcexport-header-generator/src/org/jetbrains/kotlin/backend/konan/objcexport/ModuleMapBuilder.kt +++ b/native/objcexport-header-generator/src/org/jetbrains/kotlin/backend/konan/objcexport/ModuleMapBuilder.kt @@ -12,7 +12,7 @@ package org.jetbrains.kotlin.backend.konan.objcexport */ class ModuleMapBuilder { fun build(frameworkName: String, moduleDependencies: Set): String = buildString { - appendLine("framework module $frameworkName {") + appendLine("framework module \"$frameworkName\" {") appendLine(" umbrella header \"$frameworkName.h\"") appendLine() appendLine(" export *")