Tengo una regla de bazel que produce un artefacto. ¿Cómo debo hacer para agregar un paso de posprocesamiento con el artefacto producido como dependencia?

Tenemos un gran sistema de compilación en el que nuestras macros se utilizan en varios archivos de compilación. Así que ahora necesito agregar otro paso que usaría los artefactos producidos por una macro específica para crear otro artefacto y, con suerte, sin tener que actualizar todos los archivos BUILD.

En un contexto que no sea de bazel, probablemente usaría algo que active el paso adicional, pero en el contexto de bazel, lo mejor que se me ocurrió fue agregar una nueva macro, que usa la regla creada por la otra macro como una dependencia.

Es algo como esto hoy:
La macro M1 genera la regla R1, que produce el artefacto A.
El archivo de compilación B usa la macro M1 y cuando se construye ese objetivo, se produce el artefacto A.

Así que ahora puedo agregar una macro M2 que genera la regla R2, que produce el artefacto B.
El artefacto A es una dependencia de esta regla.
Los usuarios usarán la macro M2 en su lugar.

¿Pero puedo hacer esto de otra manera?

Un ejemplo de un caso de uso podría ser que tengo una macro que produce un binario y ahora quiero agregar, p. firma. "Los usuarios" todavía querrán construir ese binario, y el artefacto firmado se crea como un subproducto de poco interés para los usuarios.

0
Per Westling 10 oct. 2019 a las 16:02

1 respuesta

La mejor respuesta

Puede actualizar M1 para llamar a M2.

M1 que llama a M2 simplemente declara reglas. Normalmente, las macros tienen este aspecto:

def M1(name, arg1, ...):
    R1(name=name, arg1=arg1, ...)

Cuando construyes la regla M1 "// foo: bar", en realidad construyes R1 llamado "// foo: bar". Por lo tanto, debe actualizar M1 para llamar a R1 con otro nombre que no sea el nombre, p. Ej. name + "dep", y llame a M2 con name y pase el name de R1 como una dependencia. Entonces, si construyes "// foo: bar", construirás la regla subyacente de M2 ​​(R2), que depende de R1, por lo que Bazel primero construye R1 (y produce A), y luego R2 (consumiendo A).

Una cosa más: Bazel procesa previamente las macros en reglas reales, antes de cargar las reglas en el archivo BUILD. Puede inspeccionar el resultado de este preprocesamiento, para ver qué reglas tiene realmente en el paquete, así:

bazel query --output=build //foo:*
1
László 18 oct. 2019 a las 09:48