יצירת מאקרו

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

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

הדרך הקלה ביותר ליצור מאקרו שמשנה גודל של תמונה היא להשתמש ב-genrule:

genrule(
    name = "logo_miniature",
    srcs = ["logo.png"],
    outs = ["small_logo.png"],
    cmd = "convert $< -resize 100x100 $@",
)

cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    data = [":logo_miniature"],
)

אם תצטרך לשנות את הגודל של תמונות נוספות, מומלץ להשתמש שוב בקוד. לשם כך, יש להגדיר פונקציה בקובץ .bzl נפרד, ולקרוא לקובץ miniature.bzl:

def miniature(name, src, size="100x100", **kwargs):
  """Create a miniature of the src image.

  The generated file is prefixed with 'small_'.
  """
  native.genrule(
    name = name,
    srcs = [src],
    outs = ["small_" + src],
    cmd = "convert $< -resize " + size + " $@",
    **kwargs
  )

מספר הערות:

  • כמקובל, פקודות מאקרו כוללות ארגומנט של name, בדיוק כמו כללים.

  • כדי לתעד את ההתנהגות של מאקרו, השתמשו ב-docstring כמו ב-Python.

  • כדי להתקשר אל genrule, או לכל כלל מקומי אחר, יש להשתמש ב-native..

  • יש להשתמש ב-**kwargs כדי להעביר את הארגומנטים הנוספים ל-genrule הבסיסי (הוא פועל בדיוק כמו ב-Python). זה שימושי, כך שמשתמשים יכולים להשתמש במאפיינים רגילים כמו visibility, או tags.

כעת, השתמש במאקרו מהקובץ BUILD:

load("//path/to:miniature.bzl", "miniature")

miniature(
    name = "logo_miniature",
    src = "image.png",
)

cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    data = [":logo_miniature"],
)