קבצים מסוג Android.bp
פשוטים מטבעם. הם לא מכילים תנאים או הצהרות לזרימת בקרה. כל המורכבות מטופלת על ידי לוגיקה של build שנכתבה ב-Go. כשהדבר אפשרי, התחביר והסמנטיקה של קובצי Android.bp
דומים לקובצי BUILD של Bazel.
מודולים
מודול בקובץ Android.bp
מתחיל בסוג המודול, ואחריו קבוצה של מאפיינים בפורמט name: "value",
:
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
לכל מודול צריך להיות מאפיין name
, והערך שלו חייב להיות ייחודי בכל קובצי Android.bp
, מלבד ערכי המאפיינים של name
במרחבי שמות ובמודולים מוכנים מראש, שעשויים לחזור על עצמם.
המאפיין srcs
מציין את קובצי המקור ששימשו ליצירת המודול, כרשימת מחרוזות. אפשר להפנות לפלט של מודולים אחרים שיוצרים קובצי מקור, כמו genrule
או filegroup
, באמצעות התחביר של הפניה למודול ":<module-name>"
.
בחומר העזר בנושא מודולים של Soong תוכלו למצוא רשימה של סוגי מודולים תקינים והמאפיינים שלהם.
סוגים
למשתנים ולמאפיינים יש סוג מוגדר, והמשתנים מבוססים באופן דינמי על ההקצאה הראשונה, והמאפיינים מוגדרים באופן סטטי לפי סוג המודול. הסוגים הנתמכים הם:
- ערכים בוליאניים (
true
אוfalse
) - מספרים שלמים (
int
) - מחרוזות (
"string"
) - רשימות של מחרוזות (
["string1", "string2"]
) - מפות (
{key1: "value1", key2: ["value2"]}
)
מפות Google עשויות להכיל ערכים מכל סוג, כולל מפות מקוננות. ברשימות ובמפות יכולים להיות פסיקים בסוף הערך אחרי הערך האחרון.
כדורים
נכסים שמקבלים רשימת קבצים, כמו srcs
, יכולים לקבל גם דפוסי glob. דפוסי Glob יכולים להכיל את התו הכללי לחיפוש ב-UNIX *
, לדוגמה *.java
. דפוסי Glob יכולים להכיל גם תווים כלליים **
יחידים כרכיב נתיב, שתואמים לאפס או יותר רכיבי נתיב. לדוגמה, java/**/*.java
תואם גם לתבניות java/Main.java
וגם ל-java/com/android/Main.java
.
משתנים
קובץ Android.bp
יכול להכיל הקצאות משתנים ברמה העליונה:
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
ההיקף של המשתנים הוא שאר הקובץ שבו הם הוגדרו, וגם כל קובץ צאצא של Blueprint. משתנים הם בלתי ניתנים לשינוי, מלבד חריג אחד: אפשר לצרף אליהם הקצאה של +=
, אבל רק לפני שהם הוזכרו.
תגובות
קבצים מסוג Android.bp
יכולים להכיל תגובות /* */
מרובות שורות בסגנון C ותגובות //
בשורה אחת בסגנון C++.
מפעילים
אפשר לצרף מחרוזות, רשימות של מחרוזות ומפות באמצעות האופרטור +.
אפשר לסכם מספרים שלמים באמצעות האופרטור +
. הוספת מפה יוצרת את האיחוד של המפתחות בשתי המפות, ומצרפת את הערכים של כל המפתחות שנמצאים בשתי המפות.
תנאים
אין תמיכה בתנאי בקובצי Android.bp
ב-Soong. במקום זאת, מורכבות של כללי build שדורשת תנאים מותנים מטופלת ב-Go, שבו אפשר להשתמש בתכונות שפה ברמה גבוהה ולעקוב אחרי יחסי תלות משתמעים שנוצרים על ידי תנאים מותנים. רוב התנאים המותנים מומרים לנכס מפה, שבו אחד מהערכים במפה נבחר ומצורף לנכסים ברמה העליונה.
לדוגמה, כדי לתמוך בקבצים ספציפיים לארכיטקטורה:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
פורמטטור
Soong כולל פורמט קנוני לקובצי Blueprint, בדומה ל-gofmt. כדי לעצב מחדש באופן רקורסיבי את כל קובצי Android.bp
בספרייה הנוכחית, מריצים את הפקודה:
bpfmt -w .
הפורמט הקנוני כולל הכנסות של ארבעה רווחים, שורות חדשות אחרי כל רכיב ברשימת רכיבים מרובים, ופסיק בסוף ברשימות ובמפות.