כעיקרון כללי, rust_*
הגדרות המודולים תואמות באופן הדוק לשימוש ולציפיות.cc_*
זו דוגמה להגדרת מודול לקובץ בינארי של Rust:
rust_binary {
name: "hello_rust",
crate_name: "hello_rust",
srcs: ["src/hello_rust.rs"],
host_supported: true,
}
בדף הזה מפורטים הנכסים הנפוצים ביותר של מודולים של rust_*
. מידע נוסף על סוגים ספציפיים של מודולים ודוגמאות להגדרות של מודולים זמין במאמרים מודולים בינאריים, מודולים של ספריות או מודולים של בדיקות.
סוגים בסיסיים של מודולים
סוג | הגדרה | למידע נוסף |
---|---|---|
rust_binary | קובץ בינארי של Rust | Binary Modules page |
rust_library | יוצרת ספריית Rust ומספקת גרסאות של rlib ו-dylib . |
rust_library ,
בדף Library Modules (מודולים של ספרייה). |
rust_ffi | יוצר ספריית C של Rust שאפשר להשתמש בה במודולים של cc, ומספק גרסאות סטטיות ומשותפות. | rust_ffi ,
דף המודולים של הספרייה |
rust_proc_macro | יוצר ספרייה של proc-macro Rust.
(הם דומים לפלאגינים של קומפיילר). |
rust_proc_macro ,
דף המודולים של ספריות |
rust_test | נוצר קובץ בינארי של בדיקה ב-Rust שמשתמש במערכת הבדיקה הסטנדרטית של Rust. | הדף Test Modules |
rust_fuzz | נוצר קובץ בינארי של fuzzing ב-Rust באמצעות libfuzzer . |
דוגמה למודול rust_fuzz |
rust_protobuf | יוצר מקור ומפיק ספרייה של Rust שמספקת ממשק ל-protobuf מסוים. | בדפים Protobufs Modules ו-Source Generators |
rust_bindgen | יוצר מקור ומפיק ספריית Rust שמכילה קישורי Rust לספריות C. | בדפים Bindgen Bindings Modules ו-Source Generators |
מאפיינים נפוצים חשובים
המאפיינים האלה משותפים לכל מודולי Rust של Android. נכסים נוספים (ייחודיים) שמשויכים למודולים ספציפיים של Rust מפורטים בדף של אותו מודול.
שם
name
הוא שם המודול. בדומה למודולים אחרים של Soong, השם הזה צריך להיות ייחודי ברוב סוגי המודולים של Android.bp
. כברירת מחדל, שם קובץ הפלט הוא name
. אם שם קובץ הפלט צריך להיות שונה משם המודול, צריך להשתמש במאפיין stem
כדי להגדיר אותו.
גבעול
stem
(אופציונלי) מאפשר שליטה ישירה בשם קובץ הפלט (לא כולל את סיומת הקובץ וסיומות אחרות). לדוגמה, ספרייה עם ערך בסיס של libfoo
יוצרת קובץ libfoo.rlib
.rust_library_rlib
אם לא מציינים ערך למאפיין stem
, שם קובץ הפלט יהיה שם המודול כברירת מחדל.
משתמשים בפונקציה stem
כשאי אפשר להגדיר את שם המודול לשם הקובץ הרצוי של הפלט. לדוגמה, שם ה-rust_library
של תיבת log
הוא liblog_rust
, כי כבר קיים liblog cc_library
. השימוש במאפיין stem
במקרה הזה מבטיח שקובץ הפלט ייקרא liblog.*
ולא liblog_rust.*
.
srcs
srcs
מכיל קובץ מקור יחיד שמייצג את נקודת הכניסה למודול (בדרך כלל main.rs
או lib.rs
). rustc
מטפל בהתאמת נתונים (resolve) ובגילוי של כל שאר קובצי המקור שנדרשים לקומפילציה, והם מפורטים בקובץ deps
שנוצר.
אם אפשר, כדאי להימנע משימוש כזה בקוד של הפלטפורמה. מידע נוסף זמין במאמר בנושא מחוללי מקורות.
crate_name
crate_name
מגדיר את המטא-נתונים של שם ה-crate באמצעות הדגל rustc
--crate_name
. במודולים שמייצרים ספריות, חובה שהשם יתאים לשם ה-crate הצפוי שמשמש במקור. לדוגמה, אם יש הפניה למודול libfoo_bar
בקוד המקור בתור extern crate foo_bar
, אז חובה להגדיר את crate_name: "foo_bar".
המאפיין הזה משותף לכל מודולי rust_*
, אבל הוא נדרש למודולים שמפיקים ספריות Rust (כמו rust_library
, rust_ffi
, rust_bindgen
, rust_protobuf
ו-rust_proc_macro
). המודולים האלה אוכפים דרישות של rustc
לגבי הקשר בין crate_name
לבין שם קובץ הפלט. מידע נוסף זמין בקטע Library Modules.
lints
rustc linter מופעל כברירת מחדל לכל סוגי המודולים, למעט מחוללי מקורות. חלק מהגדרות ה-lint מוגדרות ומשמשות לאימות המקור של המודול. הערכים האפשריים של קבוצות כאלה של בדיקות Lint הם:
default
קבוצת ברירת המחדל של בדיקות ה-lint, בהתאם למיקום המודול-
android
קבוצת ה-lint הכי מחמירה שחלה על כל הקוד של פלטפורמת Android -
vendor
קבוצה רגועה של בדיקות Lint שמוחלות על קוד הספק -
none
כדי להתעלם מכל האזהרות והשגיאות של Lint
clippy_lints
כלי ה-linter של Clippy מופעל כברירת מחדל גם לכל סוגי המודולים, למעט מחוללי מקורות. מוגדרות כמה קבוצות של בדיקות Lint, שמשמשות לאימות המקור של המודול. אלה כמה ערכים אפשריים:
- קבוצת ברירת המחדל של בדיקות Lint, בהתאם למיקום המודול
default
-
android
קבוצת ה-lint הכי מחמירה שחלה על כל הקוד של פלטפורמת Android -
vendor
קבוצה רגועה של בדיקות Lint שמוחלות על קוד הספק -
none
כדי להתעלם מכל האזהרות והשגיאות של Lint
מהדורה
edition
מגדיר את מהדורת Rust שבה יש להשתמש כדי לקמפל את הקוד הזה. הערך הזה דומה לגרסאות std של C ו-C++. הערכים האפשריים הם 2015
, 2018
ו-2021
(ברירת מחדל).
דיווחים
flags
: רשימת מחרוזות של דגלים להעברה אל rustc
במהלך ההידור.
ld_flags
ld-flags
: רשימת מחרוזות של דגלים להעברה ל-linker בזמן קומפילציה של המקור. הם מועברים באמצעות הדגל -C linker-args
rustc. clang
משמש כחלק הקדמי של הכלי לקישור בין דומיינים, ומפעיל את lld
לקישור בפועל.
תכונות
features
היא רשימת מחרוזות של תכונות שצריך להפעיל במהלך ההידור.
הערך הזה מועבר אל rustc על ידי --cfg 'feature="foo"'
. רוב התכונות הן מצטברות, ולכן ברוב המקרים הן כוללות את כל התכונות שנדרשות על ידי כל המודולים התלויים. עם זאת, במקרים שבהם התכונות הן בלעדיות אחת לשנייה, צריך להגדיר מודולים נוספים בכל קובצי build שמספקים תכונות סותרות.
cfgs
cfgs
: רשימת מחרוזות של דגלי cfg
שיופעלו במהלך ההידור.
הנתונים האלה מועברים אל rustc
על ידי --cfg foo
ו---cfg "fizz=buzz"
.
מערכת הבנייה מגדירה באופן אוטומטי דגלים מסוימים של cfg
במצבים מסוימים, שמפורטים בהמשך:
במודולים שנבנו כ-dylib, הערך של cfg יהיה
android_dylib
.במודולים שמשתמשים ב-VNDK, הערך של
android_vndk
cfg מוגדר. היא דומה להגדרה של__ANDROID_VNDK__
ב-C++.
רצועה
strip
קובעת אם קובץ הפלט יוסר (אם רלוונטי) ובאיזה אופן.
אם ההגדרה הזו לא מוגדרת, ברירת המחדל של מודולי המכשיר היא להסיר את כל הנתונים מלבד מידע מינימלי לניפוי באגים.
כברירת מחדל, מודולים של מארחים לא מסירים סמלים. הערכים התקפים כוללים none
כדי להשבית את ההסרה, ו-all
כדי להסיר הכול, כולל מידע על ניפוי באגים.
ערכים נוספים מופיעים בהפניה למודולים של Soong.
host_supported
במודולים של מכשירים, הפרמטר host_supported
מציין אם המודול צריך לספק גם וריאציה של המארח.
הגדרת יחסי תלות של הפרויקט בספרייה
מודולים של Rust יכולים להיות תלויים בספריות של CC ושל Rust באמצעות המאפיינים הבאים:
שם הנכס | תיאור |
---|---|
rustlibs |
רשימה של מודולים של rust_library שהם גם תלויות. מומלץ להשתמש בשיטה הזו להצהרה על יחסי תלות, כי היא מאפשרת למערכת הבנייה לבחור את הקישור המועדף. (ראו קישור לספריות Rust בהמשך) |
rlibs |
רשימה של מודולים של rust_library שצריך לקשר באופן סטטי בתור rlibs . (חשוב להשתמש בזהירות. ראו את הקטע When linking against Rust libraries בהמשך). |
shared_libs |
רשימה של מודולים cc_library שצריכים להיות מקושרים באופן דינמי כספריות משותפות. |
static_libs |
רשימה של מודולים של cc_library שצריך לקשר באופן סטטי כספריות סטטיות. |
whole_static_libs |
רשימה של מודולים cc_library שצריך לקשר באופן סטטי כספריות סטטיות ולכלול אותם בשלמות בספרייה שמתקבלת. עבור וריאציות של rust_ffi_static , whole_static_libraries ייכלל בארכיון הסטטי של הספרייה שיתקבל. במקרה של וריאציות של rust_library_rlib , ספריות whole_static_libraries ייכללו בספרייה rlib שמתקבלת.
|
כשמקשרים לספריות Rust, מומלץ לעשות זאת באמצעות המאפיין rustlibs
ולא באמצעות rlibs
או dylibs
, אלא אם יש סיבה ספציפית לעשות זאת. כך מערכת ה-Build יכולה לבחור את הקישור הנכון על סמך מה שנדרש למודול הבסיסי, והסיכוי שבעץ התלות יהיו גם גרסאות rlib
וגם גרסאות dylib
של ספרייה (מה שיגרום לכשל בהידור) קטן יותר.
תכונות שלא נתמכות ותכונות עם תמיכה מוגבלת
Rust של Soong מציע תמיכה מוגבלת בתמונות ובצילומים של vendor
ושל vendor_ramdisk
. עם זאת, יש תמיכה ב-staticlibs
, cdylibs
, rlibs
ו-binaries
. לגבי יעדי בניית תמונות של ספקים, המאפיין android_vndk
cfg
מוגדר. אפשר להשתמש בערך הזה בקוד אם יש הבדלים בין יעדי המערכת ליעדי הספק. rust_proc_macros
לא נכללים בצילומי מצב של ספקים. אם אתם מסתמכים על נתונים כאלה, הקפידו להשתמש בבקרת גרסאות מתאימה.
אין תמיכה בתמונות של מוצרים, VNDK ושיחזור.
גרסאות build מצטברות
מפתחים יכולים להפעיל את ההידור המצטבר של מקור Rust על ידי הגדרת משתנה הסביבה SOONG_RUSTC_INCREMENTAL
לערך true
.
אזהרה: אין ערובה לכך שיתקבלו קבצים בינאריים זהים לאלה שנוצרו על ידי buildbots. הכתובות של פונקציות או נתונים שכלולים בקובצי האובייקט עשויות להיות שונות. כדי לוודא שהארטיפקטים שנוצרו זהים ב-100% לאלה שנבנו על ידי התשתית של EngProd, לא מגדירים את הערך הזה.