ÖNEMLİ: Bu eğitim, eski makrolar içindir. Yalnızca Bazel 8 veya sonraki sürümleri desteklemeniz gerekiyorsa bunun yerine sembolik makrolar kullanmanızı öneririz. Sembolik Makro Oluşturma başlıklı makaleyi inceleyin.
Derleme işleminiz kapsamında bir araç çalıştırmanız gerektiğini varsayalım. Ö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 eski 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 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],
# Note that the line below will fail if `src` is not a filename string
outs = ["small_" + src],
cmd = "convert $< -resize " + size + " $@",
**kwargs
)
Birkaç açıklama:
Eski makrolar, kurallar gibi
name
bağımsız değişkenine sahiptir.Eski bir makronun davranışını belgelemek için Python'da olduğu gibi docstring kullanın.
genrule
veya başka bir yerel kuralı çağırmak için ön ek olaraknative.
kullanın.Ek bağımsız değişkenleri temel
genrule
işlevine iletmek için**kwargs
kullanın (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"],
)
Son olarak, uyarı notu: Makro, src
değerinin bir dosya adı dizesi olduğunu varsayar (aksi takdirde outs = ["small_" + src]
başarısız olur). src = "image.png"
işe yarar. Ancak BUILD
dosyası yerine src =
"//other/package:image.png"
veya hatta src = select(...)
kullanılsa ne olur?
Bu tür varsayımların makronuzun dokümanlarında belirtildiğinden emin olmalısınız. Maalesef eski makrolar (özellikle büyük olanlar) genellikle hassastır. Bunun nedeni, kodunuzdaki bu tür tüm varsayımları fark edip belgelemenin zor olması ve elbette makronun bazı kullanıcılarının dokümanları okumamasıdır. Mümkünse bunun yerine, özellik türleriyle ilgili yerleşik kontrollere sahip sembolik makrolar kullanmanızı öneririz.