Cómo crear una macro

Denuncia un problema Ver fuente Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Imagina que necesitas ejecutar una herramienta como parte de tu compilación. Por ejemplo, es posible que desees generar o preprocesar un archivo fuente, o comprimir un archivo binario. En este instructivo, crearás una macro que cambie el tamaño de una imagen.

Las macros son adecuadas para tareas simples. Si deseas hacer algo más complicado, como 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 sencilla 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 ello, define una función en un archivo .bzl independiente 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:

  • De forma convencional, las macros tienen un argumento name, al igual que las reglas.

  • Para documentar el comportamiento de una macro, usa una cadena de documentos como en Python.

  • Para llamar a un genrule o a cualquier otra regla nativa, usa native..

  • Usa **kwargs para reenviar los argumentos adicionales al genrule subyacente (funciona igual que en Python). Esto es útil para que un usuario pueda usar atributos estándar, como visibility o tags.

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"],
)