ایجاد یک ماکرو

تصور کنید که باید ابزاری را به عنوان بخشی از ساخت خود اجرا کنید. به عنوان مثال، ممکن است بخواهید یک فایل منبع تولید یا پیش پردازش کنید، یا یک فایل باینری را فشرده کنید. در این آموزش قصد دارید یک ماکرو ایجاد کنید که اندازه یک تصویر را تغییر می دهد.

ماکروها برای کارهای ساده مناسب هستند. اگر می‌خواهید کار پیچیده‌تری انجام دهید، به عنوان مثال، پشتیبانی از یک زبان برنامه‌نویسی جدید را اضافه کنید، یک قانون ایجاد کنید. قوانین به شما کنترل و انعطاف بیشتری می دهد.

ساده ترین راه برای ایجاد یک ماکرو که اندازه یک تصویر را تغییر می دهد، استفاده از یک 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 مانند پایتون استفاده کنید.

  • برای فراخوانی یک genrule یا هر قانون بومی دیگری، از native. .

  • از **kwargs برای ارسال آرگومان های اضافی به genrule اصلی استفاده کنید (درست مانند پایتون کار می کند). این مفید است، به طوری که کاربر می تواند از ویژگی های استاندارد مانند 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"],
)