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
– ライブラリの内容をリスト表示します。bash$ klib contents <name>
info
– ライブラリの管理情報を検査します。bash$ klib info <name>
install
– ライブラリをデフォルトの場所にインストールします。bash$ klib install <name>
remove
– ライブラリをデフォルトのリポジトリから削除します。bash$ 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/
- シリアライズされた Kotlin IR。
- targets/
- $platform/
- kotlin/
- LLVM ビットコードにコンパイルされた Kotlin。
- native/
- 追加のネイティブオブジェクトのビットコードファイル。
- $another_platform/
- 複数のプラットフォーム固有の Kotlin とネイティブのペアが存在する場合があります。
- linkdata/
- シリアライズされたリンケージメタデータを含む ProtoBuf ファイルのセット。
- resources/
- 画像などの一般的なリソース。(まだ使用されていません)。
- manifest - ライブラリを記述する Java プロパティ形式のファイル。
インストールディレクトリの klib/stdlib
にレイアウトの例があります。
klib での相対パスの使用
klib での相対パスの使用は Kotlin 1.6.20 以降で利用可能です。
ソースファイルのシリアライズされた IR 表現は、klib
ライブラリの 一部 です。これには、適切なデバッグ情報を生成するためのファイルのパスが含まれます。デフォルトでは、保存されるパスは絶対パスです。 -Xklib-relative-path-base
コンパイラオプションを使用すると、フォーマットを変更し、アーティファクト内で相対パスのみを使用できます。これを機能させるには、ソースファイルの1つまたは複数のベースパスを引数として渡します。
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...
tasks.named<KotlinCompilationTask<*>>("compileKotlin").configure {
// $base はソースファイルのベースパスです
compilerOptions.freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...
tasks.named('compileKotlin', KotlinCompilationTask) {
compilerOptions {
// $base はソースファイルのベースパスです
freeCompilerArgs.add("-Xklib-relative-path-base=$base")
}
}