BazelCon 2022 מגיע בין 16 ל-17 בנובמבר לניו יורק באינטרנט.
הירשמו עוד היום!

"Make" משתנים

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

"Make" משתנים הם מחלקה מיוחדת של משתני מחרוזת ניתנים להרחבה הזמינים למאפיינים המסומנים כ-"Subject to 'Make variable' replace&&; .

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

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

הסיבה למונח "Make" היא היסטורית: התחביר והסמנטיקה של המשתנים האלה נועדו במקור להתאים ל-GNU Make .

שימוש

מאפיינים שמסומנים כ- "Subject & &339;Make variable&&39;

my_attr = "prefix $(FOO) suffix"

במילים אחרות, כל מחרוזת משנה התואמת ל-$(FOO) תורחב לערך FOO&339. אם הערך הוא "bar", המחרוזת הסופית תהפוך ל:

my_attr = "prefix bar suffix"

אם FOO לא תואם למשתנה הידוע ביעד הצורך, ה-Bazel נכשל עם שגיאה.

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

my_attr = "prefix $@ suffix"

כדי לכתוב $ כליטרל של מחרוזת (כלומר, למנוע הרחבה של משתנה), צריך לכתוב $$.

משתנים מוגדרים מראש

ניתן להגדיר כל אחד ממשתנים המסומנים כ- "Subject &&39;Make variable' " בכל יעד, ולציין את המשתנים שלהם.

כדי לראות את רשימת המשתנים האלה ואת הערכים שלהם עבור קבוצה נתונה של אפשרויות build, יש להריץ

bazel info --show_make_env [build options]

ולבדוק את שורות הפלט המובילות באותיות רישיות.

דוגמה למשתנים מוגדרים מראש.

משתני אפשרות של Toolchain

משתני נתיב

  • BINDIR: הבסיס של העץ הבינארי שנוצר עבור ארכיטקטורת היעד.

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

    אם רוצים להפעיל כלי מתוך genrule, הדרך המומלצת להגיע אליו היא $(execpath toolname), שבה שם הכלי חייב להיות רשום במאפיין genrule'tools.

  • GENDIR: הבסיס של עץ הקוד שנוצר עבור ארכיטקטורת היעד.

משתנים של ארכיטקטורת מחשבים

  • TARGET_CPU: ארכיטקטורה של היעד ומעבד (CPU), למשל k8.

משתני ג'אנר שהוגדרו מראש

המאפיינים הבאים זמינים באופן ספציפי למאפיין cmd של genrule

דוגמה למשתנים מוגדרים מראש של וריאציות.

  • OUTS: הרשימה outs&genrule. אם יש לך קובץ פלט אחד בלבד, אפשר גם להשתמש ב-$@.
  • SRCS: רשימת srcs של genrule (או באופן מדויק יותר: שמות הנתיבים של הקבצים המתאימים לתוויות ברשימה srcs). אם יש לך רק קובץ מקור אחד, אפשר להשתמש גם ב-$<.
  • <: SRCS, אם מדובר בקובץ יחיד. אחרת, מופעלת שגיאת build.
  • @: OUTS, אם מדובר בקובץ יחיד. אחרת, מופעלת שגיאת build.
  • RULEDIR: ספריית הפלט של היעד, כלומר הספרייה המתאימה לשם החבילה המכילה את היעד בעץ genfiles או bin. עבור //my/pkg:my_genrule, היא מסתיימת תמיד ב-my/pkg, גם אם הפלט של //my/pkg:my_genrule מתבצע בספריות משנה.

  • @D: ספריית הפלט. אם outs כולל רשומה אחת, היא תורחב לספרייה שמכילה את הקובץ הזה. אם יש לה מספר רשומות, היא תגדל לספריית הבסיס של החבילה ב #39; בעץ genfiles, גם אם כל קובצי הפלט נמצאים באותה ספריית משנה!

    הערה: יש להשתמש ב-RULEDIR מעל @D כי ל-RULEDIR יש סמנטיקה פשוטה יותר, והיא פועלת באותו אופן ללא קשר למספר קובצי הפלט.

    אם על הז'אנר ליצור קובצי ביניים זמניים (למשל כתוצאה משימוש בכלי אחר, כמו מהדר), הוא צריך לנסות לכתוב אותם בפורמט @D (עם זאת, גם על ידי /tmp ניתן לכתוב) ולהסיר אותם לפני הסיום.

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

