Kaynak üreteçleri

Bu sayfa, oluşturulan kaynağın nasıl desteklendiğine ve yapı sisteminde nasıl kullanılabileceğine ilişkin üst düzey bir görünüm sağlar.

Tüm kaynak oluşturucular benzer yapı sistemi işlevselliği sağlar. Yapı sistemi destekli üç kaynak oluşturma kullanım durumu, bingen, AIDL arayüzleri ve protobuf arayüzlerini kullanarak C bağlamaları oluşturuyor.

Oluşturulan kaynaktan kasalar

Kaynak kodu üreten her Rust modülü, tıpkı bir rust_library olarak tanımlanmış gibi, bir kasa olarak kullanılabilir. (Bu, rustlibs , rlibs ve dylibs özelliklerine bağımlılık olarak tanımlanabileceği anlamına gelir.) Platform kodu için en iyi kullanım şekli, oluşturulan kaynağı bir kasa olarak kullanmaktır. Her ne kadar include! makro, oluşturulan kaynak için desteklenir; birincil amacı, external/ içinde bulunan üçüncü taraf kodunu desteklemektir.

Platform kodunun, benzersiz bir şekilde kaynak oluşturmak için bir genrule modülü kullandığınızda olduğu gibi, include!() makrosu aracılığıyla oluşturulan kaynağı kullanmaya devam edebileceği durumlar vardır.

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

Oluşturulan kaynağın sandık olarak kullanılması, her bir özel (ilgili) modül sayfasındaki örneklerde ele alınmaktadır. Bu bölümde, oluşturulan kaynağa include!() makrosu aracılığıyla nasıl başvurulacağı gösterilmektedir. Bu sürecin tüm kaynak oluşturucular için benzer olduğunu unutmayın.

Önkoşul

Bu örnek, bir rust_bindgen modülünü ( libbuzz_bindgen ) tanımladığınız varsayımına dayanmaktadır ve include!() makrosunu kullanmak için oluşturulan kaynağı dahil etme adımlarına ilerleyebilirsiniz. Henüz yapmadıysanız, lütfen pas bağlama modülünü tanımlama sayfasına gidin, libbuzz_bindgen oluşturun ve buraya geri 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 için neden kasalar

C/C++ derleyicilerinin aksine, rustc yalnızca bir ikili programa veya kitaplığa giriş noktasını temsil eden tek bir kaynak dosyayı kabul eder. Kaynak ağacının, gerekli tüm kaynak dosyaların otomatik olarak keşfedilebileceği şekilde yapılandırılmasını bekler. Bu, oluşturulan kaynağın ya kaynak ağacına yerleştirilmesi ya da kaynaktaki bir içerme 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ı hakkındaki varsayımlara güvenir. Oluşturulduğunda, cargo komutu, build.rs komut dosyalarının oluşturulan kaynak kodunu yerleştirmesinin beklendiği bir OUT_DIR ortam değişkenini ayarlar. Kaynak kodunu eklemek için aşağıdaki komutu kullanın:

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

Bu, her modülün çıktılarının kendi out/ dizini 1'e yerleştirilmesi nedeniyle Soong için bir zorluk teşkil etmektedir. Bağımlılıkların oluşturulan kaynaklarını çıktıladığı tek bir OUT_DIR yoktur.

Platform kodu için AOSP, çeşitli nedenlerden dolayı oluşturulan kaynağın içe aktarılabilecek bir kasaya paketlenmesini tercih eder:

  • Oluşturulan kaynak dosya adlarının çakışmasını önleyin.
  • Ağaç genelinde bakım gerektiren standart kodları azaltın. Oluşturulan kaynağın bir sandıkta derlenmesini sağlamak için gereken tüm standartların bakımı merkezi olarak yapılabilir.
  • Oluşturulan kod ile çevresindeki kasa arasında örtülü 2 etkileşimden kaçının.
  • Yaygın olarak kullanılan oluşturulan kaynakları dinamik olarak bağlayarak bellek ve disk üzerindeki baskıyı azaltın.

