Derlemenizin parçası olarak bir araç çalıştırmanız gerektiğini hayal edin. Örneğin, bir kaynak dosya oluşturmak veya önceden işlemek ya da bir ikili dosyayı sıkıştırmak isteyebilirsiniz. Bu eğitimde, bir resmin boyutunu değiştiren bir makro oluşturacaksınız.
Makrolar basit görevler için uygundur. Daha karmaşık bir işlem yapmak istiyorsanız (ör. yeni bir programlama dili için destek eklemek) kural oluşturabilirsiniz. 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 gerekiyorsa kodu yeniden kullanabilirsiniz. Bunu yapmak için ayrı bir .bzl
dosyasında bir işlev tanımlayın ve 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 bulunur.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.
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ınınvisibility
veyatags
gibi standart özellikleri kullanabilmesi için yararlı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"],
)