Android Rust モジュール

原則として、rust_* モジュールの定義は、cc_* の使用方法と想定に忠実に従います。Rust バイナリのモジュール定義の例を次に示します。

rust_binary {
    name: "hello_rust",
    crate_name: "hello_rust",
    srcs: ["src/hello_rust.rs"],
    host_supported: true,
}

このページでは、rust_* モジュールの最も一般的なプロパティについて説明します。特定のモジュール タイプとモジュール定義の例については、バイナリ モジュールライブラリ モジュールテスト モジュールのページをご覧ください。

基本的なモジュール タイプ

定義詳細情報
rust_binaryRust バイナリ バイナリ モジュールのページ
rust_libraryRust ライブラリを生成し、rlibdylib の両方のバリアントを提供します。 rust_library ライブラリ モジュール ページ
rust_fficc モジュールで使用できる Rust C ライブラリを生成し、静的バリアントと共有バリアントの両方を提供します。 rust_ffi、ライブラリ モジュール ページ
rust_proc_macroproc-macro Rust ライブラリを生成します(コンパイラ プラグインに似ています)。 rust_proc_macro、ライブラリ モジュール ページ
rust_test標準の Rust テストハーネスを使用する Rust テストバイナリを生成します。 テスト モジュール ページ
rust_fuzzlibfuzzer を利用して、Rust ファズバイナリを生成します。 rust_fuzz モジュールの例
rust_protobufソースを生成し、特定の protobuf 用のインターフェースを提供する Rust ライブラリを生成します。 Protobufs モジュールソース生成ツールのページ
rust_bindgenソースを生成し、C ライブラリへの Rust バインディングを含む Rust ライブラリを生成します。 Bindgen バインディング モジュールソース生成ツールのページ

重要な共通プロパティ

以下のプロパティは、すべての Android Rust モジュールに共通です。個別の Rust モジュールに関連付けられているその他の一意のプロパティは、該当モジュールのページに記載されています。

name

name はモジュールの名前です。他の Soong モジュールと同様に、ほとんどの Android.bp モジュール タイプで一意である必要があります。デフォルトでは、name が出力ファイル名として使用されます。出力ファイル名をモジュール名と異なる名前にする必要がある場合は、stem プロパティを使用して定義します。

stem

stem(省略可)は出力ファイル名(ファイル拡張子やその他の接尾辞を除く)を直接制御できます。たとえば、stem 値が libfoorust_library_rlib ライブラリは libfoo.rlib ファイルを生成します。stem プロパティの値を指定しない場合、デフォルトでは出力ファイル名にモジュール名が使用されます。

モジュール名を目的の出力ファイル名に設定できない場合は、stem 関数を使用します。たとえば、log クレートの rust_libraryliblog_rust という名前になります。これは liblog cc_library がすでに存在しているためです。この場合、stem プロパティを使用することで、出力ファイルの名前が liblog_rust.* ではなく liblog.* になります。

srcs

srcs には、モジュールへのエントリ ポイント(通常は main.rs または lib.rs)を表す単一のソースファイルが含まれています。rustc は、コンパイルに必要な他のすべてのソースファイルの解決と検出を処理します。これらは生成される deps ファイルに列挙されます。

可能であれば、この使用法はプラットフォーム コードでは避けてください。詳細については、ソース生成ツールをご覧ください。

crate_name

crate_name は、rustc --crate_name フラグを使用してクレート名のメタデータを設定します。ライブラリを生成するモジュールの場合、これはソースで使用されると予想されるクレート名と一致する必要があります。たとえば、モジュール libfoo_bar がソース内で extern crate foo_bar として参照されている場合、これは crate_name: "foo_bar" である必要があります

このプロパティはすべての rust_* モジュールに共通ですが、Rust ライブラリを生成するモジュール(rust_libraryrust_ffirust_bindgenrust_protobufrust_proc_macro など)には必須です。これらのモジュールにより、crate_name と出力ファイル名の関係に rustc の要件が適用されます。詳細については、ライブラリ モジュール セクションをご覧ください。

lints

rustc リンターは、ソース生成ツール以外のすべてのモジュール タイプに対してデフォルトで実行されます。一部の lint セットは、モジュール ソースを検証するために定義および使用されます。このような lint セットの有効な値は次のとおりです。

  • default(モジュールの場所に応じたデフォルトの lint セット)
  • android(すべての Android プラットフォーム コードに適用される最も厳密な lint セット)
  • vendor(ベンダーコードに適用されるあまり厳密でない lint セット)
  • none(すべての lint の警告とエラーを無視する)

clippy_lints

clippy linter は、ソース生成ツール以外のすべてのモジュール タイプに対してデフォルトで実行されます。モジュールのソースの検証に使用する lint セットもいくつか定義されています。有効な値は次のとおりです。

  • default(モジュールの場所に応じたデフォルトの lint セット)
  • android(すべての Android プラットフォーム コードに適用される最も厳密な lint セット)
  • vendor(ベンダーコードに適用されるあまり厳密でない lint セット)
  • none(すべての lint の警告とエラーを無視する)