Sonuç olarak, Android'in tüm Rust kaynak oluşturma modülü türleri, derlenip sandık olarak kullanılabilen kodlar üretir. Bir modül için oluşturulan tüm kaynak bağımlılıkları, Cargo'ya benzer şekilde modül başına tek bir dizine kopyalanırsa Soong, değişiklik yapılmadan üçüncü taraf kasaları desteklemeye devam eder. Bu gibi durumlarda Soong, modülü derlerken OUT_DIR ortam değişkenini bu dizine ayarlar, böylece oluşturulan kaynak bulunabilir. Ancak, daha önce açıklanan nedenlerden dolayı, bu mekanizmayı yalnızca kesinlikle gerekli olduğunda platform kodunda kullanmak en iyi uygulamadır.


  1. Oluşturulan kaynağın yolu doğrudan derleyiciye sağlandığından bu, C/C++ ve benzeri diller için herhangi bir sorun yaratmaz.

  2. Dahil include! metin ekleme yoluyla çalışır, çevreleyen ad alanındaki değerlere referans verebilir, ad alanını değiştirebilir veya #![foo] gibi yapılar kullanabilir. Bu örtülü etkileşimlerin sürdürülmesi zor olabilir. Kasanın geri kalanıyla etkileşim gerçekten gerekli olduğunda her zaman makroları tercih edin.

,

Bu sayfa, oluşturulan kaynağın nasıl desteklendiğine ve yapı sisteminde nasıl kullanılabileceğine ilişkin üst düzey bir görünüm sağlar.

Tüm kaynak oluşturucular benzer yapı sistemi işlevselliği sağlar. Yapı sistemi destekli üç kaynak oluşturma kullanım durumu, bingen, AIDL arayüzleri ve protobuf arayüzlerini kullanarak C bağlamaları oluşturuyor.

Oluşturulan kaynaktan kasalar

Kaynak kodu üreten her Rust modülü, tıpkı bir rust_library olarak tanımlanmış gibi, bir kasa olarak kullanılabilir. (Bu, rustlibs , rlibs ve dylibs özelliklerine bağımlılık olarak tanımlanabileceği anlamına gelir.) Platform kodu için en iyi kullanım şekli, oluşturulan kaynağı bir kasa olarak kullanmaktır. Her ne kadar include! makro, oluşturulan kaynak için desteklenir; birincil amacı, external/ içinde bulunan üçüncü taraf kodunu desteklemektir.

Platform kodunun, benzersiz bir şekilde kaynak oluşturmak için bir genrule modülü kullanmanız gibi, include!() makrosu aracılığıyla oluşturulan kaynağı kullanmaya devam edebileceği durumlar vardır.

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

Oluşturulan kaynağın sandık olarak kullanılması, her bir özel (ilgili) modül sayfasındaki örneklerde ele alınmaktadır. Bu bölümde, oluşturulan kaynağa include!() makrosu aracılığıyla nasıl başvurulacağı gösterilmektedir. Bu sürecin tüm kaynak oluşturucular için benzer olduğunu unutmayın.

Önkoşul

Bu örnek, bir rust_bindgen modülünü ( libbuzz_bindgen ) tanımladığınız varsayımına dayanmaktadır ve include!() makrosunu kullanmak için oluşturulan kaynağı dahil etme adımlarına ilerleyebilirsiniz. Henüz yapmadıysanız, lütfen pas bağlama modülünü tanımlama sayfasına gidin, libbuzz_bindgen oluşturun ve buraya geri 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 için neden kasalar

C/C++ derleyicilerinin aksine, rustc yalnızca bir ikili programa veya kitaplığa giriş noktasını temsil eden tek bir kaynak dosyayı kabul eder. Kaynak ağacının, gerekli tüm kaynak dosyaların otomatik olarak keşfedilebileceği şekilde yapılandırılmasını bekler. Bu, oluşturulan kaynağın ya kaynak ağacına yerleştirilmesi ya da kaynaktaki bir içerme 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ı hakkındaki varsayımlara güvenir. Oluşturulduğunda, cargo komutu, build.rs komut dosyalarının oluşturulan kaynak kodunu yerleştirmesinin beklendiği bir OUT_DIR ortam değişkenini ayarlar. Kaynak kodunu eklemek için aşağıdaki komutu kullanın:

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

