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
namebağımsız değişkenine sahiptir.Bir makronun davranışını belgelemek için Python'daki gibi docstring kullanın.
genruleveya 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**kwargskullanın (Python'daki gibi çalışır). Bu, kullanıcılarınvisibilityveyatagsgibi 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"],
)