Derlemenizin parçası olarak bir araç çalıştırmanız gerektiğini hayal edin. Örneğin, bir kaynak dosya oluşturmak veya ön işlemesini yapmak ya da bir ikili programı sıkıştırmak isteyebilir. Burada eğiticide, bir resmi yeniden boyutlandıran makro oluşturacaksınız.
Makrolar basit görevler için uygundur. Başka bir şey yapmak isterseniz Örneğin, yeni bir programlama dili desteği eklemek, yeni bir Bir kural oluşturarak. Kurallar size daha fazla kontrol ve esneklik sağlar.
Bir resmi yeniden boyutlandıran makro oluşturmanın en kolay yolu genrule
kullanmaktır:
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"],
)
Daha fazla resmi yeniden boyutlandırmanız gerekirse kodu yeniden kullanabilirsiniz. Bunu yapmak için
ayrı bir .bzl
dosyasında bir işlev tanımlayıp miniature.bzl
dosyasını çağırın:
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
)
Birkaç hatırlatma:
Kural olarak, makrolarda da kurallar gibi bir
name
bağımsız değişkeni vardır.Bir makronun davranışını belgelemek için docstring yapar.
Bir
genrule
veya başka bir yerel kuralı çağırmak içinnative.
işlevini kullanın.Ek bağımsız değişkenleri temel
genrule
öğesine yönlendirmek için**kwargs
kullanın (tıpkı Python'da olduğu gibi çalışır). Bu, kullanıcınınvisibility
, veyatags
.
Şimdi, BUILD
dosyasındaki makroyu kullanın:
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"],
)