ÖNEMLİ: Bu eğitim, Bazel 8'de kullanıma sunulan yeni makro sistemi olan sembolik makrolar içindir. Eski Bazel sürümlerini desteklemeniz gerekiyorsa bunun yerine bir eski makro yazmanız gerekir. Eski Makro Oluşturma başlıklı makaleyi inceleyin.
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 görüntüyü yeniden boyutlandıran sembolik 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 uygulama işlevi ve makro bildirimi tanımlayın ve dosyayı miniature.bzl
olarak adlandırın:
# Implementation function
def _miniature_impl(name, visibility, src, size, **kwargs):
native.genrule(
name = name,
visibility = visibility,
srcs = [src],
outs = [name + "_small_" + src.name],
cmd = "convert $< -resize " + size + " $@",
**kwargs,
)
# Macro declaration
miniature = macro(
doc = """Create a miniature of the src image.
The generated file name will be prefixed with `name + "_small_"`.
""",
implementation = _miniature_impl,
# Inherit most of genrule's attributes (such as tags and testonly)
inherit_attrs = native.genrule,
attrs = {
"src": attr.label(
doc = "Image file",
allow_single_file = True,
# Non-configurable because our genrule's output filename is
# suffixed with src's name. (We want to suffix the output file with
# srcs's name because some tools that operate on image files expect
# the files to have the right file extension.)
configurable = False,
),
"size": attr.string(
doc = "Output size in WxH format",
default = "100x100",
),
# Do not allow callers of miniature() to set srcs, cmd, or outs -
# _miniature_impl overrides their values when calling native.genrule()
"srcs": None,
"cmd": None,
"outs": None,
},
)
Birkaç not:
Sembolik makro uygulama işlevleri
name
vevisibility
parametrelerine sahip olmalıdır. Makronun ana hedefi için kullanılmalıdır.Sembolik bir makronun davranışını belgelemek için
doc
ve özellikleriyle ilgilimacro()
parametrelerini kullanın.genrule
veya başka bir yerel kuralı çağırmak içinnative.
kullanın.Ek devralınan bağımsız değişkenleri temel
**kwargs
'a iletmek için**kwargs
kullanın (Python'daki gibi çalışır).genrule
Bu özellik, kullanıcılarıntags
veyatestonly
gibi standart özellikleri ayarlayabilmesi için kullanışlı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"],
)