diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/CppUsage.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/CppUsage.kt index 75239452b16..fd83be29a13 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/CppUsage.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/CppUsage.kt @@ -19,6 +19,12 @@ object CppUsage { @JvmField val COMPILATION_DATABASE = "llvm-compilation-database" + /** + * Directory with public headers of a component. + */ + @JvmField + val API = Usage.C_PLUS_PLUS_API + @JvmField val USAGE_ATTRIBUTE: Attribute = Usage.USAGE_ATTRIBUTE } \ No newline at end of file diff --git a/kotlin-native/build.gradle b/kotlin-native/build.gradle index 220bc5a2ec2..aef469a2b6a 100644 --- a/kotlin-native/build.gradle +++ b/kotlin-native/build.gradle @@ -148,6 +148,14 @@ configurations { } } + objcExportApi { + canBeConsumed = false + canBeResolved = true + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, CppUsage.API)) + } + } + embeddableJar { canBeConsumed = false canBeResolved = true @@ -175,6 +183,7 @@ dependencies { compilationDatabase project(":kotlin-native:common") compilationDatabase project(":kotlin-native:runtime") runtimeBitcode project(":kotlin-native:runtime") + objcExportApi project(":kotlin-native:runtime") embeddableJar project(path: ':kotlin-native:prepare:kotlin-native-compiler-embeddable', configuration: 'runtimeElements') } @@ -313,6 +322,10 @@ tasks.register("distCompiler", Copy) { exclude('**/*.properties') } + from(configurations.objcExportApi) { + into('konan/swift_export/kotlin_runtime') + } + from(project.file('konan')) { into('konan') include('**/*.properties') diff --git a/kotlin-native/runtime/build.gradle.kts b/kotlin-native/runtime/build.gradle.kts index 36e801c388c..bcd91a02242 100644 --- a/kotlin-native/runtime/build.gradle.kts +++ b/kotlin-native/runtime/build.gradle.kts @@ -42,7 +42,7 @@ val targetList: List by project bitcode { allTargets { module("main") { - headersDirs.from("src/externalCallsChecker/common/cpp") + headersDirs.from("src/externalCallsChecker/common/cpp", "src/objcExport/cpp") sourceSets { main { // TODO: Split out out `base` module and merge it together with `main` into `runtime.bc` @@ -61,6 +61,12 @@ bitcode { testSupportModules.addAll("mm", "noop_externalCallsChecker", "common_alloc", "legacy_alloc", "std_alloc", "common_gc", "noop_gc", "common_gcScheduler", "manual_gcScheduler", "objc") } + // Headers from here get reused by Swift Export, so this module should not depend on anything in the runtime + module("objcExport") { + // There must not be any implementation files, only headers. + sourceSets {} + } + module("mimalloc") { sourceSets { main { @@ -140,21 +146,21 @@ bitcode { } module("compiler_interface") { - headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} } } module("launcher") { - headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} } } module("debug") { - headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} } @@ -162,7 +168,7 @@ bitcode { module("common_alloc") { srcRoot.set(layout.projectDirectory.dir("src/alloc/common")) - headersDirs.from(files("src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} test {} @@ -176,7 +182,7 @@ bitcode { module("std_alloc") { srcRoot.set(layout.projectDirectory.dir("src/alloc/std")) - headersDirs.from(files("src/alloc/common/cpp", "src/alloc/legacy/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/alloc/legacy/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} } @@ -184,7 +190,7 @@ bitcode { module("custom_alloc") { srcRoot.set(layout.projectDirectory.dir("src/alloc/custom")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} test {} @@ -202,7 +208,7 @@ bitcode { module("mimalloc_alloc") { srcRoot.set(layout.projectDirectory.dir("src/alloc/mimalloc")) - headersDirs.from(files("src/mimalloc/c/include", "src/alloc/common/cpp", "src/alloc/legacy/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/mimalloc/c/include", "src/alloc/common/cpp", "src/alloc/legacy/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} } @@ -212,7 +218,7 @@ bitcode { module("legacy_alloc") { srcRoot.set(layout.projectDirectory.dir("src/alloc/legacy")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} test {} @@ -232,7 +238,7 @@ bitcode { module("exceptionsSupport") { srcRoot.set(layout.projectDirectory.dir("src/exceptions_support")) - headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} } @@ -240,7 +246,7 @@ bitcode { module("source_info_core_symbolication") { srcRoot.set(layout.projectDirectory.dir("src/source_info/core_symbolication")) - headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} } @@ -250,7 +256,7 @@ bitcode { module("source_info_libbacktrace") { srcRoot.set(layout.projectDirectory.dir("src/source_info/libbacktrace")) - headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/main/cpp", "src/libbacktrace/c/include")) + headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp", "src/libbacktrace/c/include")) sourceSets { main {} } @@ -259,14 +265,14 @@ bitcode { } module("objc") { - headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} } } module("test_support") { - headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { testFixtures { inputFiles.include("**/*.cpp", "**/*.mm") @@ -275,7 +281,7 @@ bitcode { } module("mm") { - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} testFixtures {} @@ -290,7 +296,7 @@ bitcode { module("common_gc") { srcRoot.set(layout.projectDirectory.dir("src/gc/common")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} test {} @@ -304,7 +310,7 @@ bitcode { module("noop_gc") { srcRoot.set(layout.projectDirectory.dir("src/gc/noop")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp", "src/alloc/legacy/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp", "src/alloc/legacy/cpp")) sourceSets { main {} } @@ -312,7 +318,7 @@ bitcode { module("noop_gc_custom") { srcRoot.set(layout.projectDirectory.dir("src/gc/noop")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp", "src/alloc/custom/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp", "src/alloc/custom/cpp")) sourceSets { main {} } @@ -322,7 +328,7 @@ bitcode { module("same_thread_ms_gc") { srcRoot.set(layout.projectDirectory.dir("src/gc/stms")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp", "src/alloc/legacy/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp", "src/alloc/legacy/cpp")) sourceSets { main {} test {} @@ -336,7 +342,7 @@ bitcode { module("same_thread_ms_gc_custom") { srcRoot.set(layout.projectDirectory.dir("src/gc/stms")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp", "src/alloc/custom/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp", "src/alloc/custom/cpp")) sourceSets { main {} test {} @@ -352,7 +358,7 @@ bitcode { module("pmcs_gc") { srcRoot.set(layout.projectDirectory.dir("src/gc/pmcs")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp", "src/alloc/legacy/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp", "src/alloc/legacy/cpp")) sourceSets { main {} test {} @@ -366,7 +372,7 @@ bitcode { module("pmcs_gc_custom") { srcRoot.set(layout.projectDirectory.dir("src/gc/pmcs")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp", "src/alloc/custom/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp", "src/alloc/custom/cpp")) sourceSets { main {} test {} @@ -382,7 +388,7 @@ bitcode { module("concurrent_ms_gc") { srcRoot.set(layout.projectDirectory.dir("src/gc/cms")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp", "src/alloc/legacy/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp", "src/alloc/legacy/cpp")) sourceSets { main {} test {} @@ -396,7 +402,7 @@ bitcode { module("concurrent_ms_gc_custom") { srcRoot.set(layout.projectDirectory.dir("src/gc/cms")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp", "src/alloc/custom/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp", "src/alloc/custom/cpp")) sourceSets { main {} test {} @@ -412,7 +418,7 @@ bitcode { module("common_gcScheduler") { srcRoot.set(layout.projectDirectory.dir("src/gcScheduler/common")) - headersDirs.from(files("src/alloc/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} test {} @@ -426,7 +432,7 @@ bitcode { module("manual_gcScheduler") { srcRoot.set(layout.projectDirectory.dir("src/gcScheduler/manual")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} } @@ -434,7 +440,7 @@ bitcode { module("adaptive_gcScheduler") { srcRoot.set(layout.projectDirectory.dir("src/gcScheduler/adaptive")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} test {} @@ -448,7 +454,7 @@ bitcode { module("aggressive_gcScheduler") { srcRoot.set(layout.projectDirectory.dir("src/gcScheduler/aggressive")) - headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} test {} @@ -462,7 +468,7 @@ bitcode { module("impl_externalCallsChecker") { srcRoot.set(layout.projectDirectory.dir("src/externalCallsChecker/impl")) - headersDirs.from("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/main/cpp") + headersDirs.from("src/alloc/common/cpp", "src/gcScheduler/common/cpp", "src/gc/common/cpp", "src/mm/cpp", "src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp") sourceSets { main {} } @@ -470,14 +476,14 @@ bitcode { module("noop_externalCallsChecker") { srcRoot.set(layout.projectDirectory.dir("src/externalCallsChecker/noop")) - headersDirs.from("src/externalCallsChecker/common/cpp", "src/main/cpp") + headersDirs.from("src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp") sourceSets { main {} } } module("xctest_launcher") { - headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/main/cpp")) + headersDirs.from(files("src/externalCallsChecker/common/cpp", "src/objcExport/cpp", "src/main/cpp")) sourceSets { main {} @@ -487,6 +493,21 @@ bitcode { } } +val objcExportApi by configurations.creating { + isCanBeConsumed = true + isCanBeResolved = false + attributes { + attribute(CppUsage.USAGE_ATTRIBUTE, objects.named(CppUsage.API)) + attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.DIRECTORY_TYPE) + } +} + +artifacts { + // This should be a "public headers" directory and this configuration with artifacts should be defined by + // CompileToBitcodePlugin itself. + add(objcExportApi.name, layout.projectDirectory.dir("src/objcExport/cpp")) +} + val runtimeBitcode by configurations.creating { isCanBeConsumed = false isCanBeResolved = true diff --git a/kotlin-native/runtime/src/main/cpp/ObjCExportPrivate.h b/kotlin-native/runtime/src/main/cpp/ObjCExportPrivate.h index 2033f406917..ef90ff4d34d 100644 --- a/kotlin-native/runtime/src/main/cpp/ObjCExportPrivate.h +++ b/kotlin-native/runtime/src/main/cpp/ObjCExportPrivate.h @@ -10,14 +10,11 @@ #import +#import "KotlinBase.h" #import "Types.h" #import "Memory.h" #import "ObjCExport.h" -@interface KotlinBase : NSObject -+(instancetype)createRetainedWrapper:(ObjHeader*)obj; -@end - extern "C" void Kotlin_ObjCExport_initializeClass(Class clazz); extern "C" const TypeInfo* Kotlin_ObjCExport_getAssociatedTypeInfo(Class clazz); extern "C" OBJ_GETTER(Kotlin_ObjCExport_convertUnmappedObjCObject, id obj); diff --git a/kotlin-native/runtime/src/objcExport/cpp/KotlinBase.h b/kotlin-native/runtime/src/objcExport/cpp/KotlinBase.h new file mode 100644 index 00000000000..bb181a92c90 --- /dev/null +++ b/kotlin-native/runtime/src/objcExport/cpp/KotlinBase.h @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +#pragma once + +#import + +struct ObjHeader; + +@interface KotlinBase : NSObject ++ (instancetype)createRetainedWrapper:(struct ObjHeader *)obj; +@end diff --git a/kotlin-native/runtime/src/objcExport/cpp/module.modulemap b/kotlin-native/runtime/src/objcExport/cpp/module.modulemap new file mode 100644 index 00000000000..3f62f8a558f --- /dev/null +++ b/kotlin-native/runtime/src/objcExport/cpp/module.modulemap @@ -0,0 +1,4 @@ +module KotlinRuntime { + header "KotlinBase.h" + export * +} \ No newline at end of file diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/SwiftTypeCheckBaseTest.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/SwiftTypeCheckBaseTest.kt index ea0a36df528..6b678336ec4 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/SwiftTypeCheckBaseTest.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/SwiftTypeCheckBaseTest.kt @@ -7,10 +7,12 @@ package org.jetbrains.kotlin.konan.test.blackbox import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.konan.target.AppleConfigurables +import org.jetbrains.kotlin.konan.target.Distribution import org.jetbrains.kotlin.konan.target.withOSVersion import org.jetbrains.kotlin.konan.test.blackbox.support.compilation.invokeSwiftC import org.jetbrains.kotlin.konan.test.blackbox.support.settings.configurables import org.jetbrains.kotlin.konan.test.blackbox.support.util.createModuleMap +import org.jetbrains.kotlin.utils.KotlinNativePaths import org.jetbrains.kotlin.utils.fileUtils.withReplacedExtensionOrNull import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assumptions @@ -55,10 +57,13 @@ abstract class SwiftTypeCheckBaseTest : AbstractNativeSimpleTest() { val swiftTarget = configs.targetTriple.withOSVersion(configs.osVersionMin).toString() val bridgeModuleFile = createModuleMap(buildDir, cHeader) + val kotlinRuntimeModuleMapFile = Distribution(KotlinNativePaths.homePath.absolutePath) + .kotlinRuntimeForSwiftModuleMap val args = listOf( "-typecheck", swiftFile.absolutePath, "-Xcc", "-fmodule-map-file=${bridgeModuleFile.absolutePath}", + "-Xcc", "-fmodule-map-file=${kotlinRuntimeModuleMapFile}", "-sdk", configs.absoluteTargetSysRoot, "-target", swiftTarget ) diff --git a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt index 857a6d18020..e9780dce78a 100644 --- a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt +++ b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.konan.target.Distribution import org.jetbrains.kotlin.platform.konan.NativePlatforms import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.sir.SirModule +import org.jetbrains.kotlin.sir.builder.SirImportBuilder import org.jetbrains.kotlin.sir.builder.buildImport import org.jetbrains.kotlin.sir.builder.buildModule import org.jetbrains.kotlin.swiftexport.standalone.SwiftExportInput @@ -68,6 +69,9 @@ internal fun buildSwiftModule( declarations += buildImport { moduleName = bridgeModuleName } + declarations += buildImport { + moduleName = KOTLIN_RUNTIME_MODULE_NAME + } ktFiles.forEach { file -> declarations += buildSirDeclarationList(file) } @@ -75,4 +79,6 @@ internal fun buildSwiftModule( declarations.forEach { it.parent = this } } } -} \ No newline at end of file +} + +private const val KOTLIN_RUNTIME_MODULE_NAME: String = "KotlinRuntime" diff --git a/native/swift/swift-export-standalone/testData/documentation/golden_result/result.swift b/native/swift/swift-export-standalone/testData/documentation/golden_result/result.swift index 27f6a5a6148..54f93833d64 100644 --- a/native/swift/swift-export-standalone/testData/documentation/golden_result/result.swift +++ b/native/swift/swift-export-standalone/testData/documentation/golden_result/result.swift @@ -1,4 +1,5 @@ import KotlinBridges +import KotlinRuntime /** * Function foo description diff --git a/native/swift/swift-export-standalone/testData/functions/golden_result/result.swift b/native/swift/swift-export-standalone/testData/functions/golden_result/result.swift index ebd1b4a2f5b..8f73ac73769 100644 --- a/native/swift/swift-export-standalone/testData/functions/golden_result/result.swift +++ b/native/swift/swift-export-standalone/testData/functions/golden_result/result.swift @@ -1,4 +1,5 @@ import KotlinBridges +import KotlinRuntime public enum namespace1 { public enum local_functions { diff --git a/native/swift/swift-export-standalone/testData/no_package/golden_result/result.swift b/native/swift/swift-export-standalone/testData/no_package/golden_result/result.swift index 73bbe9a739c..d0ecaaf0f75 100644 --- a/native/swift/swift-export-standalone/testData/no_package/golden_result/result.swift +++ b/native/swift/swift-export-standalone/testData/no_package/golden_result/result.swift @@ -1,4 +1,5 @@ import KotlinBridges +import KotlinRuntime public func meaningOfLife() -> Swift.Int32 { return __root___meaningOfLife() diff --git a/native/swift/swift-export-standalone/testData/variables/golden_result/result.swift b/native/swift/swift-export-standalone/testData/variables/golden_result/result.swift index 3029dec61cd..634c7287e87 100644 --- a/native/swift/swift-export-standalone/testData/variables/golden_result/result.swift +++ b/native/swift/swift-export-standalone/testData/variables/golden_result/result.swift @@ -1,4 +1,5 @@ import KotlinBridges +import KotlinRuntime public enum namespace { public enum main { diff --git a/native/utils/src/org/jetbrains/kotlin/konan/target/Distribution.kt b/native/utils/src/org/jetbrains/kotlin/konan/target/Distribution.kt index 48978107127..bac674b1b73 100644 --- a/native/utils/src/org/jetbrains/kotlin/konan/target/Distribution.kt +++ b/native/utils/src/org/jetbrains/kotlin/konan/target/Distribution.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.konan.properties.Properties import org.jetbrains.kotlin.konan.properties.keepOnlyDefaultProfiles import org.jetbrains.kotlin.konan.properties.loadProperties import org.jetbrains.kotlin.konan.util.DependencyDirectories +import java.nio.file.Path class Distribution private constructor(private val serialized: Serialized) : java.io.Serializable { constructor( @@ -88,6 +89,9 @@ class Distribution private constructor(private val serialized: Serialized) : jav val stdlib = "$klib/common/stdlib" val stdlibDefaultComponent = "$stdlib/default" + val kotlinRuntimeForSwiftHome = "$konanHome/konan/swift_export/kotlin_runtime" + val kotlinRuntimeForSwiftModuleMap = "$kotlinRuntimeForSwiftHome/module.modulemap" + fun defaultNatives(target: KonanTarget) = "$konanHome/konan/targets/${target.visibleName}/native" fun runtime(target: KonanTarget) = runtimeFileOverride ?: "${defaultNatives(target)}/runtime.bc"