Imagine que você precisa executar uma ferramenta como parte do seu build. Por exemplo, é possível gerar ou pré-processar um arquivo de origem ou compactar um binário. Neste tutorial, você criará uma macro que redimensiona uma imagem.
Macros são adequadas para tarefas simples. Se você quiser fazer algo mais complicado, por exemplo, adicionar suporte a uma nova linguagem de programação, considere criar uma regra. Com as regras, você tem mais controle e flexibilidade.
A maneira mais fácil de criar uma macro que redimensiona uma imagem é usar um genrule
:
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"],
)
Se você precisar redimensionar mais imagens, reutilize o código. Para fazer isso,
defina uma função em um arquivo .bzl
separado e chame o arquivo miniature.bzl
:
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
)
Observações:
Por convenção, as macros têm um argumento
name
, assim como as regras.Para documentar o comportamento de uma macro, use docstring como no Python.
Para chamar um
genrule
ou qualquer outra regra nativa, usenative.
.Use
**kwargs
para encaminhar os argumentos extras para agenrule
subjacente (como funciona no Python). Isso é útil para que o usuário possa usar atributos padrão, comovisibility
outags
.
Agora, use a macro do arquivo BUILD
:
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"],
)