來源產生器

本頁面會概略說明系統如何支援生成來源, 如何在建構系統中使用

所有來源產生器都提供類似的建構系統功能。三項 建構系統支援原始碼產生用途,正在產生 C 繫結 產生互動管道

產生的來源中的 Crate

每個產生原始碼的 Rust 模組都可做為 Crate, (如果已定義為 rust_library)。(也就是說,廣告素材可定義為 rustlibsrlibsdylibs 屬性中的依附元件)。最佳用量 平台程式碼的模式是使用產生的來源做為 Crate。雖然 include! 巨集適用於產生的來源,主要用途為 支援 external/ 中的第三方程式碼。

在某些情況下,平台程式碼可能仍會使用 include!() 巨集,例如您使用 genrule 模組產生來源時 獨特的風格

使用 include!() 來納入產生的來源

將產生的來源做為 Crate 均會涵蓋每個特定領域的範例 (各選項) 模組頁面。本節說明如何參照產生的來源 透過 include!() 巨集請注意,這項程序適用於所有來源 產生器

先修規定

這個範例假設您已定義 rust_bindgen 模組 (libbuzz_bindgen),即可繼續進行納入產生來源的步驟 使用 include!() 巨集如果您尚未定義,請參閱「定義 Rust 繫結代模組」。 請建立 libbuzz_bindgen,然後返回這裡。

請注意,上述的建構檔案部分適用於所有來源產生器。

納入生成來源的步驟

使用以下內容建立 external/rust/hello_bindgen/Android.bp

rust_binary {
   name: "hello_bzip_bindgen_include",
   srcs: [
         // The primary rust source file must come first in this list.
         "src/lib.rs",

         // The module providing the bindgen bindings is
         // included in srcs prepended by ":".
         ":libbuzz_bindgen",
    ],

    // Dependencies need to be redeclared when generated source is used via srcs.
    shared_libs: [
        "libbuzz",
    ],
}

使用以下內容建立 external/rust/hello_bindgen/src/bindings.rs

#![allow(clippy::all)]
#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(unused)]
#![allow(missing_docs)]

// Note that "bzip_bindings.rs" here must match the source_stem property from
// the rust_bindgen module.
include!(concat!(env!("OUT_DIR"), "/bzip_bindings.rs"));

使用以下內容建立 external/rust/hello_bindgen/src/lib.rs

mod bindings;

fn main() {
    let mut x = bindings::foo { x: 2 };
    unsafe { bindings::fizz(1, &mut x as *mut bindings::foo) }
}

為何要為產生來源建立 Crate

與 C/C++ 編譯器不同,rustc 只接受單一來源檔案 代表二進位或程式庫的進入點它會預期來源 結構,使所有必要的來源檔案都能 發現。也就是說,產生的來源必須置於來源中 或透過 include 指令提供:

include!("/path/to/hello.rs");

Rust 社群依附於 build.rs 指令碼,以及對 Cargo 建構環境,以便處理這項差異cargo 指令會在建構時設定 OUT_DIR 環境變數 預計將產生的原始碼放入其中 build.rs 指令碼使用 加入原始碼:

include!(concat!(env!("OUT_DIR"), "/hello.rs"));

這對 Soong 來說是一大挑戰,因為每個單元的輸出內容都放在 自己的 out/ 目錄1。沒有單一 OUT_DIR,其中 依附元件會輸出產生的來源

針對平台程式碼,AOSP 傾向將產生的來源封裝成 Crate 有幾個原因:

  • 防止系統產生的來源檔案名稱相互衝突。
  • 減少樣板程式碼 在需要維護的樹狀結構中簽到。任何 對產生的原始碼編譯所需的程式碼 可集中維護
  • 避免在產生的程式碼與周遭 Crate 之間隱含2隱含互動。
  • 動態連結常用的產生的來源,以降低記憶體和磁碟的壓力。

因此,所有 Android 的 Rust 來源產生模組類型都會產生程式碼 可以編譯並做為 Crate 使用。 Soong 仍支援第三方 Crate,即使所有內容進行修改,也不會進行修改 為模組產生的來源依附元件會複製到每個模組的單一模組 與 Cargo 類似在這種情況下,Soong 會設定 OUT_DIR 環境變數 加入該目錄後就能找到產生的原始碼。 不過,基於上述原因,最好只使用 如果需要在必要時使用平台程式碼中的機制


  1. 這不會對 C/C++ 和類似語言產生任何問題, 產生的來源路徑會直接提供給編譯器。 

  2. 由於 include! 會與文字納入搭配運作,因此可能會參照來自 包含命名空間、修改命名空間,或是使用 #![foo] 等建構項目。 難以維護這些隱含互動。一律選擇 巨集。