Files
kotlin-fork/kotlin-native
Dmitriy Dolovov 7382b31fdc [PL] Native: Remove harmful private visibility guard in deserialization of LazyIr
Kotlin/Native codegen needs to deserialize all fields throughout the class hierarchy to build the proper binary class layout. That becomes impossible with the guard condition that prevents loading private top-level classes from another module in LazyIR (see https://github.com/JetBrains/kotlin/blob/2a4d8800374578c1aa9ec9c996b393a98f5a6e3b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt#L701). The guard suits well for the partial linkage needs, but it causes the codegen to fail with `Unbound public symbol IrClassPublicSymbolImpl: [ File '/file/in/the/library.kt' <- private.top.level/ClassDeclaration|null[0] ]` error.

To prevent this the guard is removed. This does not influence the partial linkage in general except for the different error message being generated: `Function 'foo' can not be called: Private function declared in module <A> can not be accessed in module <B>` instead of `Function 'foo' can not be called: No function found for symbol '<symbol>'`.

#KT-54469
2023-03-27 15:50:13 +02:00
..
2023-02-01 15:13:34 +01:00
2022-10-04 16:26:45 +00:00

Kotlin/Native

Kotlin/Native is an LLVM backend for the Kotlin compiler, runtime implementation, and native code generation facility using the LLVM toolchain.

Kotlin/Native is primarily designed to allow compilation for platforms where virtual machines are not desirable or possible (such as iOS or embedded targets), or where a developer is willing to produce a reasonably-sized self-contained program without the need to ship an additional execution runtime.

Using published Kotlin/Native versions

The most complete experience with Kotlin/Native can be achieved by using Gradle, IntelliJ IDEA or Android Studio with KMM plugin if you target iOS.

If you are interested in using Kotlin/Native for iOS, then Kotlin Multiplatform Mobile portal might be useful for you.

Command line compiler is also available.

More information can be found in the overviews of Kotlin/Native and Kotlin Multiplatform.

On macOS Kotlin/Native requires Xcode 12.5 or newer.

Contributing

You can contribute to Kotlin/Native in many ways. See the relevant page on the website.

See also the general contribution guidelines for this repository.

Building from source

Prerequisites:

  • configure Kotlin build as specified in main readme
  • at the root directory of the repository, create local.properties file with kotlin.native.enabled=true line
  • macOS: Xcode 14.0 or newer
    • on MacOS aarch64, CInterop functionality is available only using aarch64 JDK builds, e.g. Eclipse Temurin 17.0.5 or Azul Zulu JDK8

      Note: using JDK x86_64 on MacOS aarch64 will cause java.lang.UnsatisfiedLinkError for libclang.dylib

  • Linux: glibc 2.23 or newer
  • Windows:
    • Microsoft C++ build tools for Visual Studio 2019 14.29 or newer
    • Windows SDK 10.0.18362.0 or newer

The commands below should be run from either repository root or this (kotlin-native/) directory. For the latter, :kotlin-native: task name prefix can be omitted.

To compile the basic compiler distribution from sources, run following command:

./gradlew :kotlin-native:dist

It will build compiler and stdlib for host target, without platform libraries.

To get platform libraries, add distPlatformLibs task, e.g.

./gradlew :kotlin-native:dist :kotlin-native:distPlatformLibs

To run the full build:

./gradlew :kotlin-native:bundle

This will produce compiler and libraries for all supported targets. The full build can take about an hour on a Macbook Pro.

After any of the commands above, ./dist will contain Kotlin/Native distribution. You can use it like a distribution of command-line compiler.

Or configure Gradle to use it -- just add the following line to gradle.properties in your Gradle project:

kotlin.native.home=/path/to/kotlin/kotlin-native/dist

To compile your programs with command-line compiler, use:

./dist/bin/kotlinc-native hello.kt -o hello

For an optimized compilation, use -opt:

./dist/bin/kotlinc-native hello.kt -o hello -opt

Interoperability

To import a C or Objective-C library, use ./dist/bin/cinterop tool. See the documentation for more details.

Note: on MacOS aarch64, JDK aarch64 is required

Running tests

For tests, use ./gradlew :native:native.tests:codegenBoxTest and ./gradlew :kotlin-native:backend.native:tests:run.

Note: on MacOS aarch64, for target-specific tests, JDK aarch64 is required

For more details see Testing.

More tips and tricks

More tips and tricks that might be useful when developing or debugging Kotlin/Native can be found in HACKING.md