Sebagai prinsip umum, definisi modul rust_*
sangat mematuhi
penggunaan dan ekspektasi cc_*
. Berikut adalah contoh definisi modul
untuk biner Rust:
rust_binary {
name: "hello_rust",
crate_name: "hello_rust",
srcs: ["src/hello_rust.rs"],
host_supported: true,
}
Halaman ini membahas properti paling umum untuk modul rust_*
. Untuk
mengetahui informasi selengkapnya tentang jenis modul tertentu dan contoh definisi modul,
lihat
Modul biner,
Modul library,
atau
Modul pengujian.
Jenis modul dasar
Jenis | Definisi | Untuk Informasi Selengkapnya |
---|---|---|
rust_binary | Biner Rust | Modul Biner halaman |
rust_library | Menghasilkan library Rust, dan menyediakan varian rlib dan
dylib . |
rust_library ,
Library Modules. |
rust_ffi | Menghasilkan library Rust C yang dapat digunakan oleh cc modul, dan menyediakan varian statis dan bersama. | rust_ffi ,
Halaman Modul Library |
rust_proc_macro | Menghasilkan library Rust proc-macro .
(Ini setara dengan plugin compiler.) |
rust_proc_macro ,
Halaman Modul Library |
rust_test | Menghasilkan biner pengujian Rust yang menggunakan Harness uji Rust standar. | Halaman Test Modules |
rust_fuzz | Menghasilkan biner fuzz Rust yang memanfaatkan
libfuzzer . |
Contoh modul rust_fuzz |
rust_protobuf | Menghasilkan sumber dan menghasilkan library Rust yang menyediakan antarmuka untuk protobuf tertentu. | Halaman Modul Protobufs dan Generator Sumber |
rust_bindgen | Menghasilkan sumber dan menghasilkan Library Rust yang berisi binding Rust ke library C. | Modul Bindgen Binding dan halaman Source Generator |
Properti umum yang penting
Properti ini umum di semua Android Rust Modul. Setiap properti tambahan (unik) yang terkait dengan setiap modul Rust tercantum di halaman modul tersebut.
nama
name
adalah nama modul Anda. Seperti modul Soong lainnya, nama ini harus unik
di sebagian besar jenis modul Android.bp
. Secara default, name
digunakan sebagai output
. Jika nama file output harus berbeda dari nama modul, gunakan
stem
untuk menentukannya.
batang
stem
(opsional) memberikan kontrol langsung atas nama file output (tidak termasuk
ekstensi file dan akhiran lainnya). Misalnya, library rust_library_rlib
dengan nilai stem libfoo
menghasilkan file libfoo.rlib
. Jika Anda
tidak memberikan nilai untuk properti stem
, nama file output akan mengadopsi
nama modul secara {i>default<i}.
Gunakan fungsi stem
jika Anda tidak dapat menetapkan nama modul ke output yang diinginkan
. Misalnya, rust_library
untuk crate log
diberi nama
liblog_rust
,
karena liblog cc_library
sudah ada. Penggunaan properti stem
dalam hal ini memastikan bahwa file
output diberi nama liblog.*
, bukan liblog_rust.*
.
srcs
srcs
berisi satu file sumber yang mewakili titik entri ke
modul Anda (biasanya main.rs
atau lib.rs
). rustc
menangani resolusi dan
penemuan semua file sumber lain yang diperlukan untuk kompilasi, dan file ini
dienumerasikan dalam file deps
yang dihasilkan.
Jika memungkinkan, hindari penggunaan ini untuk kode platform; lihat Generator Sumber untuk informasi selengkapnya.
{i>crate_name<i}
crate_name
menetapkan metadata nama crate melalui tanda rustc
--crate_name
. Untuk modul yang menghasilkan library, hal ini harus cocok dengan nama crate
yang diharapkan yang digunakan dalam sumber. Misalnya, jika modul libfoo_bar
direferensikan
dalam sumber sebagai extern crate foo_bar
, maka harus berupa
crate_name: "foo_bar".
Properti ini umum untuk semua modul rust_*
, tetapi wajib untuk modul
yang menghasilkan library Rust (seperti rust_library
rust_ffi
, rust_bindgen
, rust_protobuf
, dan rust_proc_macro
). Ini
modul menerapkan rustc
persyaratan pada hubungan antara crate_name
dan nama file {i>output<i}. Untuk informasi selengkapnya, lihat
bagian
Modul Library.
lint
Linter rustc dijalankan secara default untuk semua jenis modul kecuali generator sumber. Beberapa kumpulan lint ditentukan dan digunakan untuk memvalidasi sumber modul. Kemungkinan nilai untuk kumpulan lint tersebut adalah sebagai berikut:
default
kumpulan lint default, bergantung pada lokasi modulandroid
kumpulan lint paling ketat yang berlaku untuk semua kode platform Androidvendor
kumpulan lint longgar yang diterapkan ke kode vendornone
untuk mengabaikan semua peringatan dan error lint
clippy_lint
Linter klip juga dijalankan secara default untuk semua jenis modul kecuali generator sumber. Beberapa kumpulan lint ditentukan yang digunakan untuk memvalidasi sumber modul. Berikut adalah beberapa kemungkinan nilai:
- Kumpulan lint default
default
bergantung pada lokasi modul android
kumpulan lint paling ketat yang berlaku untuk semua kode platform Androidvendor
kumpulan lint longgar yang diterapkan ke kode vendornone
untuk mengabaikan semua peringatan dan error lint
edisi
edition
menentukan edisi Rust yang akan digunakan untuk
mengompilasi kode ini. Hal ini mirip dengan versi std untuk C dan C++. Nilai yang valid
adalah 2015
dan 2018
(default).
flags
flags
berisi daftar string flag yang akan diteruskan ke rustc
selama kompilasi.
ld_flag
ld-flags
berisi daftar string flag yang akan diteruskan ke penaut saat mengompilasi
sumber. Flag ini diteruskan oleh flag rustc -C linker-args
. clang
digunakan sebagai
frontend penaut, yang memanggil lld
untuk penautan yang sebenarnya.
fitur
features
adalah daftar string fitur yang harus diaktifkan selama kompilasi.
Ini diteruskan ke rustc oleh --cfg 'feature="foo"'
. Sebagian besar fitur bersifat tambahan,
sehingga dalam banyak kasus, fitur ini terdiri dari kumpulan fitur lengkap yang diperlukan oleh semua modul
dependen. Namun, dalam kasus di mana fitur bersifat eksklusif satu sama lain,
mendefinisikan modul tambahan dalam setiap file {i>build <i}yang menyediakan fitur yang bertentangan.
cfg
cfgs
berisi daftar string flag cfg
yang akan diaktifkan selama kompilasi.
Ini diteruskan ke rustc
oleh --cfg foo
dan --cfg "fizz=buzz"
.
Sistem build secara otomatis menetapkan flag cfg
tertentu dalam situasi
tertentu, yang tercantum di bawah:
Modul yang di-build sebagai dylib akan memiliki set cfg
android_dylib
.Modul yang akan menggunakan VNDK akan memiliki kumpulan
android_vndk
cfg. Hal ini serupa dengan definisi__ANDROID_VNDK__
untuk C++.
strip
strip
mengontrol apakah dan bagaimana file output dihapus (jika ada).
Jika tidak ditetapkan, modul perangkat akan menghapus semua kecuali debuginfo mini secara default.
Modul host, secara default, tidak menghapus simbol apa pun. Nilai yang valid mencakup none
untuk menonaktifkan penghapusan, dan all
untuk menghapus semuanya, termasuk debuginfo mini.
Nilai tambahan dapat ditemukan di
Referensi Modul Soong.
didukung host
Untuk modul perangkat, parameter host_supported
menunjukkan apakah modul
juga harus menyediakan
varian {i>host<i}.
Menentukan dependensi library
Modul Rust dapat bergantung pada library CC dan Rust melalui properti berikut:
Nama Properti | Deskripsi |
---|---|
rustlibs |
Daftar modul rust_library yang juga merupakan dependensi. Gunakan ini sebagai
metode pilihan Anda untuk mendeklarasikan dependensi, karena memungkinkan
memilih penautan yang diinginkan. (Lihat Saat menautkan ke library Rust, di bawah) |
rlibs |
Daftar modul rust_library yang harus ditautkan secara statis
sebagai rlibs . (Gunakan dengan hati-hati; lihat
Saat menautkan ke library Rust, di bawah.) |
shared_libs |
Daftar modul cc_library yang harus ditautkan secara
dinamis sebagai library bersama. |
static_libs |
Daftar modul cc_library yang harus berada secara statis
ditautkan sebagai library statis. |
whole_static_libs |
Daftar modul cc_library yang harus bersifat statis
ditautkan sebagai library statis dan menyertakan keseluruhan library yang dihasilkan. Sebagai
rust_ffi_static varian, whole_static_libraries akan disertakan dalam
arsip perpustakaan statis yang dihasilkan. Untuk varian rust_library_rlib ,
library whole_static_libraries akan dipaketkan ke dalam library rlib
yang dihasilkan.
|
Saat menautkan ke library Rust, sebagai
praktik terbaik, lakukan menggunakan properti rustlibs
, bukan rlibs
atau
dylibs
, kecuali jika Anda memiliki alasan khusus untuk melakukannya. Hal ini memungkinkan sistem
build memilih penautan yang benar berdasarkan apa yang diperlukan modul root,
dan mengurangi kemungkinan hierarki dependensi berisi versi rlib
dan
dylib
library (yang akan menyebabkan kompilasi gagal).
Fitur build yang tidak didukung dan dukungan terbatas
Rust Soong menawarkan dukungan terbatas untuk vendor
dan
vendor_ramdisk
gambar dan snapshot. Namun, staticlibs
, cdylibs
,
rlibs
dan binaries
didukung. Untuk target build image vendor,
Properti android_vndk
cfg
ditetapkan. Anda dapat menggunakannya dalam kode jika ada
perbedaan antara target sistem dan vendor. rust_proc_macros
tidak
diambil sebagai bagian dari snapshot vendor; jika ini bergantung, pastikan Anda
mengontrol versinya dengan benar.
Gambar Produk, VNDK, dan Pemulihan tidak didukung.
Build inkremental
Developer dapat mengaktifkan kompilasi inkremental
sumber Rust dengan menetapkan variabel lingkungan
SOONG_RUSTC_INCREMENTAL
ke true
.
Peringatan: Tindakan ini tidak dijamin akan menghasilkan biner yang identik dengan yang dihasilkan oleh buildbot. Alamat fungsi atau data yang terkandung dalam file objek mungkin berbeda. Untuk memastikan artefak yang dihasilkan 100% sama dengan yang dibangun oleh infrastruktur EngProd, jangan tetapkan nilai ini.