Bu sayfada, oluşturulan kaynağın nasıl desteklendiği ve derleme sisteminde nasıl kullanılabileceğine dair genel bir bakış sunulmaktadır.
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.) Platform kodu için en iyi kullanım şekli, oluşturulan kaynağı paket olarak kullanmaktır. Oluşturulan kaynak için include!
makrosu desteklenmesine rağmen birincil amacı, external/
içinde bulunan üçüncü taraf kodunu desteklemektir.
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ğı kutu olarak kullanma, her bir (ilgili) modül sayfasındaki örneklerde ele alınmıştır. 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 Rust bindgen modülü tanımlama başlıklı makaleyi inceleyin, libbuzz_bindgen
oluşturun ve buraya dönün.
Bu dosyanın derleme dosyası bölümlerinin tüm kaynak oluşturucular için geçerli olduğunu unutmayın.
Oluşturulan kaynağı ekleme 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. Bu, oluşturulan kaynağın kaynak ağacına yerleştirilmesi veya kaynakta bir include yönergesi aracılığıyla sağlanması gerektiği anlamına gelir:
include!("/path/to/hello.rs");
Rust topluluğu, bu farkla çalışmak için build.rs
komut dosyalarına ve Cargo derleme ortamıyla ilgili varsayımlara ihtiyaç duyar.
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ğı, aşağıdaki nedenlerden dolayı içe aktarılabilen bir pakete paketlemeyi tercih eder:
- Oluşturulan kaynak dosya adlarının çakışmasını önleyin.
- Ağaç boyunca kaydedilen ve bakım gerektiren ortak metin kodunun sayısını azaltın. 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.
- Sık kullanılan oluşturulan kaynakları dinamik olarak bağlayarak bellek ve disk üzerindeki baskıyı azaltın.
Sonuç olarak, Android'in Rust kaynak oluşturma modülü türlerinin tümü, derlenip paket olarak kullanılabilen kodlar oluşturur.
Shortg, herhangi bir değişiklik yapılmadan üçüncü taraf kasalarını desteklemeye devam etmektedir.
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ı, bu mekanizmanın platform kodunda yalnızca kesinlikle gerekli olduğunda kullanılması en iyi uygulamadır.
-
Oluşturulan kaynağın yolu doğrudan derleyiciye sağlandığından bu durum C/C++ ve benzer diller için herhangi bir sorun teşkil etmez. ↩
-
include!
, metin dahil etme yöntemiyle çalıştığından, kapsayıcı ad alanındaki değerlere referans verebilir, ad alanını değiştirebilir veya#![foo]
gibi yapıları kullanabilir. Bu dolaylı etkileşimlerin sürdürülmesi zor olabilir. Paketin geri kalanıyla etkileşim gerçekten gerekli olduğunda her zaman makroları tercih edin.↩