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