Kaynak oluşturucular

Bu sayfada, oluşturulan kaynağın nasıl desteklendiğine dair genel bir bakış sunulur. derleme sisteminde nasıl kullanılabileceğini öğreneceksiniz.

Tüm kaynak oluşturucular, benzer bir derleme sistemi işlevi sunar. Üç derleme sistemi tarafından desteklenen kaynak oluşturma kullanım alanları C bağlamaları oluşturuyor AIDL arayüzlerini ve protobuf arayüzlerini kullanarak.

Oluşturulan kaynaktan gelen kasalar

Kaynak kod üreten her Rust modülü bir kafes olarak kullanılabilir. (rust_library olarak tanımlandıysa) (Yani, bu bir hedef olarak tanımlanabilir rustlibs, rlibs ve dylibs özelliklerinde bağımlılık.) En iyi kullanım kalıbı, oluşturulan kaynağı kafes olarak kullanmaktır. Her ne kadar include! makrosu, oluşturulan kaynak için destekleniyor. Birincil amacı şudur: external/ içinde bulunan üçüncü taraf kodunu destekler.

Platform kodunun include!() makrosu (ör. kaynak oluşturmak için genrule modülü kullandığınızda) benzersiz bir şekilde kullanır.

Oluşturulan kaynağı dahil etmek için include!() işlevini kullanın.

Oluşturulan kaynağın kafes olarak kullanılması, her bir ayrıntıdaki örneklere tabidir. (ilgili) modül sayfasını ziyaret edin. Bu bölümde, oluşturulan kaynağa nasıl referans verileceği gösterilmektedir include!() makrosu aracılığıyla iletilsin. Bu işlemin tüm kaynaklarda benzer olduğunu unutmayın. oluşturabilirsiniz.

Ön Koşul

Bu örnek, bir rust_bindgen tanımladığınız varsayılır. modülünü (libbuzz_bindgen) gerçekleştirip Oluşturulan kaynağı ekleme adımları'na geçebilirsiniz. (include!()) makrosuna karşılık gelir. Henüz yapmadıysanız lütfen Pas bağlama modülü tanımlama bölümüne gidin. libbuzz_bindgen oluşturun, ardından buraya dönün.

Bunun derleme dosyası bölümlerinin, tüm kaynak oluşturucular için geçerli olduğunu unutmayın.

Oluşturulan kaynağı dahil etme adımları

Aşağıdaki içeriklerle external/rust/hello_bindgen/Android.bp oluşturun:

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",
    ],
}
.

Aşağıdaki içeriklerle external/rust/hello_bindgen/src/bindings.rs oluşturun:

#![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"));

Aşağıdaki içeriklerle external/rust/hello_bindgen/src/lib.rs oluşturun:

mod bindings;

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

Oluşturulan kaynak neden oluşturulur?

C/C++ derleyicilerinden farklı olarak, rustc yalnızca tek bir kaynak dosyayı kabul eder giriş noktasını temsil eder. Kaynağın çalışma sırasında ağaç, tüm gerekli kaynak dosyalarının otomatik olarak keşfedilebilir. Yani, oluşturulan kaynağın ağacından veya kaynaktaki bir "include" (ekleme) yönergesiyle sağlanır:

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

Rust topluluğu build.rs senaryolarına ve sadece Cargo derleme ortamına uymasını sağlamak sizin göreviniz. Uygulama derlendiğinde cargo komutu bir OUT_DIR ortam değişkeni ayarlar Oluşturulan kaynak kodu build.rs komut dosyasının yerleştirmesi beklenen yer. Şunu kullanın: aşağıdaki komutu çalıştırın:

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

Bu durum, her modülün çıkışları sıraya koyulduğu için Shortg için bir zorluk teşkil etmektedir. kendine ait out/ dizini1 bulunabilir. Tek bir OUT_DIR yok. bağımlılıkları, oluşturdukları kaynağın çıktısını verir.

AOSP, platform kodu için oluşturulan kaynağı saksılara uygun şekilde paketlemeyi tercih eder. içe aktarılmalıdır:

  • Oluşturulan kaynak dosya adlarının çakışmasını önleyin.
  • Ortak metin kodunu azaltın veya bakım gerektiren bir katılımcıdır. Proje yönetiminde oluşturulan kaynak derlemesini yapmak için gereklidir merkezi olarak bakımını yapabiliriz.
  • Oluşturulan kod ile etrafındaki kafes arasında örtülü 2 etkileşimlerinden kaçının.
  • Genellikle kullanılan kaynakları dinamik olarak bağlayarak bellek ve disk üzerindeki baskıyı azaltın.

Bunun sonucunda, Android'in tüm Rust kaynak oluşturma modülü türleri Bu doküman derlenip sandık olarak kullanılabilecek. Yakındag, tüm kullanıcılar herhangi bir değişiklik yapılmadan üçüncü taraf bir modül için oluşturulan kaynak bağımlılıkları, modül başına tek bir bileşene kopyalanır olduğunu varsayalım. Bu gibi durumlarda Mostg, OUT_DIR ortam değişkenini ayarlar oluşturulan kaynağın bulunabilmesi için bu dizinde yer alır. Ancak, daha önce açıklanan nedenlerden dolayı, yalnızca bu mekanizmayı platform kodunda belirtmeniz gerekir.


  1. Bu durum, C/C++ ve benzer diller için bir sorun oluşturmaz çünkü oluşturulan kaynağa giden yol, doğrudan derleyiciye sağlanır.

  2. include!, metin içerme işlevini kullandığından şundaki değerlere başvuruda bulunabilir: ad alanını değiştirin veya #![foo] gibi yapılar kullanın. Bu örtülü etkileşimleri sürdürmek zor olabilir. Her zaman tercih et makrolarını kullanır.