Her modülün çıktıları kendi out/ dizinlerine 1 yerleştirildiğinden, bu Soong için bir zorluk teşkil ediyor. Bağımlılıkların oluşturulan kaynaklarını çıktıladığı tek bir OUT_DIR yoktur.

Platform kodu için AOSP, çeşitli nedenlerden dolayı oluşturulan kaynağın içe aktarılabilecek bir kasaya paketlenmesini tercih eder:

  • Oluşturulan kaynak dosya adlarının çakışmasını önleyin.
  • Ağaç genelinde bakım gerektiren standart kodları azaltın. Oluşturulan kaynağın bir kasada derlenmesini sağlamak için gereken tüm standartların bakımı merkezi olarak yapılabilir.
  • Oluşturulan kod ile çevresindeki kasa arasında örtülü 2 etkileşimden kaçının.
  • Yaygın olarak kullanılan oluşturulan kaynakları dinamik olarak bağlayarak bellek ve disk üzerindeki baskıyı azaltın.

Sonuç olarak, Android'in tüm Rust kaynak oluşturma modülü türleri, derlenip sandık olarak kullanılabilen kodlar üretir. Bir modül için oluşturulan tüm kaynak bağımlılıkları, Cargo'ya benzer şekilde modül başına tek bir dizine kopyalanırsa Soong, değişiklik yapılmadan üçüncü taraf kasaları desteklemeye devam eder. Bu gibi durumlarda Soong, modülü derlerken OUT_DIR ortam değişkenini bu dizine ayarlar, böylece oluşturulan kaynak bulunabilir. Ancak, daha önce açıklanan nedenlerden dolayı, bu mekanizmayı yalnızca kesinlikle gerekli olduğunda platform kodunda kullanmak en iyi uygulamadır.


  1. Oluşturulan kaynağın yolu doğrudan derleyiciye sağlandığından bu, C/C++ ve benzeri diller için herhangi bir sorun yaratmaz.

  2. Dahil include! Metin ekleme yoluyla çalışır, çevreleyen ad alanındaki değerlere referans verebilir, ad alanını değiştirebilir veya #![foo] gibi yapılar kullanabilir. Bu örtülü etkileşimlerin sürdürülmesi zor olabilir. Kasanın geri kalanıyla etkileşim gerçekten gerekli olduğunda her zaman makroları tercih edin.

,

Bu sayfa, oluşturulan kaynağın nasıl desteklendiğine ve yapı sisteminde nasıl kullanılabileceğine ilişkin üst düzey bir görünüm sağlar.

Tüm kaynak oluşturucular benzer yapı sistemi işlevselliği sağlar. Yapı sistemi destekli üç kaynak oluşturma kullanım durumu, bingen, AIDL arayüzleri ve protobuf arayüzlerini kullanarak C bağlamaları oluşturuyor.

Oluşturulan kaynaktan kasalar

Kaynak kodu üreten her Rust modülü, tıpkı bir rust_library olarak tanımlanmış gibi, bir kasa olarak kullanılabilir. (Bu, rustlibs , rlibs ve dylibs özelliklerine bağımlılık olarak tanımlanabileceği anlamına gelir.) Platform kodu için en iyi kullanım şekli, oluşturulan kaynağı bir kasa olarak kullanmaktır. Her ne kadar include! makro, oluşturulan kaynak için desteklenir; birincil amacı, external/ içinde bulunan üçüncü taraf kodunu desteklemektir.

Platform kodunun, benzersiz bir şekilde kaynak oluşturmak için bir genrule modülü kullandığınızda olduğu gibi, include!() makrosu aracılığıyla oluşturulan kaynağı kullanmaya devam edebileceği durumlar vardır.

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

