一般的な原則として、 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%同一であることを確認するには、この値を未設定のままにします。