Библиотеки Kotlin/Native
Особенности компилятора Kotlin
Для создания библиотеки с помощью компилятора Kotlin/Native используйте флаг -produce library или -p library. Например:
$ kotlinc-native foo.kt -p library -o bar
Эта команда создаст bar.klib с откомпилированным содержимым foo.kt.
Для ссылки на библиотеку используйте флаг -library <name> или -l <name>. Например:
$ kotlinc-native qux.kt -l bar
Эта команда создаст program.kexe из qux.kt и bar.klib
Особенности инструмента cinterop
Инструмент cinterop генерирует .klib обёртки для нативных библиотек в качестве основного результата. Например, используя простой libgit2.def файл определения нативной библиотеки, предоставленный в вашей дистрибуции Kotlin/Native
$ cinterop -def samples/gitchurn/src/nativeInterop/cinterop/libgit2.def -compiler-option -I/usr/local/include -o libgit2
мы получим libgit2.klib.
См. больше деталей в C Interop.
Утилита klib
Утилита управления библиотеками klib позволяет просматривать и устанавливать библиотеки.
Доступны следующие команды:
-
content– просмотреть содержимое библиотеки:$ klib contents <name>
-
info– просмотреть метаданные библиотеки$ klib info <name>
-
install– установить библиотеку в стандартное местоположение$ klib install <name>
-
remove– удалить библиотеку из стандартного репозитория$ klib remove <name>
Все вышеперечисленные команды принимают дополнительный -repository <directory> аргумент для указания репозитория, отличного от стандартного.
$ klib <command> <name> -repository <directory>
Несколько примеров
Сначала создадим библиотеку. Поместите исходный код небольшой библиотеки в kotlinizer.kt:
package kotlinizer
val String.kotlinized
get() = "Kotlin $this"
$ kotlinc-native kotlinizer.kt -p library -o kotlinizer
Библиотека создана в текущем каталоге:
$ ls kotlinizer.klib kotlinizer.klib
Теперь давайте посмотрим содержимое библиотеки:
$ klib contents kotlinizer
Вы можете установить kotlinizer в стандартный репозиторий:
$ klib install kotlinizer
Удалите все следы из текущего каталога:
$ rm kotlinizer.klib
Создайте очень короткую программу и поместите её в use.kt:
import kotlinizer.*
fun main(args: Array<String>) {
println("Hello, ${"world".kotlinized}!")
}
Теперь скомпилируйте программу, связанную с библиотекой, которую вы только что создали:
$ kotlinc-native use.kt -l kotlinizer -o kohello
И запустите программу:
$ ./kohello.kexe Hello, Kotlin world!
Приятного пользования!
Расширенные темы
Порядок поиска библиотек
При использовании флага -library foo, компилятор ищет библиотеку foo в следующем порядке:
Текущий каталог компиляции или абсолютный путь.
Все репозитории, указанные флагом
-repo.Библиотеки, установленные в стандартном репозитории (на данный момент стандартным является
~/.konan, но это можно изменить, задав переменную окружения KONAN_DATA_DIR).Библиотеки, установленные в каталоге
$installation/klib.
Формат библиотеки
Библиотеки Kotlin/Native представляют собой zip-архивы, содержащие предопределённую структуру каталогов с таким расположением:
foo.klib при распаковке как foo/ даёт:
- foo/
- $component_name/
- ir/
- Serialized Kotlin IR.
- targets/
- $platform/
- kotlin/
- Kotlin compiled to LLVM bitcode.
- native/
- Bitcode files of additional native objects.
- $another_platform/
- There can be several platform specific kotlin and native pairs.
- linkdata/
- A set of ProtoBuf files with serialized linkage metadata.
- resources/
- General resources such as images. (Not used yet).
- manifest - A file in the java property format describing the library.
Пример структуры можно найти в каталоге klib/stdlib вашей установки.
Использование относительных путей в klibs
Сериализованное представление IR исходных файлов является частью библиотеки klib. Оно включает пути к файлам для генерации правильной отладочной информации. По умолчанию сохранённые пути являются абсолютными. С помощью опции компилятора -Xklib-relative-path-base, вы можете изменить формат и использовать только относительные пути в артефакте. Для этого передайте один или несколько базовых путей исходных файлов в качестве аргумента:
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class).configureEach {
// $base is a base path of source files
kotlinOptions.freeCompilerArgs += "-Xklib-relative-path-base=$base"
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
kotlinOptions {
// $base is a base path of source files
freeCompilerArgs += "-Xklib-relative-path-base=$base"
}
}
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/native-libraries.html