Oluşturulan kaynağın sandık olarak kullanılması, her bir özel (ilgili) modül sayfasındaki örneklerde ele alınmaktadır. Bu bölümde, oluşturulan kaynağa include!() makrosu aracılığıyla nasıl başvurulacağı gösterilmektedir. Bu sürecin tüm kaynak oluşturucular için benzer olduğunu unutmayın.

Önkoşul

Bu örnek, bir rust_bindgen modülünü ( libbuzz_bindgen ) tanımladığınız varsayımına dayanmaktadır ve include!() makrosunu kullanmak için oluşturulan kaynağı dahil etme adımlarına ilerleyebilirsiniz. Henüz yapmadıysanız, lütfen pas bağlama modülünü tanımlama sayfasına gidin, libbuzz_bindgen oluşturun ve buraya geri 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 için neden kasalar

C/C++ derleyicilerinin aksine, rustc yalnızca bir ikili programa veya kitaplığa giriş noktasını temsil eden tek bir kaynak dosyayı kabul eder. Kaynak ağacının, gerekli tüm kaynak dosyaların otomatik olarak keşfedilebileceği şekilde yapılandırılmasını bekler. Bu, oluşturulan kaynağın ya kaynak ağacına yerleştirilmesi ya da kaynaktaki bir içerme 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ı hakkındaki varsayımlara güvenir. Oluşturulduğunda, cargo komutu, build.rs komut dosyalarının oluşturulan kaynak kodunu yerleştirmesinin beklendiği bir OUT_DIR ortam değişkenini ayarlar. Kaynak kodunu eklemek için aşağıdaki komutu kullanın:

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

Bu, her modülün çıktılarının kendi out/ dizini 1'e yerleştirilmesi nedeniyle Soong için bir zorluk teşkil etmektedir. Bağımlılıkların oluşturulan kaynaklarını çıktıladığı tek bir OUT_DIR yoktur.

Platform kodu için AOSP, çeşitli nedenlerden dolayı oluşturulan kaynağın içe aktarılabilecek bir kasaya paketlenmesini tercih eder:

  • Oluşturulan kaynak dosya adlarının çakışmasını önleyin.
  • Ağaç genelinde bakım gerektiren standart kodları azaltın. Oluşturulan kaynağın bir sandıkta derlenmesini sağlamak için gereken tüm standartların bakımı merkezi olarak yapılabilir.
  • Oluşturulan kod ile çevresindeki kasa arasında örtülü 2 etkileşimden kaçının.
  • Yaygın olarak kullanılan oluşturulan kaynakları dinamik olarak bağlayarak bellek ve disk üzerindeki baskıyı azaltın.

Sonuç olarak, Android'in tüm Rust kaynak oluşturma modülü türleri, derlenip sandık olarak kullanılabilen kodlar üretir. Bir modül için oluşturulan tüm kaynak bağımlılıkları, Cargo'ya benzer şekilde modül başına tek bir dizine kopyalanırsa Soong, değişiklik yapılmadan üçüncü taraf kasaları desteklemeye devam eder. Bu gibi durumlarda Soong, modülü derlerken OUT_DIR ortam değişkenini bu dizine ayarlar, böylece oluşturulan kaynak bulunabilir. Ancak, daha önce açıklanan nedenlerden dolayı, bu mekanizmayı yalnızca kesinlikle gerekli olduğunda platform kodunda kullanmak en iyi uygulamadır.


  1. Oluşturulan kaynağın yolu doğrudan derleyiciye sağlandığından bu, C/C++ ve benzeri diller için herhangi bir sorun yaratmaz.

  2. Dahil include! metin ekleme yoluyla çalışır, çevreleyen ad alanındaki değerlere referans verebilir, ad alanını değiştirebilir veya #![foo] gibi yapılar kullanabilir. Bu örtülü etkileşimlerin sürdürülmesi zor olabilir. Kasanın geri kalanıyla etkileşim gerçekten gerekli olduğunda her zaman makroları tercih edin.