تصور کنید که باید ابزاری را به عنوان بخشی از ساخت خود اجرا کنید. به عنوان مثال، ممکن است بخواهید یک فایل منبع تولید یا پیش پردازش کنید، یا یک فایل باینری را فشرده کنید. در این آموزش قصد دارید یک ماکرو ایجاد کنید که اندازه یک تصویر را تغییر می دهد.
ماکروها برای کارهای ساده مناسب هستند. اگر میخواهید کار پیچیدهتری انجام دهید، به عنوان مثال، پشتیبانی از یک زبان برنامهنویسی جدید را اضافه کنید، یک قانون ایجاد کنید. قوانین به شما کنترل و انعطاف بیشتری می دهد.
ساده ترین راه برای ایجاد یک ماکرو که اندازه یک تصویر را تغییر می دهد، استفاده از یک 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"],
)