ライブラリモジュール

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

rust_library

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

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

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

rust_ffi

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

_hostバリアントに加えて、Rust FFIライブラリには、次の表に示すように、使用可能なリンケージを制御するモジュールタイプがあります。

RustFFIライブラリモジュールタイプ意味
rust_ffi静的と共有の両方のCライブラリバリアントを提供します。
rust_ffi_shared C共有ライブラリバリアントのみを提供します。
rust_ffi_static C静的ライブラリバリアントのみを提供します。

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

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

rust_proc_macro

Rust手続き型マクロ(proc-macros)は、コンパイラを拡張してソースコード変換を実行したり、新しい属性を提供したりする場合に役立ちます。これらの詳細については、Rustの公式ドキュメントのProceduralMacrosページを参照してください。

ビルドシステムの目的上、 rust_proc_macroモジュールはrust_libraryモジュールと同様に機能します。 rust_proc_macrosに依存するモジュールの場合、モジュール名をproc_macrosプロパティに追加します。

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

注目すべきRustライブラリのプロパティ

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

ラストライブラリのプロパティ意味
茎/名前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の依存関係に使用されるリンケージは、ルートモジュールのリンケージ設定によって異なります。 (たとえば、 rust_binaryを持つprefer_rlibsは、 rlibsrustlibsとしてリンクするRustライブラリバリアントを使用します。)

動的なrustライブラリ(静的実行可能ファイルなど)に依存しないルート依存関係モジュールの作成を可能にするために、 rlibsは動的および静的の両方のlibstdリンケージバリアントを提供します。正しいバリアントはSoongによって自動的にリンクされます。