Imagina que necesitas ejecutar una herramienta como parte de tu compilación. Por ejemplo, que quieras generar o procesar previamente un archivo fuente o comprimir un objeto binario. En este en el que se explica cómo crear una macro que cambia el tamaño de una imagen.
Las macros son adecuadas para tareas simples. Si quieres hacer algo más complicado, por ejemplo, para agregar compatibilidad con un lenguaje de programación nuevo, considera crear una regla. Las reglas te brindan más control y flexibilidad.
La forma más fácil de crear una macro que cambie el tamaño de una imagen es usar un 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"],
)
Si necesitas cambiar el tamaño de más imágenes, te recomendamos volver a usar el código. Para hacer eso,
define una función en un archivo .bzl
separado y llama al archivo 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
)
Algunas observaciones:
Por convención, las macros tienen un argumento
name
, al igual que las reglas.Para documentar el comportamiento de una macro, usa docstring como en Python.
Para llamar a una
genrule
o cualquier otra regla nativa, usanative.
.Usa
**kwargs
para reenviar los argumentos adicionales algenrule
subyacente. (funciona igual que en Python). Esto es útil para que un usuario pueda usar atributos estándar, comovisibility
, otags
.
Ahora, usa la macro del archivo 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"],
)