באופן כללי, הגדרות המודול של rust_*
תואמות מאוד לשימוש ולציפיות של cc_*
. זו דוגמה להגדרת מודול לקובץ בינארי של Rust:
rust_binary {
name: "hello_rust",
crate_name: "hello_rust",
srcs: ["src/hello_rust.rs"],
host_supported: true,
}
בדף הזה מפורטים המאפיינים הנפוצים ביותר של מודולים של rust_*
. למידע נוסף על סוגי מודולים ספציפיים ועל הגדרות לדוגמה של מודולים, ראו מודולים בינאריים, מודולים של ספריות או מודולים לבדיקה.
סוגי מודולים בסיסיים
סוג | הגדרה | למידע נוסף |
---|---|---|
rust_binary | קובץ בינארי של Rust | מודולים בינאריים דף |
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 | יצירת קובץ בינארי של fuzz ב-Rust שמשתמש ב-libfuzzer . |
דוגמה למודול rust_fuzz |
rust_protobuf | יוצר מקור ומייצר חלודה שמספקת ממשק ל-protobuf מסוים. | הדפים Protobufs Modules ו-Source Generator |
rust_bindgen | יוצר את המקור ספריית חלודה שמכילה קישורי חלודה לספריות C. | מודולים של קישור Bindgen והדפים מחוללי מקור |
מאפיינים נפוצים וחשובים
המאפיינים האלה נפוצים בכל חלודה ב-Android מודולים. נכסים נוספים (ייחודיים) שמשויכים למודולים נפרדים של Rust מפורטים בדף של אותו מודול.
שם
name
הוא השם של המודול. כמו מודולים אחרים של Soong, השם הזה צריך להיות ייחודי ברוב סוגי המודולים של Android.bp
. כברירת מחדל, הפלט הוא name
.
[שם הקובץ]. אם שם קובץ הפלט חייב להיות שונה משם המודול, משתמשים ברכיב
stem
כדי להגדיר אותו.
גבעול
stem
(אופציונלי) מאפשר שליטה ישירה על שם קובץ הפלט (לא כולל סיומת הקובץ וסיומת אחרות). לדוגמה, rust_library_rlib
עם ערך גזע של libfoo
נוצר קובץ libfoo.rlib
. אם לא תספקו ערך למאפיין stem
, שם קובץ הפלט יהיה שם המודול כברירת מחדל.
משתמשים בפונקציה stem
כשאי אפשר להגדיר את שם המודול בתור שם הקובץ הרצוי של הפלט. לדוגמה, ה-rust_library
של תיבת ה-crate 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
. במודולים שמפיקים ספריות, השם הזה חייב להתאים לשם הצ'רטה הצפוי שמשמש במקור. לדוגמה, אם יש הפניה למודול 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
לשם הקובץ של הפלט. מידע נוסף זמין במאמר
מודולים של ספרייה
.
שגיאות בקוד
כברירת מחדל, rustc linter פועל בכל סוגי המודולים, מלבד גנרטורים של מקורות קוד. חלק מקבוצות השגיאות בקוד מוגדרות ומשמשות לאימות מקור המודול. ערכים אפשריים לאיתור שגיאות כזה הן:
default
קבוצת ברירת המחדל של בדיקות איתור שגיאות בקוד, בהתאם למיקום המודולandroid
קבוצת ה-lint המחמירה ביותר שחלה על כל הקוד בפלטפורמת Androidvendor
קבוצה פחות מחמירה של בדיקות איתור שגיאות בקוד (lint) שחלות על קוד של ספקיםnone
כדי להתעלם מכל האזהרות והשגיאות של איתור שגיאות בקוד
שגיאות קליפים
גם החיפושית החיצונית מופעלת כברירת מחדל לכל סוגי המודולים מלבד מחוללי מקור. מוגדרות כמה קבוצות של בדיקות איתור שגיאות בקוד (lints) שמשמשות לאימות מקור המודול. אלה כמה ערכים אפשריים:
default
קבוצת ברירת המחדל של בדיקות איתור שגיאות בקוד, בהתאם למיקום המודולandroid
קבוצת ה-lint המחמירה ביותר שחלה על כל הקוד בפלטפורמת Androidvendor
קבוצה פחות מחמירה של בדיקות איתור שגיאות בקוד (lint) שחלות על קוד של ספקיםnone
כדי להתעלם מכל האזהרות והשגיאות של איתור שגיאות בקוד
מהדורה
edition
מגדיר את מהדורת Rust שבה יש להשתמש כדי לקמפל את הקוד הזה. הדבר דומה לגרסאות std של C ו-C++. ערכים חוקיים
הם 2015
ו-2018
(ברירת המחדל).
דגלים
flags
מכילה רשימת מחרוזות של דגלים שצריך להעביר ל-rustc
במהלך הידור.
ld_flags
ld-flags
מכיל רשימת מחרוזות של דגלים שצריך להעביר למקשר בזמן הידור המקור. הם מועברים באמצעות דגל החלודה -C linker-args
. clang
משמש כחזית של הקישור, ומפעיל את lld
לצורך הקישור בפועל.
תכונות
features
היא רשימת מחרוזות של תכונות שצריך להפעיל במהלך הידור.
הערך מועבר לחלודה על ידי --cfg 'feature="foo"'
. רוב התכונות הן נוספות,
לכן, במקרים רבים התהליך הזה כולל את כל התכונות שנדרשות על ידי כל התוכנות התלויות
מודולים. עם זאת, במקרים שבהם תכונות הן בלעדיות זו לזו, צריך להגדיר מודולים נוספים בכל קובץ build שמספק תכונות סותרות.
cfgs
cfgs
מכיל רשימת מחרוזות של דגלים cfg
שיופעלו במהלך ההידור.
סכום זה מועבר אל rustc
על ידי --cfg foo
ועל --cfg "fizz=buzz"
.
מערכת ה-build מגדירה באופן אוטומטי סימונים מסוימים של cfg
באופן ספציפי
במצבים הבאים:
למודולים שנוצרו כדי דיליב, תוגדר ה-cfg
android_dylib
.במודולים שישתמשו ב-VNDK תהיה הגדרת cfg של
android_vndk
. הדבר דומה ל-__ANDROID_VNDK__
עבור C++.
רצועה
strip
קובע אם קובץ הפלט יוסר ובאיזה אופן (אם רלוונטי).
אם המדיניות הזו לא מוגדרת, המודולים של המכשיר מסירים כברירת מחדל את כל הנתונים חוץ ממידע מיני על תוצאות ניפוי הבאגים.
כברירת מחדל, מודולים מארחים לא מסירים סמלים. הערכים החוקיים כוללים את הערך none
כדי להשבית את הסרת הקוד, ואת הערך all
כדי להסיר את הכול, כולל את mini debuginfo.
ערכים נוספים מופיעים בחומר העזר בנושא מודולים של Soong.
Host_supported
במודולים של מכשירים, הפרמטר host_supported
מציין אם המודול צריך לספק גם וריאנט מארח.
הגדרת יחסי תלות בספרייה
מודולים של Rust יכולים להסתמך גם על ספריות CC וגם על ספריות Rust באמצעות המאפיינים הבאים:
שם הנכס | תיאור |
---|---|
rustlibs |
רשימה של מודולים של rust_library שגם הם תלויים במודול. מומלץ להשתמש באפשרות הזו כדי להצהיר על יחסי תלות, כי היא מאפשרת למערכת ה-build לבחור את הקישור המועדף. (ראו כשמקשרים לספריות Rust בהמשך) |
rlibs |
רשימה של rust_library מודולים שצריך לקשר באופן סטטי
בתור rlibs . (יש להשתמש בזה בזהירות. למידע נוסף, ראו כשמקשרים לספריות של Rust בהמשך). |
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
של הספרייה (מצב שגורם לכשל בתהליך ה-compilation).
תכונות build לא נתמכות ומוגבלות לתמיכה
ב-Rust של Soong יש תמיכה מוגבלת בתמונות ובקובצי snapshot של vendor
ו-vendor_ramdisk
. עם זאת, יש תמיכה ב-staticlibs
, ב-cdylibs
, ב-rlibs
וב-binaries
. ביעדים של build של קובצי אימג' של ספקים, הנכס android_vndk
cfg
מוגדר. אפשר להשתמש בו בקוד אם יש
הבדלים בין יעדי המערכת ליעדי הספק. rust_proc_macros
לא מתועדים כחלק מתמונות מצב של ספקים. אם יש לכם תלות בנתונים האלה, חשוב לוודא שאתם מבצעים בקרת גרסאות עליהם בצורה מתאימה.
אין תמיכה בתמונות של מוצרים, ב-VNDK ובתמונות שחזור.
גרסאות build מצטברות
מפתחים יכולים להפעיל את הידור המקור המצטבר של Rust על ידי הגדרת משתנה הסביבה SOONG_RUSTC_INCREMENTAL
לערך true
.
אזהרה: לא בטוח שהפעולה הזו תיצור קבצים בינאריים שזהים לאלו שנוצר על ידי buildbots. הכתובות של הפונקציות או הנתונים שכלולים קובצי האובייקט עשויים להיות שונים. כדי לוודא שכל פריטי המידע שנוצרו בתהליך הפיתוח (Artifact) שנוצרו עומדים על 100% זהה לגרסאות שפותחו על ידי התשתית EngProd, צריך להשאיר את הערך הזה לא מוגדר.