מערכת Soong Build

לפני שחרורו 7.0 אנדרואיד, אנדרואיד בשימוש הפוך GNU בלעדי לתאר ולבצע הכללים הלבנים שלה. מערכת ה- Build build נתמכת בשימוש נרחב, אך בקנה מידה של אנדרואיד הפכה לאיטית, מועדת לשגיאות, בלתי ניתנת להרחבה וקשה לבדיקה. מערכת לבנות סונג מספקת את הגמישות הנדרשת עבור אנדרואיד בונה.

מסיבה זו, מפתחי הפלטפורמות צפויים לעבור מ- Make ולאמץ את Soong בהקדם האפשרי. שלח שאלות אל android-בונה קבוצת Google כדי לקבל תמיכה.

מהו סונג?

מערכת לבנות סונג הוצג בשנת אנדרואיד 7.0 (נוגט) להחליף הפוך. זה ממנף את קטי GNU הפוך שיבוט כלי Ninja רכיב במערכת לבנות להאיץ בונה של אנדרואיד.

עיין מערכת אנדרואיד להפוך לבנות תיאור של פרויקט הקוד הפתוח אנדרואיד (AOSP) עבור הכללית ההוראות ואת בנה שינויים במערכת עבור הסופרים Android.mk ללמוד על השינויים הדרושים כדי להתאים מן הפוך לסונג.

ראה ערכים הקשורים לבנות במילון הגדרות של מונחי מפתח ואת קבצי הפנית סונג לקבלת פרטים מלאים.

השוואה בין Make and Soong

הנה השוואה של תצורה הפוך עם סונג להשיג אותו בתצורת סונג (Blueprint או .bp ) קובץ.

תן דוגמא

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

דוגמא מאוד

