一般的な原則として、 rust_*モジュールの定義はcc_*の使用法と期待に厳密に準拠しています。以下は、Rustバイナリのモジュール定義の例です。
rust_binary {
name: "hello_rust",
crate_name: "hello_rust",
srcs: ["src/hello_rust.rs"],
host_supported: true,
}
このページでは、 rust_*モジュールの最も一般的なプロパティについて説明します。特定のモジュールタイプとサンプルモジュール定義の詳細については、「バイナリモジュール」、「ライブラリモジュール」、または「テストモジュール」のページを参照してください。
基本的なモジュールタイプ
| タイプ | 意味 | 詳細については |
|---|---|---|
rust_binary | Rustバイナリ | バイナリモジュールページ |
rust_library | Rustライブラリを生成し、 rlibとdylibの両方のバリアントを提供します。 | rust_library 、ライブラリモジュールページ。 |
rust_ffi | ccモジュールで使用できるRustCライブラリを生成し、静的バリアントと共有バリアントの両方を提供します。 | rust_ffi 、ライブラリモジュールページ |
rust_proc_macro | proc-macro macroRustライブラリを生成します。 (これらはコンパイラプラグインに類似しています。) | rust_proc_macro 、ライブラリモジュールページ |
rust_test | 標準のRustテストハーネスを使用するRustテストバイナリを生成します。 | テストモジュールページ |
rust_fuzz | libfuzzerを利用してRustファズバイナリを生成します。 | rust_fuzzモジュールの例 |
rust_protobuf | ソースを生成し、特定のprotobufのインターフェイスを提供するRustライブラリを生成します。 | Protobufsモジュールとソースジェネレータのページ |
rust_bindgen | ソースを生成し、CライブラリへのRustバインディングを含むRustライブラリを生成します。 | Bindgenバインディングモジュールとソースジェネレータのページ |
重要な共通のプロパティ
これらのプロパティは、すべてのAndroidRustモジュールに共通です。個々のRustモジュールに関連付けられている追加の(一意の)プロパティは、そのモジュールのページに一覧表示されます。
名前
nameはモジュールの名前です。他のSoongモジュールと同様に、これはほとんどのAndroid.bpモジュールタイプで一意である必要があります。デフォルトでは、 nameが出力ファイル名として使用されます。出力ファイル名がモジュール名と異なる必要がある場合は、 stemプロパティを使用して定義します。
幹
stem (オプション)は、出力ファイル名(ファイル拡張子およびその他のサフィックスを除く)を直接制御します。たとえば、ステム値がlibfooのrust_library_rlibライブラリは、 libfoo.rlibファイルを生成します。 stemプロパティに値を指定しない場合、出力ファイル名はデフォルトでモジュール名を採用します。
モジュール名を目的の出力ファイル名に設定できない場合は、 stem関数を使用してください。たとえば、 logクレートのrust_libraryは、 liblog cc_libraryがすでに存在するため、 liblog_rustという名前になります。この場合にstemプロパティを使用すると、出力ファイルの名前がliblog.*ではなくliblog_rust.*になります。
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_library 、 rust_ffi 、 rust_bindgen 、 rust_protobuf 、 rust_proc_macroなど)に必要です。これらのモジュールは、 crate_nameと出力ファイル名の関係にrustc要件を適用します。詳細については、「ライブラリモジュール」セクションを参照してください。
lints
rustc linterは、ソースジェネレータを除くすべてのモジュールタイプでデフォルトで実行されます。一部のlintセットは、モジュールソースを検証するために定義および使用されます。このようなlintセットの可能な値は次のとおりです。
-
default(モジュールの場所に応じたデフォルトのlintセット) -
android(すべてのAndroidプラットフォームコードに適用される最も厳密なlintセットの場合) -
vendor(ベンダーコードに適用されるリラックスした一連のlintの場合) -
none(すべてのlint警告とエラーを無視するため)
clippy_lints
クリッピーリンターは、ソースジェネレーターを除くすべてのモジュールタイプでデフォルトで実行されます。モジュールソースを検証するために使用されるいくつかのlintのセットが定義されています。これらはいくつかの可能な値です:
-
default(モジュールの場所に応じたデフォルトのlintセット) -
android(すべてのAndroidプラットフォームコードに適用される最も厳密なlintセットの場合) -
vendor(ベンダーコードに適用されるリラックスした一連のlintの場合) -
none(すべてのlint警告とエラーを無視するため)
版
editionは、このコードのコンパイルに使用するRustエディションを定義します。これは、CおよびC ++の標準バージョンに似ています。有効な値は2015と2018 (デフォルト)です。
フラグ
flagsには、コンパイル中にrustcに渡すフラグの文字列リストが含まれています。
ld_flags
ld-flagsには、ソースをコンパイルするときにリンカに渡すフラグの文字列リストが含まれています。これらは、 -C linker-args -argsrustcフラグによって渡されます。 clangはリンカーのフロントエンドとして使用され、実際のリンクに対してlldを呼び出します。
特徴
featuresは、コンパイル中に有効にする必要がある機能の文字列リストです。これは--cfg'feature --cfg 'feature="foo"'に渡されます。ほとんどの機能は付加的であるため、多くの場合、これはすべての依存モジュールに必要なすべての機能セットで構成されます。ただし、機能が互いに排他的である場合は、競合する機能を提供するビルドファイルに追加のモジュールを定義します。
cfgs
cfgsには、コンパイル中に有効になるcfgフラグの文字列リストが含まれています。これは、 --cfg fooおよび--cfg "fizz=buzz"によってrustcに渡されます。
ビルドシステムは、以下に示す特定の状況で特定のcfgフラグを自動的に設定します。
- dylibとしてビルドされたモジュールには、
android_dylibが設定されます。 - VNDKを使用するモジュールには、
android_vndkが設定されます。これは、C ++の__ANDROID_VNDK__定義に似ています。
ストリップ
stripは、出力ファイルを削除するかどうか、および削除する方法を制御します(該当する場合)。これが設定されていない場合、デバイスモジュールはデフォルトでミニdebuginfoを除くすべてを削除します。デフォルトでは、ホストモジュールはシンボルを削除しません。有効な値には、ストリッピングを無効にするnoneと、ミニdebuginfoを含むallをストリッピングするallが含まれます。追加の値は、 Soong ModulesReferenceにあります。
host_supported
デバイスモジュールの場合、 host_supportedパラメーターは、モジュールがホストバリアントも提供する必要があるかどうかを示します。
ライブラリの依存関係の定義
Rustモジュールは、次のプロパティを介してCCライブラリとRustライブラリの両方に依存できます。
| プロパティ名 | 説明 |
|---|---|
rustlibs | 依存関係でもあるrust_libraryモジュールのリスト。ビルドシステムが優先リンケージを選択できるようにするため、これを依存関係を宣言するための推奨方法として使用してください。 (以下のRustライブラリに対してリンクする場合を参照してください) |
rlibs | rlibsとして静的にリンクする必要があるrust_libraryモジュールのリスト。 (注意して使用してください。以下のRustライブラリに対してリンクする場合を参照してください。) |
dylibs | dylibsとして動的にリンクされる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ライブラリに対してリンクする場合、ベストプラクティスとして、特別な理由がない限り、 rlibsまたはdylibsではなくrustlibsプロパティを使用してリンクします。これにより、ビルドシステムは、ルートモジュールに必要なものに基づいて正しいリンケージを選択でき、依存関係ツリーにライブラリのrlibバージョンとdylibバージョンの両方が含まれる可能性がrlibなります(コンパイルが失敗します)。
サポートされていない限定されたサポートビルド機能
Soong's Rustは、 vendorおよびvendor_ramdiskイメージとスナップショットの限定的なサポートを提供します。ただし、 staticlibs 、 cdylibs 、 rlibs 、およびbinariesはサポートされています。ベンダーイメージビルドターゲットの場合、 android_vndk cfgが設定されます。システムターゲットとベンダーターゲットに違いがある場合は、コードでこれを使用できます。 rust_proc_macrosは、ベンダーのスナップショットの一部としてキャプチャされません。これらが依存している場合は、それらを適切にバージョン管理していることを確認してください。
製品、VNDK、およびリカバリイメージはサポートされていません。
インクリメンタルビルド
開発者は、 SOONG_RUSTC_INCREMENTAL環境変数をtrueに設定することで、Rustソースのインクリメンタルコンパイルを有効にできます。
警告:これは、ビルドボットによって生成されたものと同一のバイナリを生成することを保証するものではありません。オブジェクトファイルに含まれる関数またはデータのアドレスは異なる場合があります。生成されたアーティファクトがEngProdインフラストラクチャによって構築されたものと100%同一であることを確認するには、この値を未設定のままにします。