AndroidRustモジュール

一般的な原則として、 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ライブラリを生成し、 rlibdylibの両方のバリアントを提供します。 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 (オプション)は、出力ファイル名(ファイル拡張子およびその他のサフィックスを除く)を直接制御します。たとえば、ステム値がlibfoorust_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_libraryrust_ffirust_bindgenrust_protobufrust_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 ++の標準バージョンに似ています。有効な値は20152018 (デフォルト)です。

フラグ

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イメージとスナップショットの限定的なサポートを提供します。ただし、 staticlibscdylibsrlibs 、およびbinariesはサポートされています。ベンダーイメージビルドターゲットの場合、 android_vndk cfgが設定されます。システムターゲットとベンダーターゲットに違いがある場合は、コードでこれを使用できます。 rust_proc_macrosは、ベンダーのスナップショットの一部としてキャプチャされません。これらが依存している場合は、それらを適切にバージョン管理していることを確認してください。

製品、VNDK、およびリカバリイメージはサポートされていません。

インクリメンタルビルド

開発者は、 SOONG_RUSTC_INCREMENTAL環境変数をtrueに設定することで、Rustソースのインクリメンタルコンパイルを有効にできます。

警告:これは、ビルドボットによって生成されたものと同一のバイナリを生成することを保証するものではありません。オブジェクトファイルに含まれる関数またはデータのアドレスは異なる場合があります。生成されたアーティファクトがEngProdインフラストラクチャによって構築されたものと100%同一であることを確認するには、この値を未設定のままにします。