ライブラリ モジュール

Rust ライブラリ モジュールには 2 種類あります。1 つは Rust ライブラリを生成し、もう 1 つは C 互換ライブラリを生成します。また、ビルドシステムでは、Rust 手続き型マクロ(proc-macros)を特殊なタイプのライブラリと見なすこともできます。

rust_library

rust_library モジュールは、他の Rust モジュールで使用する Rust ライブラリを生成します。

_host バリアントに加えて、Rust ライブラリには、利用可能なリンクを制御するモジュール タイプがあります。

Rust ライブラリ モジュール タイプ 定義
rust_library rlibdylib の両方のライブラリ バリアントを提供します。AOSP では、Rust ライブラリに対してこのモジュール タイプをおすすめします。rustlibs プロパティの依存関係としてリストされている場合、モジュールが正しく動作するためです。
rust_library_rlib Rust ライブラリの rlib バリアントのみを提供します。rlib バリアントのみを提供するモジュールは、rustlibs プロパティでの動作が保証されません。
rust_library_dylib Rust ライブラリの dylib バリアントのみを提供します。dylib バリアントのみを提供するモジュールは、rustlibs プロパティでの動作が保証されません。

rust_ffi

rust_ffi モジュールは、CC モジュールと相互運用するための C 互換ライブラリを生成します。

Rust FFI ライブラリには、_host バリアント以外に、以下の表に示すように利用可能なリンクを制御するモジュール タイプがあります。

Rust FFI ライブラリ モジュール タイプ 定義
rust_ffi C ライブラリ バリアントには、static と shared の両方があります。
rust_ffi_shared C 共有ライブラリ バリアントのみを提供します。
rust_ffi_static C 静的ライブラリ バリアントのみを提供します。

rust_ffi を使用して C から Rust を呼び出す基本的な例については、Android Rust パターンのページをご覧ください。

より高度な使用方法については、Rust の公式ドキュメントをご覧ください。

rust_proc_macro

Rust の手続き型マクロ(proc-macro)は、コンパイラを拡張してソースコード変換を実行するか、新しい属性を指定する場合に役立ちます。詳細については、Rust の公式ドキュメントにある手続き型マクロのページをご覧ください。

ビルドシステムにおいては、rust_proc_macro モジュールの動作は rust_library モジュールの場合と同様です。rust_proc_macros に依存するモジュールの場合は、proc_macros プロパティにモジュール名を追加します。

proc_macros はコンパイラ プラグインであるため、必然的にホストをターゲットとし、デバイスで実行されるコードは生成しません。

Rust ライブラリの重要なプロパティ

以下の表で定義されているプロパティは、すべてのモジュールに適用される重要な共通プロパティに加えて適用されます。これらは、Rust ライブラリ モジュールにとって特に重要なものか、rust_library モジュール タイプに固有の動作を示すものです。

Rust ライブラリのプロパティ 定義
stem / name stem プロパティは、出力ライブラリのファイル名を制御します。それ以外の場合はデフォルトで name になります。

Rust コンパイラはライブラリ ファイル名に特定の要件を課しているため、ビルドシステムはコンパイル時の問題を回避するためにこれらの要件を適用します。 出力ファイル名は、lib<crate_name><suffix> の形式に従っている必要があります (ここでは crate_name プロパティに依存しています)。

crate_name ライブラリ生成モジュールには必須のプロパティであり、出力ファイル名と関係があります(stem の定義をご覧ください)。
include_dirs rust_ffi モジュールの場合、このプロパティは相対インクルード パス(依存する cc モジュールが使用できるヘッダーを含むパス)を表す文字列のリストを定義します。

rust_library または rust_ffi のリンク

デフォルトでは、デバイスをターゲットとする Rust ライブラリ モジュールは常に libstd に対して動的にリンクされます。ただし、ホスト モジュールは常に libstd に対して静的にリンクされます。

rustlibs の依存関係に使用されるリンクは、ルート モジュールのリンク設定によって異なります(たとえば、prefer_rlib: true を持つ rust_binary は、rustlibsrlibs としてリンクする Rust ライブラリ バリアントを使用します)。

動的な Rust ライブラリに依存しないルート依存関係モジュール(静的実行可能ファイルなど)を生成できるように、rlibs には動的と静的の両方の libstd リンク バリアントが用意されています。適切なバリアントは、Soong によって自動的にリンクされます。