משתני נתיב/מקור

המשתנים המוגדרים מראש execpath, execpaths, rootpath, rootpaths, location ו-locations מקבלים פרמטרים של תווית (למשל $(execpath //foo:bar)) ומחליפים את נתיבי הקבצים שמסומנים בתווית הזו.

עבור קובצי מקור, זהו הנתיב היחסי אל הרמה הבסיסית (root). לגבי קבצים שהם פלט של כללים, זהו נתיב התפוקה של הקובץ (ראה הסבר על קובצי הפלט בהמשך).

דוגמה למשתני נתיב שהוגדרו מראש.

  • execpath: מציין את הנתיב שמתחת execroot שבו מערכת Bazel מבצעת פעולות build.

    בדוגמה שלמעלה, Bazel מפעילה את כל פעולות ה-build בספרייה שמקושרת באמצעות הקישור bazel-myproject בשורש סביבת העבודה. קובץ המקור empty.source מקושר בנתיב bazel-myproject/testapp/empty.source. אם כך, נתיב ה-exec שלו (הוא נתיב המשנה שמתחת לשורש) הוא testapp/empty.source. זהו הנתיב לבניית פעולות שניתן להשתמש בו כדי למצוא את הקובץ.

    קובצי פלט מועברים באופן דומה, אבל לפנים מופיעים נתיב המשנה bazel-out/cpu-compilation_mode/bin (או לפלט מסוים: bazel-out/cpu-compilation_mode/genfiles, או לפלט של כלי המארח: bazel-out/host/bin). בדוגמה שלמעלה, //testapp:app הוא כלי אירוח כי הוא מופיע במאפיין tools של show_app_output. לכן קובץ הפלט app נכתב כך: bazel-myproject/bazel-out/host/bin/testapp/app. לכן, נתיב ה-exec הוא bazel-out/host/bin/testapp/app. הקידומת הנוספת הזו מאפשרת לבנות את אותו יעד, למשל, בשני מעבדים שונים (CPU) באותו בניין, בלי התוצאות.

    התווית שהועברה למשתנה זה חייבת לייצג קובץ אחד בדיוק. כשמדובר בתוויות שמייצגות קובצי מקור, זה נכון באופן אוטומטי. לגבי תוויות שמייצגות כללים, הכלל חייב ליצור פלט אחד בדיוק. אם הערך שגוי או שהתווית לא תקינה, ה-build נכשל עם שגיאה.

  • rootpath: מציין את נתיב קובצי הריצה שבו קובץ בינארי מובנה יכול להשתמש כדי למצוא את תלויותיו בזמן הריצה.

    היא זהה ל-execpath אבל מסירה את קידומות הפלט שמתוארות למעלה. בדוגמה שלמעלה, empty.source וגם app משתמשים בנתיבים יחסיים של סביבת עבודה: testapp/empty.source וגם testapp/app.

    יש לה את אותן דרישות "לפלט אחד בלבד;execpath.

  • location: מילה נרדפת ל-execpath או ל-rootpath, בהתאם למאפיין המורחב. זו התנהגות מדור קודם לפני הכוכב ולא מומלץ, אלא אם באמת יודעים מה היא עושה עבור כלל מסוים. פרטים נוספים זמינים בדף #2475.

execpaths, rootpaths ו-locations הם הווריאציות של execpath, rootpath ו-location, בהתאמה. הן תומכות בתוויות שמייצרות מספר פלטים, ובמקרה כזה כל פלט רשום ומופרד באמצעות רווח. כללים של אפס פלט ותוויות שגויות מייצרים שגיאות build.

כל התוויות שיש להפנות חייבות להופיע בsrcs של קובצי היעד, קובצי הפלט או deps שצורכים. אחרת, הפרויקט ייכשל. יעדי C+ יכולים גם להתייחס לתוויות ב-data.

תוויות לא חייבות להיות בפורמט קנוני: foo, :foo ו-//somepkg:foo.

משתנים מותאמים אישית

אפשר להפנות למשתנים מותאמים אישית& " משתנים לפי כל מאפיין שמסומן כ- "Subject &&39;Make variable&&39;

כשיטה מומלצת, כל המשתנים צריכים להיות מותאמים אישית, אלא אם יש סיבה טובה מאוד לאפיין אותם ב-Bazel Core. האפשרות הזו מונעת מ-Bazel לטעון יחסי תלות שעלולים להיות יקרים יותר כדי לספק משתנים שצורכים טארטים שאינם מעניינים אותם.

משתנים של כלי +C+

הכללים הבאים מוגדרים בכללי C+chainin וזמינים לכל כלל שמגדיר את toolchains = ["@bazel_tools//tools/cpp:current_cc_toolchain"] (או "@bazel_tools//tools/cpp:current_cc_host_toolchain" המקבילה לרכיב הכלים של המארח). חלק מהכללים, כמו java_binary, כוללים באופן לא מפורש את שרשרת הכלים C++ בהגדרת הכלל שלהם. הם יורשים את המשתנים האלה באופן אוטומטי.

הכללים המובנים של C++ הרבה יותר מתוחכמים מ-&quot, יש להריץ עליהם את המהדר . כדי לתמוך במצבי הידור מגוונים כמו *SAN, ThinLTO, עם או בלי מודולים, ובינאריים קפדניים בו-זמנית עם בדיקות ריצה מהירות בפלטפורמות מרובות, הכללים המובנים עוברים באורכים ארוכים כדי לוודא שהקלט הנכון, הפלט והסימונים בשורת הפקודה מוגדרים בכל אחת מהפעולות האפשריות הפנימיות.

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

  • ABI: גרסת ה-ABI של C++.
  • AR: הפקודה "ar&PLURAL; מכלי הצלבת.
  • C_COMPILER: מזהה המהדר +C/C, למשל llvm
  • CC: פקודת המהדר C ו-C++.

    מומלץ מאוד להשתמש תמיד ב-CC_FLAGS בשילוב עם CC. הניסיון לעשות זאת אינו באחריותך הבלעדית.

  • CC_FLAGS: קבוצה של סימונים מינימליים עבור המהדר C/C++ שניתן יהיה להשתמש בו על ידי כללי Google. באופן ספציפי, הסימונים האלה כוללים בחירה של הארכיטקטורה הנכונה אם CC תומך בארכיטקטורות מרובות.
  • NM: הפקודה "nm" מכלי העריכה.
  • OBJCOPY: פקודת objcopy מאותה סוויטה כמו המהדר C/C++.
  • STRIP: פקודת הרצועה מאותה סוויטה כמו המהדר C/C++.

משתנים של ארגז כלים של Java

הערכים הבאים מוגדרים בכללי Java Toolchain ב-Java וזמינים לכל כלל שמגדיר את toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"] (או "@bazel_tools//tools/jdk:current_host_java_runtime" המקבילה לרכיב הכלים של המארח).

אסור להשתמש ברוב הכלים ב-JDK ישירות. הכללים המובנים של Java מתבססים על גישות מתוחכמות יותר של הידור והידור של Java בהשוואה לכלים מסוג Upstream, כגון ממשק צנצנות, ממשק כותרת צנצנות והטמעות של מיזוג ואריזה ב-JER.

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

  • JAVA: הפקודה "JavaScript" (מכונה וירטואלית של Java). יש להימנע מכך, ולהשתמש במקום זאת בכלל java_binary כאשר הדבר אפשרי. ייתכן שהוא נתיב יחסי. אם צריך לשנות ספריות לפני שמפעילים את java, צריך לתעד את הספרייה הפעילה לפני שמשנים אותה.
  • JAVABASE: ספריית הבסיס שמכילה את כלי התשתיות Java. ייתכן שהוא נתיב יחסי. יש בו ספריית משנה & " ;

משתנים בהגדרת הכוכב

כותבי כללים ו-toolschain יכולים להגדיר משתנים מותאמים אישית לחלוטין על ידי החזרת ספק templateVariableInfo. כללים בהתאם לכללים אלה דרך המאפיין toolchains יכולים לקרוא את הערכים שלהם:

דוגמה למשתנים שמוגדרים על ידי Starlark.