edition

edition は、このコードのコンパイルに使用する Rust エディションを定義します。C および C++ の std バージョンに似ています。有効な値は 20152018(デフォルト)です。

flags

flags には、コンパイル時に rustc に渡すフラグの文字列リストが含まれます。

ld_flags

ld-flags には、ソースのコンパイル時にリンカーに渡すフラグの文字列リストが含まれます。これらは -C linker-args rustc フラグによって渡されます。clang はリンカーのフロントエンドとして使用され、実際のリンクでは lld を呼び出します。

features

features は、コンパイル時に有効にする必要がある機能の文字列リストです。 これは --cfg 'feature="foo"' によって rustc に渡されます。ほとんどの機能は追加型であるため、多くの場合、依存するすべてのモジュールに必要な機能セット一式で構成されます。ただし、機能同士が排他的である場合は、競合する機能を提供するビルドファイル内で追加のモジュールを定義します。

cfgs

cfgs には、コンパイル時に有効にする cfg フラグの文字列リストが含まれます。 これは --cfg foo--cfg "fizz=buzz" によって rustc に渡されます。

ビルドシステムは、次のような特定の状況に応じて、特定の cfg フラグを自動的に設定します。

  • dylib としてビルドされたモジュールには、android_dylib cfg が設定されます。

  • VNDK を使用するモジュールには、android_vndk cfg が設定されます。これは、C++ の __ANDROID_VNDK__ 定義に似ています。

strip

strip は、出力ファイルを削除するかどうか、また削除する方法を制御します(該当する場合)。 未設定の場合、デバイス モジュールはデフォルトで mini debuginfo 以外のすべてを削除します。 ホスト モジュールは、デフォルトではシンボルを削除しません。有効な値は、削除を無効にする none と、mini debuginfo を含むすべてを削除する all です。その他の値については、Soong モジュールのリファレンスをご覧ください。

host_supported

デバイス モジュールの場合、host_supported パラメータは、モジュールがホスト バリアントも提供する必要があるかどうかを示します。

ライブラリ依存関係の定義

Rust モジュールは、以下のプロパティにより CC と Rust の両方のライブラリに依存できます。

プロパティ名 説明
rustlibs 依存関係でもある rust_library モジュールのリスト。ビルドシステムは、優先リンクを選択できるため、依存関係の宣言におすすめの方法として使用できます(後述の Rust ライブラリとリンクする場合をご覧ください)。
rlibs rlibs として静的にリンクされる rust_library モジュールのリスト(注意して使用してください。後述の Rust ライブラリとリンクする場合をご確認ください)。
shared_libs 共有ライブラリとして動的にリンクする必要がある cc_library モジュールのリスト。
static_libs 静的ライブラリとして静的にリンクする必要がある cc_library モジュールのリスト。
whole_static_libs 静的ライブラリとして静的にリンクされ、生成されるライブラリ全体に含まれる必要がある cc_library モジュールのリスト。rust_ffi_static バリアントでは、生成される静的ライブラリ アーカイブに whole_static_libraries が含まれます。rust_library_rlib バリアントの場合、whole_static_libraries ライブラリが生成される rlib ライブラリにバンドルされます。

Rust ライブラリにリンクする場合は、特別な理由がない限り、rlibsdylibs ではなく rustlibs プロパティを使用することをおすすめします。これにより、ルート モジュールの要件に基づいてビルドシステムで正しいリンクを選択でき、ライブラリの rlib バージョンと dylib バージョンの両方が依存関係ツリーに含まれる(コンパイルが失敗する原因になります)可能性が低くなります。

サポート対象外のビルド機能とサポートが制限されているビルド機能

Soong の Rust では、vendorvendor_ramdisk のイメージとスナップショットに対するサポートが制限されています。ただし、staticlibscdylibsrlibsbinaries はサポートされています。ベンダー イメージのビルド ターゲットの場合、android_vndk cfg プロパティが設定されます。システムとベンダー ターゲットの間に差異がある場合は、これをコードで使用できます。rust_proc_macros は、ベンダー スナップショットの一部としてキャプチャされません。これらが依存している場合は、適切なバージョン管理を行ってください。

プロダクト イメージ、VNDK イメージ、リカバリ イメージはサポートされていません。

増分ビルド

デベロッパーは、SOONG_RUSTC_INCREMENTAL 環境変数を true に設定することで、Rust ソースの増分コンパイルを有効にできます。

警告: buildbot によって生成されるバイナリと同一のバイナリが生成される保証はありません。オブジェクト ファイルに格納された関数またはデータのアドレスは異なる可能性があります。生成されるアーティファクトが EngProd インフラストラクチャでビルドされたアーティファクトと 100% 同じにするには、この値を設定しないでください。