Kotlin/Native ライブラリ
Kotlinコンパイラー固有の仕様
Kotlin/Nativeコンパイラーでライブラリーを作成するには、-produce library
または-p library
フラグを使用します。例:
$ kotlinc-native foo.kt -p library -o bar
このコマンドは、foo.kt
のコンパイルされた内容を含むbar.klib
を生成します。
ライブラリーにリンクするには、-library <name>
または-l <name>
フラグを使用します。例:
$ kotlinc-native qux.kt -l bar
このコマンドは、qux.kt
とbar.klib
からprogram.kexe
を生成します。
cinteropツールの固有の仕様
cinteropツールは、ネイティブライブラリー用の.klib
ラッパーを主な出力として生成します。
たとえば、Kotlin/Nativeディストリビューションで提供されている単純なlibgit2.def
ネイティブライブラリー定義ファイルを使用します。
$ 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
です。kotlin.data.dir
Gradleプロパティーを設定することで変更できます。または、
-Xkonan-data-dir
コンパイラーオプションを使用して、cinterop
およびkonanc
ツールを介してディレクトリーへのカスタムパスを構成できます。 -
$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
ディレクトリーにあります。
klibでの相対パスの使用
klibでの相対パスの使用は、Kotlin 1.6.20以降で使用できます。
ソースファイルのシリアライズされたIR表現は、klib
ライブラリーの一部です。これには、適切なデバッグ情報を生成するためのファイルのパスが含まれます。デフォルトでは、保存されているパスは絶対パスです。-Xklib-relative-path-base
コンパイラーオプションを使用すると、形式を変更して、アーティファクトで相対パスのみを使用できます。機能させるには、ソースファイルの1つまたは複数のベースパスを引数として渡します。
- Kotlin
- Groovy
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...
tasks.named<KotlinCompilationTask<*>>("compileKotlin").configure {
// $base is a base path of source files
compilerOptions.freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...
tasks.named('compileKotlin', KotlinCompilationTask) {
compilerOptions {
// $base is a base path of source files
freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
}