原則上,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 使用的 Rust C 程式庫 模組,並提供靜態和共用變化版本。 | rust_ffi ,
程式庫模組頁面 |
rust_proc_macro | 產生 proc-macro Rust 程式庫。
(類似於編譯器外掛程式)。 |
rust_proc_macro ,
程式庫模組頁面 |
rust_test | 產生使用 Rust 測試二進位檔 標準 Rust 測試控管工具。 | 「測試模組」頁面 |
rust_fuzz | 產生 Rust 模糊二進位檔
libfuzzer 。 |
rust_fuzz 模組範例 |
rust_protobuf | 產生來源並產生 Rust 為特定 protobuf 提供介面的程式庫。 | Protobufs 模組和來源產生器頁面 |
rust_bindgen | 產生來源並產生 Rust 程式庫,內含 Rust 繫結至 C 程式庫。 | Bindgen 繫結模組 和「來源產生器」頁面 |
重要常見屬性
這些屬性在所有 Android Rust 中都很常見。 模組。與個別項目相關聯的任何其他 (不重複) 屬性 「Rust」模組會列在該模組的頁面中。
name
name
是模組的名稱。如同其他 Soong 模組,這個名稱不得重複
多數 Android.bp
模組類型。根據預設,系統會使用 name
做為輸出內容
即可。如果輸出檔案名稱必須與模組名稱不同,請使用
stem
屬性加以定義。
Stem
stem
(選用) 可讓您直接控管輸出檔案名稱 (不包括
副檔名和其他後置字串)。例如 rust_library_rlib
stem 值為 libfoo
的程式庫會產生 libfoo.rlib
檔案。如果發生以下情況:
沒有提供 stem
屬性的值,則輸出檔案名稱會採用
預設模組名稱。
如果無法將模組名稱設為所需的輸出內容,請使用 stem
函式
即可。例如,log
Crate 的 rust_library
已命名為
liblog_rust
,
因為liblog cc_library
已存在。在此情況下,使用 stem
屬性可確保輸出內容
檔案名稱為 liblog.*
,而不是 liblog_rust.*
。
srcs
srcs
包含單一來源檔案,代表對叢集的進入點
(通常為 main.rs
或 lib.rs
)。rustc
會處理解析度
以及編譯所需的所有其他來源檔案,而這些
列舉值 (用於產生的 deps
檔案中)。
請盡可能避免將這些用途用於平台程式碼;看 來源產生器 瞭解詳情
Crate_name
crate_name
透過 rustc
--crate_name
設定 Crate 名稱中繼資料
旗標。對於產生程式庫的模組,此設定必須符合
來源中使用的 Crate 名稱。舉例來說,如果參照 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
要求
然後輸出檔案名稱詳情請參閱
程式庫模組
專區。
Lint
rustc Linter 系統預設會對所有模組類型執行,但來源產生器除外。部分 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
會定義要使用的 Rust 版本
編譯這個程式碼這類似於 C 和 C++ 的 std 版本。有效值
是 2015
和 2018
(預設值)。
flag
flags
包含在編譯期間傳遞至 rustc
的標記字串清單。
ld_flags
ld-flags
包含編譯時要傳遞至連結器的標記字串清單
來源。這些方法是由 -C linker-args
rustc 標記傳遞。「clang
」的用途如下
連結器前端,為實際連結叫用 lld
。
功能
features
是編譯期間必須啟用的功能字串清單。
這會由 --cfg 'feature="foo"'
傳遞至 rustc。大多數功能都是添加型功能
因此在許多情況下,這包含了所有相依項目所需的完整功能
模組。不過,如果功能獨佔,
在所有提供衝突功能的建構檔案中定義其他模組。
cfgs
cfgs
包含編譯期間要啟用的 cfg
標記字串清單。
這項資訊會由 --cfg foo
和 --cfg "fizz=buzz"
傳遞至 rustc
。
建構系統會自動設定特定的 cfg
旗標
情況如下:
以 dylib 建構的模組會具有
android_dylib
cfg 集。使用 VNDK 的模組都會有
android_vndk
cfg 集。這是 與__ANDROID_VNDK__
類似 C++ 的定義
長條
strip
會控制是否要移除輸出檔案,以及如何移除檔案 (如適用)。
如果不設定這項政策,裝置模組預設會移除除了迷你偵錯資訊以外的所有項目。
主機模組預設不會移除任何符號。有效值包括 none
停用去除功能,all
則去除所有資訊,包括小型偵錯資訊。
其他值請參閱
Soong 模組參考資料。
主機_支援
如果是裝置模組,host_supported
參數會指出模組是否
也應提供主機變化版本
定義程式庫依附元件
Rust 模組可以同時依附於 CC 和 Rust 程式庫:
資源名稱 | 說明 |
---|---|
rustlibs |
也是依附元件的 rust_library 模組清單。使用做為
您偏好的宣告依附元件方法,因為這樣可讓建構系統
選取偏好的連結(請參閱下方的「連結至 Rust 程式庫時」一節)。 |
rlibs |
必須靜態連結的 rust_library 個模組清單
使用 rlibs 。(請謹慎使用,詳情請參閱
如要連結至 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 程式庫時,
最佳做法是使用 rustlibs
屬性,而非 rlibs
,或者
dylibs
,除非您有特定原因。這樣一來
讓系統根據根模組需要的連結
選取正確的連結
並降低依附元件樹狀結構同時包含 rlib
與
dylib
版本的程式庫 (會導致編譯失敗)。
不支援和有限的支援建構功能
Soong 的 Rust 針對 vendor
和
vendor_ramdisk
映像檔和快照。不過,staticlibs
、cdylibs
、
系統支援 rlibs
和 binaries
。如果是廠商映像檔建構目標,
已設定 android_vndk
cfg
屬性。如果程式碼中有
以及系統和廠商目標之間的差異rust_proc_macros
不
做為供應商快照擷取;需要特別注意的是
以及適當版本管控
不支援產品、VNDK 和復原映像檔。
漸進式建構
開發人員可以啟用
將 SOONG_RUSTC_INCREMENTAL
設為 Rust 來源
將環境變數設為 true
警告:不保證會產生完全相同的二進位檔 產生的錯誤其中包含的函式或資料位址, 不一定相同確保產生的構件 100% 和 EngProd 基礎架構建構的應用程式一樣,不設定這個值。