Derleme işleminiz kapsamında bir araç çalıştırmanız gerektiğini varsayalım. Örneğin, bir kaynak dosya oluşturmak veya ön işlemesini yapmak ya da bir ikili programı sıkıştırmak isteyebilir. Bu eğitimde, bir resmin boyutunu değiştiren bir 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 resmin boyutunu değiştiren bir 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 gerekiyorsa kodu yeniden kullanabilirsiniz. Bunu yapmak için ayrı bir .bzl
dosyasında bir işlev tanımlayın ve dosyayı miniature.bzl
olarak adlandı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ç açıklama:
Kurallara benzer şekilde, makrolar da
name
bağımsız değişkenine sahiptir.Bir makronun davranışını belgelemek için Python'da olduğu gibi docstring kullanın.
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
işlevine iletmek için**kwargs
kullanın (tıpkı Python'da olduğu gibi çalışır). Bu, kullanıcılarınvisibility
veyatags
gibi standart özellikleri kullanabilmesi için kullanışlıdır.
Ardından, BUILD
dosyasında bulunan 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"],
)