Derlemenizin bir parçası olarak bir aracı çalıştırmanız gerektiğini düşünün. Örneğin, bir kaynak dosyası oluşturmak veya önceden işlemek ya da bir ikili dosyayı sıkıştırmak isteyebilirsiniz. Bu eğitimde, bir resmi yeniden boyutlandıran bir makro oluşturacaksınız.
Makrolar basit görevler için uygundur. Daha karmaşık işlemler yapmak istiyorsanız (ör. yeni bir programlama dili için destek eklemek) kural oluşturmayı düşünebilirsiniz. Kurallar, daha fazla kontrol ve esneklik sağlar.
Bir görüntüyü 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 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ç not:
Kural olarak, makrolar da kurallar gibi
name
bağımsız değişkenine sahiptir.Bir makronun davranışını belgelemek için Python'daki gibi docstring kullanın.
genrule
veya başka bir yerel kuralı çağırmak içinnative.
kullanın.Ek bağımsız değişkenleri temel alınan
genrule
'e iletmek için**kwargs
kullanın (Python'daki gibi çalışır). Bu, kullanıcılarınvisibility
veyatags
gibi standart özellikleri kullanabilmesi için yararlıdır.
Ş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"],
)