cc_library_shared {
     name: “libxmlrpc++”,

     rtti: true,
     cppflags: [
           “-Wall”,
           “-Werror”,
           “-fexceptions”,
     ],
     export_include_dirs: [“src”],
     srcs: [“src/**/*.cpp”],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

ראה תצורת לבנות סוכות פשוטות עבור דוגמאות תצורת מבחן ספציפי סונג.

פורמט קובץ Android.bp

לפי התכנון, Android.bp קבצים פשוטים. הם אינם מכילים תנאים או הצהרות זרימת בקרה; כל המורכבות מטופלת על ידי היגיון בנייה שנכתב ב- Go. במידת האפשר, תחביר וסמנטיקה של Android.bp קבצים דומים קבצים BUILD בזל .

מודולים

מודול בתוך 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>" .

לקבלת רשימה של סוגי מודול תקף ותכונותיהם, לראות את הפנייה מודולים סונג .

סוגים

משתנים ומאפיינים מודפסים היטב, כאשר משתנים מבוססים באופן דינמי על ההקצאה הראשונה ומאפיינים שנקבעים באופן סטטי לפי סוג המודול. הסוגים הנתמכים הם:

  • Booleans ( true או false )
  • מספרים שלמים ( int )
  • מיתרים ( "string" )
  • רשימות של מחרוזות ( ["string1", "string2"] )
  • מפות ( {key1: "value1", key2: ["value2"]} )

מפות עשויות להכיל ערכים מכל סוג שהוא, כולל מפות מקוננות. רשימות ומפות עשויות לכלול פסיקים לאחר הערך האחרון.

גלובס

מאפיינים כי לוקח רשימה של קבצים, כגון srcs , גם יכול לקחת דפוסי גוש. דפוסי גלוב יכול להכיל את כלליים UNIX נורמלי * למשל *.java . דפוסי גלוב יכולים להכיל גם אחד ** כללי כאלמנט נתיב, אשר תואם אפס או יותר אלמנטי נתיב. לדוגמה, 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 קבצים. במקום זאת, מורכבות בכללי בנייה הדורשים תנאי התייחסות מטופלים ב- Go, שם ניתן להשתמש בתכונות שפה ברמה גבוהה, ולעקוב אחר תלות מרומזת שהוצגה על ידי תנאים. רוב התנאים מומרים לנכס מפה, כאשר אחד הערכים במפה נבחר ומתווסף לנכסים ברמה העליונה.

לדוגמה, כדי לתמוך בקבצים ספציפיים לארכיטקטורה:

cc_library {
    ...
    srcs: ["generic.cpp"],
    arch: {
        arm: {
            srcs: ["arm.cpp"],
        },
        x86: {
            srcs: ["x86.cpp"],
        },
    },
}

פורמט

סונג כולל מעצב הקנונית עבור קבצים Blueprint, בדומה gofmt . כדי רקורסיבי לאתחל מחדש את כל Android.bp הקבצים בספרייה הנוכחית, לרוץ:

bpfmt -w .

הפורמט הקנוני כולל כניסות של ארבעה חללים, שורות חדשות אחרי כל רכיב ברשימה מרובת תאים ופסיק נגרר ברשימות ומפות.

מודולים מיוחדים

לקבוצות מודולים מיוחדות יש מאפיינים ייחודיים.

מודולים ברירת מחדל

ניתן להשתמש במודול ברירת מחדל כדי לחזור על אותם מאפיינים במספר מודולים. לדוגמה:

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

מודולים מובנים מראש

כמה סוגי מודולים מובנים מאפשרים למודול להיות בעל אותו שם כמו עמיתיו המבוססים על מקור. לדוגמה, יכול להיות cc_prebuilt_binary בשם foo כשיש כבר cc_binary עם אותו השם. זה נותן למפתחים את הגמישות לבחור איזו גרסה לכלול במוצר הסופי שלהם. אם בתצורה לבנות מכילה שני הגירסות, את prefer ערך דגל לתכתיבי הגדרת המודול המוכן מראש איזו גרסה יש עדיפות. שים לב כמה מודולים מוכנים מראש יש שמות שאינם להתחיל עם prebuilt , כגון android_app_import .

מודולים של מרחב שמות

עד אנדרואיד ממיר באופן מלא מן הפוך לסונג, תצורת המוצר הפוך חייבת לציין PRODUCT_SOONG_NAMESPACES ערך. שוויה צריך להיות רשימה מופרדת שטח של מרחבים שם כי יצוא סונג להכין להיבנות על ידי m פקוד. לאחר שההמרה של אנדרואיד ל- Soong תושלם, הפרטים של הפעלת מרחבי שמות עשויים להשתנות.

Soong מספק למודולים בספריות שונות אפשרות לציין את אותו שם, כל עוד כל מודול מוכרז במרחב שמות נפרד. ניתן להכריז על מרחב שמות כך:

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

שים לב שלמרחב שמות אין מאפיין שם; הנתיב שלו מוקצה אוטומטית כשמו.

לכל מודול Soong מוקצה מרחב שמות בהתבסס על מיקומו בעץ. כל מודול סונג נחשב במרחב השמות שהוגדרו על ידי soong_namespace נמצא בתוך Android.bp קובץ בתיקיה הנוכחית או מדריך הקדמון הקרוב. אם אין כזה soong_namespace מודול נמצא, מודול נחשב במרחב שמות השורש מהרומזים.

להלן דוגמה: ניסיונות רבים לפתור תלות D המוצהרת על ידי מודול M במרחב שמות N המייבא מרחבי שמות I1, I2, I3 ...

  1. אז אם D הוא שם מלא של הטופס //namespace:module , רק השמות שצוינו הוא חפשו שם המודול שצוין.
  2. אחרת, Soong תחפש תחילה מודול בשם D המוצהר במרחב השמות N.
  3. אם מודול זה אינו קיים, Soong מחפש מודול בשם D במרחבי שמות I1, I2, I3 ...
  4. לבסוף, Soong מסתכל במרחב השמות של השורש.