Reglas generales

Reglas

alias

alias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)

La regla alias crea otro nombre al que se puede hacer referencia a la regla.

La asignación de alias solo funciona para objetivos “normales”. En particular, package_group y test_suite no pueden tener un alias.

La regla de alias tiene su propia declaración de visibilidad. En cualquier otro aspecto, se comporta como la regla a la que hace referencia (p.ej., se ignora solo prueba en el alias y en su lugar se usa solo prueba de la regla a la que hace referencia), con algunas excepciones menores:

  • Las pruebas no se ejecutan si se menciona su alias en la línea de comandos. Para definir un alias que ejecute la prueba a la que se hace referencia, usa una regla test_suite con un solo objetivo en su atributo tests.
  • Cuando se definen grupos de entornos, no se admiten los alias de las reglas environment. Tampoco se admiten en la opción de línea de comandos --target_environment.

Ejemplos

filegroup(
    name = "data",
    srcs = ["data.txt"],
)

alias(
    name = "other",
    actual = ":data",
)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

actual

Label; required

El objetivo al que hace referencia este alias. No es necesario que sea una regla, también puede ser un archivo de entrada.

config_setting

config_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)

Coincide con un estado de configuración esperado (expresado como marcas de compilación o restricciones de plataforma) con el fin de activar atributos configurables. Consulta Seleccionar para conocer cómo consumir esta regla y Atributos configurables para obtener una descripción general de la función general.

Ejemplos

La siguiente compilación coincide con cualquier compilación que establezca --compilation_mode=opt o -c opt (ya sea de forma explícita en la línea de comandos o implícitamente desde archivos .bazelrc):

  config_setting(
      name = "simple",
      values = {"compilation_mode": "opt"}
  )
  

El siguiente código coincide con cualquier compilación que se oriente a ARM y aplica la definición personalizada FOO=bar (por ejemplo, bazel build --cpu=arm --define FOO=bar ...):

  config_setting(
      name = "two_conditions",
      values = {
          "cpu": "arm",
          "define": "FOO=bar"
      }
  )
  

La siguiente compilación coincide con cualquier compilación que establezca la marca definida por el usuario --//custom_flags:foo=1 (ya sea de forma explícita en la línea de comandos o implícitamente desde archivos .bazelrc):

  config_setting(
      name = "my_custom_flag_is_set",
      flag_values = { "//custom_flags:foo": "1" },
  )
  

Lo siguiente coincide con cualquier compilación que se oriente a una plataforma con una arquitectura x86_64 y la versión 2.25 de glibc, suponiendo que existe un constraint_value con la etiqueta //example:glibc_2_25. Ten en cuenta que una plataforma igual coincide si define valores de restricción adicionales aparte de estos dos.

  config_setting(
      name = "64bit_glibc_2_25",
      constraint_values = [
          "@platforms//cpu:x86_64",
          "//example:glibc_2_25",
      ]
  )
  
En todos estos casos, es posible que la configuración cambie dentro de la compilación, por ejemplo, si se debe compilar un destino para una plataforma diferente a la de su dependencia. Esto significa que, incluso cuando un config_setting no coincide con las marcas de línea de comandos de nivel superior, puede coincidir con algunos objetivos de compilación.

Notas

  • Consulta seleccionar para ver qué sucede cuando varios config_setting coinciden con el estado de configuración actual.
  • Para las marcas que admiten formas abreviadas (p. ej., --compilation_mode frente a -c), las definiciones de values deben usar la forma completa. Estos coinciden automáticamente con las invocaciones con cualquiera de los formatos.
  • Si una marca toma varios valores (como --copt=-Da --copt=-Db o una marca de Starlark de tipo lista), values = { "flag": "a" } coincide si "a" está presente en cualquier parte de la lista real.

    values = { "myflag": "a,b" } funciona de la misma manera: coincide con --myflag=a --myflag=b, --myflag=a --myflag=b --myflag=c, --myflag=a,b y --myflag=c,b,a. La semántica exacta varía entre las marcas. Por ejemplo, --copt no admite varios valores en la misma instancia: --copt=a,b produce ["a,b"], mientras que --copt=a --copt=b produce ["a", "b"] (por lo que values = { "copt": "a,b" } coincide con el primero, pero no con el último). Sin embargo, --ios_multi_cpus (para las reglas de Apple) : -ios_multi_cpus=a,b y ios_multi_cpus=a --ios_multi_cpus=b producen ["a", "b"]. Revisa las definiciones de las marcas y prueba las condiciones con atención para verificar expectativas exactas.

  • Si necesitas definir condiciones que no se modelan con marcas de compilación integradas, usa las marcas definidas por Starlark. También puedes usar --define, pero esta opción ofrece una compatibilidad menor y no se recomienda. Consulta este vínculo para obtener más información.
  • Evita repetir definiciones de config_setting idénticas en paquetes diferentes. En su lugar, haz referencia a un elemento config_setting común que se definió en un paquete canónico.
  • values, define_values y constraint_values se pueden usar en cualquier combinación en el mismo config_setting, pero se debe configurar al menos uno para cualquier config_setting.

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

constraint_values

List of labels; optional; nonconfigurable

Es el conjunto mínimo de constraint_values que debe especificar la plataforma de destino para que coincida con esta config_setting. (aquí no se considera la plataforma de ejecución). Se ignorará cualquier valor de restricción adicional que la plataforma tenga. Para obtener más información, consulta Atributos de compilación configurables.

Si dos config_setting coinciden en el mismo select, este atributo no se considera con el fin de determinar si uno de los config_setting es una especialización del otro. En otras palabras, un config_setting no puede coincidir con una plataforma de manera más sólida que otra.

define_values

Dictionary: String -> String; optional; nonconfigurable

Es lo mismo que values, pero específicamente para la marca --define.

--define es especial porque su sintaxis (--define KEY=VAL) significa que KEY=VAL es un valor desde la perspectiva de la marca de Bazel.

Esto significa lo siguiente:

            config_setting(
                name = "a_and_b",
                values = {
                    "define": "a=1",
                    "define": "b=2",
                })
          

no funciona porque la misma clave (define) aparece dos veces en el diccionario. Este atributo resuelve el problema:

            config_setting(
                name = "a_and_b",
                define_values = {
                    "a": "1",
                    "b": "2",
                })
          

coincide correctamente con bazel build //foo --define a=1 --define b=2.

--define aún puede aparecer en values con una sintaxis de marca normal y se puede mezclar libremente con este atributo, siempre que las claves del diccionario permanezcan distintas.

flag_values

Dictionary: label -> String; optional; nonconfigurable

Es igual que values, pero para marcas de compilación definidas por el usuario.

Este es un atributo distinto porque las marcas definidas por el usuario se referencian como etiquetas, mientras que las marcas integradas se referencian como strings arbitrarias.

values

Dictionary: String -> String; optional; nonconfigurable

El conjunto de valores de configuración que coinciden con esta regla (expresados como marcas de compilación)

Esta regla hereda la configuración del destino configurado que hace referencia a él en una declaración select. Se considera que "coincide" con una invocación de Bazel si, para cada entrada en el diccionario, su configuración coincide con el valor esperado de la entrada. Por ejemplo, values = {"compilation_mode": "opt"} coincide con las invocaciones bazel build --compilation_mode=opt ... y bazel build -c opt ... en las reglas configuradas en el destino.

Por motivos prácticos, los valores de configuración se especifican como marcas de compilación (sin el "--" anterior). Sin embargo, ten en cuenta que no son iguales. Esto se debe a que los destinos se pueden compilar en varias configuraciones dentro de la misma compilación. Por ejemplo, la "cpu" de una configuración de host coincide con el valor de --host_cpu, no de --cpu. Por lo tanto, diferentes instancias de la misma config_setting pueden coincidir con la misma invocación de manera diferente según la configuración de la regla que las usa.

Si no se configura explícitamente una marca en la línea de comandos, se usa su valor predeterminado. Si una clave aparece varias veces en el diccionario, solo se usa la última instancia. Si una clave hace referencia a una marca que se puede configurar varias veces en la línea de comandos (p.ej., bazel build --copt=foo --copt=bar --copt=baz ...), se genera una coincidencia si alguno de esos parámetros de configuración coincide.

grupo de archivos

filegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)

Usa filegroup para asignar un nombre conveniente a un conjunto de destinos. Luego, se puede hacer referencia a ellos desde otras reglas.

Se recomienda usar filegroup en lugar de hacer referencia a directorios directamente. Este último no es válido, ya que el sistema de compilación no tiene conocimiento absoluto de todos los archivos debajo del directorio, por lo que es posible que no se vuelva a compilar cuando estos archivos cambien. Cuando se combina con glob, filegroup puede garantizar que el sistema de compilación conozca de forma explícita todos los archivos.

Ejemplos

Para crear un filegroup que contenga dos archivos fuente, haz lo siguiente:

filegroup(
    name = "mygroup",
    srcs = [
        "a_file.txt",
        "some/subdirectory/another_file.txt",
    ],
)

También puedes usar un glob para generar un directorio de datos de prueba:

filegroup(
    name = "exported_testdata",
    srcs = glob([
        "testdata/*.dat",
        "testdata/logs/**/*.log",
    ]),
)

Para usar estas definiciones, haz referencia a filegroup con una etiqueta de cualquier regla:

cc_library(
    name = "my_library",
    srcs = ["foo.cc"],
    data = [
        "//my_package:exported_testdata",
        "//my_package:mygroup",
    ],
)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

srcs

List of labels; optional

Es la lista de destinos que son miembros del grupo de archivos.

Es común usar el resultado de una expresión glob para el valor del atributo srcs.

data

List of labels; optional

La lista de archivos que necesita esta regla en el tiempo de ejecución.

Los destinos nombrados en el atributo data se agregarán a la runfiles de esta regla filegroup. Cuando se haga referencia a filegroup en el atributo data de otra regla, se agregará su runfiles al runfiles de la regla dependiente. Consulta la sección de dependencias de datos y la documentación general de data para obtener más información sobre cómo depender de los archivos de datos y cómo usarlos.

output_group

String; optional

El grupo de salida a partir del cual se recopilan los artefactos de las fuentes. Si se especifica este atributo, se exportarán los artefactos del grupo de salida especificado de las dependencias en lugar del grupo de salida predeterminado.

Un “grupo de salida” es una categoría de artefactos de salida de un destino, que se especifican en la implementación de esa regla.

consulta generativa

genquery(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, expression, features, licenses, opts, restricted_to, scope, strict, tags, target_compatible_with, testonly, visibility)

genquery() ejecuta una consulta especificada en el lenguaje de consulta de Blaze y vuelca el resultado en un archivo.

Para mantener la coherencia de la compilación, la consulta solo puede visitar el cierre transitivo de los destinos especificados en el atributo scope. Las consultas que infrinjan esta regla fallarán durante la ejecución si no se especifica strict o si es verdadero (si strict es falso, los objetivos fuera del alcance solo se omitirán con una advertencia). La manera más fácil de asegurarte de que esto no suceda es mencionar las mismas etiquetas en el alcance y en la expresión de la consulta.

La única diferencia entre las consultas que se permiten aquí y en la línea de comandos es que las consultas que contienen especificaciones de destino comodín (p.ej., //pkg:* o //pkg:all) no se permiten aquí. Esto se debe a dos motivos: primero, porque genquery debe especificar un alcance para evitar que los destinos fuera del cierre transitivo de la consulta influyan en su resultado; y, en segundo lugar, debido a que los archivos BUILD no admiten dependencias de comodín (p.ej., no se permite deps=["//a/..."]).

El resultado de la genquery se ordena usando --order_output=full para aplicar la salida determinista.

El nombre del archivo de salida es el nombre de la regla.

Ejemplos

En este ejemplo, se escribe la lista de las etiquetas en el cierre transitivo del destino especificado en un archivo.

genquery(
    name = "kiwi-deps",
    expression = "deps(//kiwi:kiwi_lib)",
    scope = ["//kiwi:kiwi_lib"],
)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

expression

String; required

La consulta que se ejecutará. A diferencia de la línea de comandos y otros lugares en los archivos BUILD, las etiquetas aquí se resuelven en relación con el directorio raíz del lugar de trabajo. Por ejemplo, la etiqueta :b de este atributo en el archivo a/BUILD hará referencia al //:b de destino.
opts

List of strings; optional

Las opciones que se pasan al motor de consultas. Estas se corresponden con las opciones de la línea de comandos que se pueden pasar a bazel query. Algunas opciones de consulta no se permiten aquí: --keep_going, --query_file, --universe_scope, --order_results y --order_output. Las opciones que no se especifiquen aquí tendrán sus valores predeterminados al igual que en la línea de comandos de bazel query.
scope

null; required

El alcance de la consulta. La consulta no puede tocar los objetivos fuera del cierre transitivo de estos objetivos.
strict

Boolean; optional; default is True

Si es verdadero, los objetivos cuyas consultas escapen del cierre transitivo de sus permisos no se podrán compilar. Si es falso, Bazel imprimirá una advertencia y omitirá cualquier ruta de consulta que la haya llevado fuera del permiso, mientras completa el resto de la consulta.

genrule

genrule(name, srcs, outs, cmd, cmd_bash, cmd_bat, cmd_ps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exec_tools, executable, features, licenses, local, message, output_licenses, output_to_bindir, restricted_to, tags, target_compatible_with, testonly, toolchains, tools, visibility)

Un elemento genrule genera uno o más archivos con un comando Bash definido por el usuario.

Genrules son reglas de compilación genéricas que puedes usar si no hay una regla específica para la tarea. Por ejemplo, puedes ejecutar una línea de una sola línea de Bash. Sin embargo, si necesitas compilar archivos C++, cumple con las reglas cc_* existentes, ya que todo el trabajo pesado ya se realizó por ti.

No uses una genrule para ejecutar pruebas. Hay dispensaciones especiales para las pruebas y los resultados de las pruebas, incluidas las políticas de almacenamiento en caché y las variables de entorno. Por lo general, las pruebas deben ejecutarse una vez que se completa la compilación y en la arquitectura de destino, mientras que las genrules se ejecutan durante la compilación y en la arquitectura host (es posible que ambas sean diferentes). Si necesitas una regla de prueba de uso general, usa sh_test.

Consideraciones sobre la compilación cruzada

Consulta el manual del usuario para obtener más información sobre la compilación cruzada.

Si bien las genrules se ejecutan durante una compilación, sus resultados suelen usarse después de la compilación para la implementación o pruebas. Considera el ejemplo de compilación de código C para un microcontrolador: el compilador acepta archivos fuente C y genera código que se ejecuta en un microcontrolador. Obviamente, el código generado no se puede ejecutar en la CPU que se usó para compilarlo, pero el compilador C (si se compila desde la fuente) debe hacerlo.

El sistema de compilación usa la configuración del host para describir las máquinas en las que se ejecuta la compilación y la configuración de destino para describir las máquinas en las que se supone que se debe ejecutar el resultado de la compilación. Proporciona opciones para configurar cada una de ellas y segrega los archivos correspondientes en directorios separados para evitar conflictos.

En el caso de las genrules, el sistema de compilación garantiza que las dependencias se compilen de manera adecuada: srcs se compilan (si es necesario) para la configuración de target, tools se compilan para la configuración del host, y el resultado se considera para la configuración del destino. También proporciona las variables "Make" que los comandos genrule pueden pasar a las herramientas correspondientes.

Es intencional que genrule no defina ningún atributo deps: otras reglas integradas usan metainformación dependiente del lenguaje que se pasa entre las reglas para determinar automáticamente cómo manejar las reglas dependientes, pero este nivel de automatización no es posible para las genrules. Las genrules funcionan únicamente a nivel de archivo y runfiles.

Casos especiales

Compilación de host y host: En algunos casos, el sistema de compilación necesita ejecutar genrules de modo que el resultado también se pueda ejecutar durante la compilación. Por ejemplo, si una genrule compila un compilador personalizado que otra genrule luego usará, el primero deberá producir su resultado para la configuración del host, ya que allí es donde se ejecutará el compilador en la otra genrule. En este caso, el sistema de compilación hace lo correcto automáticamente: compila el srcs y la outs de la primera genrule para la configuración del host en lugar de la configuración de destino. Consulta el manual del usuario para obtener más información.

Herramientas de JDK y C++: Para usar una herramienta del JDK o el conjunto de compiladores de C++, el sistema de compilación proporciona un conjunto de variables para usar. Consulta la variable"Make" para obtener más detalles.

Entorno de Genrule

El comando genrule se ejecuta mediante una shell Bash configurada para fallar cuando falla un comando o una canalización mediante set -e -o pipefail.

La herramienta de compilación ejecuta el comando Bash en un entorno de procesos depurado que define solo variables principales, como PATH, PWD, TMPDIR y algunas más. Para garantizar que las compilaciones sean reproducibles, la mayoría de las variables definidas en el entorno de shell del usuario no se pasan al comando de genrule. Sin embargo, Bazel (pero no Blaze) pasa el valor de la variable de entorno PATH del usuario. Cualquier cambio en el valor de PATH hará que Bazel vuelva a ejecutar el comando en la siguiente compilación.

Un comando genrule no debería acceder a la red, excepto para conectar procesos que sean secundarios del comando, aunque esto no se aplica actualmente.

El sistema de compilación borra automáticamente los archivos de salida existentes, pero crea los directorios superiores necesarios antes de ejecutar una genrule. También quita cualquier archivo de salida en caso de falla.

Consejos generales

  • Asegúrate de que las herramientas ejecutadas por una regla general sean deterministas y herméticas. No deben escribir marcas de tiempo en el resultado y deben usar un orden estable para conjuntos y mapas, además de escribir solo rutas de acceso relativas a archivos en el resultado, sin rutas absolutas. Si no se sigue esta regla, se generará un comportamiento de compilación inesperado (Bazel no volverá a compilar una regla de gen. que pensabas que lo haría) y degradará el rendimiento de la caché.
  • Usa $(location) de manera extensiva para resultados, herramientas y fuentes. Debido a la segregación de los archivos de salida para diferentes configuraciones, las genrules no pueden depender de rutas codificadas o absolutas.
  • Escribe una macro de Starlark común en caso de que se usen las mismas genrules o muy similares en varios lugares. Si la genrule es compleja, considera implementarla en una secuencia de comandos o como una regla de Starlark. Esto mejora la legibilidad y la capacidad de prueba.
  • Asegúrate de que el código de salida indique correctamente el éxito o la falla de la genrule.
  • No escribas mensajes informativos en stdout ni stderr. Si bien es útil para la depuración, puede convertirse fácilmente en ruido; una genrule exitosa debe ser silenciosa. Por otro lado, una genrule que falla debe emitir mensajes de error correctos.
  • $$ evaluates to a $, a literal dollar-sign, so in order to invoke a shell command containing dollar-signs such as ls $(dirname $x), one must escape it thus: ls $$(dirname $$x).
  • Evita crear enlaces simbólicos y directorios. Bazel no copia la estructura de directorio/symlink creada por genrules y su verificación de dependencias de directorios no es válida.
  • Cuando haces referencia a genrule en otras reglas, puedes usar la etiqueta de genrule o las etiquetas de archivos de salida individuales. A veces, un enfoque es más legible, a veces el otro: hacer referencia a las salidas por nombre en el srcs de una regla de consumo evitará seleccionar otras salidas de la genrule de manera involuntaria, pero puede ser tedioso si esta produce muchas salidas.

Ejemplos

En este ejemplo, se genera foo.h. No hay fuentes porque el comando no toma ninguna entrada. El “binario” que ejecuta el comando es una secuencia de comandos perl en el mismo paquete que la genrule.

genrule(
    name = "foo",
    srcs = [],
    outs = ["foo.h"],
    cmd = "./$(location create_foo.pl) > \"$@\"",
    tools = ["create_foo.pl"],
)

En el siguiente ejemplo, se muestra cómo usar un filegroup y los resultados de otro genrule. Ten en cuenta que el uso de $(SRCS) en lugar de directivas $(location) explícitas también funcionaría. En este ejemplo, se usan estas últimas a modo de demostración.

genrule(
    name = "concat_all_files",
    srcs = [
        "//some:files",  # a filegroup with multiple files in it ==> $(locations)
        "//other:gen",   # a genrule with a single output ==> $(location)
    ],
    outs = ["concatenated.txt"],
    cmd = "cat $(locations //some:files) $(location //other:gen) > $@",
)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.


Puedes hacer referencia a esta regla por su nombre en la sección srcs o deps de otras reglas BUILD. Si la regla genera archivos de origen, debes usar el atributo srcs.
srcs

List of labels; optional

Una lista de entradas para esta regla, como los archivos de origen que se procesarán.

Este atributo no es adecuado para enumerar herramientas que ejecuta cmd. En su lugar, usa el atributo tools para ellas.

El sistema de compilación garantiza que estos requisitos previos se compilen antes de ejecutar el comando genrule, que se compilan con la misma configuración que la solicitud de compilación original. Los nombres de los archivos de estos requisitos previos están disponibles para el comando como una lista separada por espacios en $(SRCS). De manera alternativa, la ruta de acceso de un //x:y de destino srcs individual se puede obtener usando $(location //x:y) o $<, siempre que sea la única entrada en srcs.

outs

List of filenames; required; nonconfigurable

Una lista de archivos que genera esta regla.

Los archivos de salida no deben cruzar los límites de paquetes. Los nombres de los archivos de salida se interpretan como relacionados con el paquete.

Si se configura la marca executable, outs debe contener exactamente una etiqueta.

Se espera que el comando genrule cree cada archivo de salida en una ubicación predeterminada. La ubicación está disponible en cmd con variables “Make” específicas de la regla de género ($@, $(OUTS), $(@D) o $(RULEDIR)) o con la sustitución $(location).

cmd

String; optional

El comando que se ejecutará. Sujeto a la sustitución de la variable “Make” y $(location) .
  1. Se aplica la primera sustitución $(location) y se reemplazan todos los casos de $(location label) y $(locations label) (y construcciones similares que usan variables relacionadas execpath, execpaths, rootpath y rootpaths).
  2. A continuación, se expanden las variables"Make". Ten en cuenta que las variables predefinidas $(JAVA), $(JAVAC) y $(JAVABASE) se expanden en la configuración del host, por lo que las invocaciones de Java que se ejecutan como parte de un paso de compilación pueden cargar correctamente las bibliotecas compartidas y otras dependencias.
  3. Por último, el comando resultante se ejecuta mediante la shell Bash. Si su código de salida no es cero, se considera que el comando falló.
Este es el resguardo de cmd_bash, cmd_ps y cmd_bat, si ninguno de ellos es aplicable.

Si la longitud de la línea de comandos supera el límite de la plataforma (64 K en Linux/macOS y 8K en Windows), genrule escribirá el comando en una secuencia de comandos y la ejecutará para solucionar el problema. Esto se aplica a todos los atributos cmd (cmd, cmd_bash, cmd_ps, cmd_bat).

cmd_bash

String; optional

El comando Bash que se ejecutará.

Este atributo tiene mayor prioridad que cmd. El comando se expande y se ejecuta de la misma manera que el atributo cmd.

cmd_bat

String; optional

El comando por lotes para ejecutar en Windows.

Este atributo tiene mayor prioridad que cmd y cmd_bash. El comando se ejecuta de manera similar al atributo cmd, con las siguientes diferencias:

  • Este atributo solo se aplica en Windows.
  • El comando se ejecuta con cmd.exe /c con los siguientes argumentos predeterminados:
    • /S: Quita las primeras y las últimas comillas, y ejecuta todo lo demás tal como está.
    • /E:ON: Habilita el conjunto de comandos extendido.
    • /V:ON: Habilita la expansión de variables demorada.
    • /D: Ignora las entradas del registro de AutoRun.
  • Después de la sustitución $(location) y la variable “Make”, las rutas se expandirán a las rutas de estilo de Windows (con barra inversa).
cmd_ps

String; optional

El comando de PowerShell que se ejecuta en Windows

Este atributo tiene mayor prioridad que cmd, cmd_bash y cmd_bat. El comando se ejecuta de manera similar al atributo cmd, con las siguientes diferencias:

  • Este atributo solo se aplica en Windows.
  • El comando se ejecuta con powershell.exe /c.

Para que PowerShell sea más fácil de usar y sea menos propenso a errores, ejecutamos los siguientes comandos para configurar el entorno antes de ejecutar el comando de Powershell en genrule.

  • Set-ExecutionPolicy -Scope CurrentUser RemoteSigned: Permite ejecutar secuencias de comandos sin firmar.
  • $errorActionPreference='Stop': En caso de que haya varios comandos separados por ;, la acción se cierra de inmediato si falla un CmdLet de PowerShell, pero esto NO funciona para los comandos externos.
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8': Cambia la codificación predeterminada de utf-16 a utf-8.
exec_tools

List of labels; optional

Una lista de dependencias tool para esta regla. Este se comporta igual al atributo tools, con la excepción de que estas dependencias se configurarán para la plataforma de ejecución de la regla en lugar de la configuración del host. Eso significa que las dependencias en exec_tools no están sujetas a las mismas limitaciones que las dependencias en tools. En particular, no están obligados a usar la configuración del host para sus propias dependencias transitivas. Consulta tools para obtener más información.

El equipo de Blaze está migrando todos los usos de tools para usar la semántica de exec_tools. Se recomienda a los usuarios que prefieran exec_tools en lugar de tools, ya que esto no genera ningún problema. Una vez finalizada la migración funcional, podemos cambiar el nombre de exec_tools a tools. Antes de que esto suceda, recibirás una advertencia de baja y las instrucciones de migración.

executable

Boolean; optional; nonconfigurable; default is False

Declara el resultado para que sea ejecutable.

Si estableces esta marca como verdadera, el resultado es un archivo ejecutable y se puede ejecutar con el comando run. En este caso, la genrule debe producir exactamente un resultado. Si se establece este atributo, run intentará ejecutar el archivo sin importar su contenido.

No se admite la declaración de dependencias de datos para el ejecutable generado.

local

Boolean; optional; default is False

Si se configura como verdadera, esta opción fuerza la ejecución de genrule con la estrategia “local”, lo que significa que no hay ejecución remota, zona de pruebas ni trabajadores persistentes.

Esto equivale a proporcionar "local" como etiqueta (tags=["local"]).

message

String; optional

Un mensaje de progreso

Un mensaje de progreso que se imprimirá a medida que se ejecute este paso de compilación. De forma predeterminada, el mensaje es “Generando resultado” (o algo igualmente sencillo), pero puedes proporcionar uno más específico. Usa este atributo en lugar de echo o de otras instrucciones de impresión en tu comando cmd, ya que esto permite que la herramienta de compilación controle si esos mensajes de progreso se imprimen o no.

output_licenses

Licence type; optional

Consulta common attributes .
output_to_bindir

Boolean; optional; nonconfigurable; default is False

Si se configura como verdadera, esta opción hace que los archivos de salida se escriban en el directorio bin en lugar del directorio genfiles.

tools

List of labels; optional

Una lista de dependencias tool para esta regla. Consulta la definición de dependencias para obtener más información.

El sistema de compilación garantiza que estos requisitos previos se compilen antes de ejecutar el comando genrule. Se compilan mediante la configuración host, ya que estas herramientas se ejecutan como parte de la compilación. La ruta de acceso de un tools objetivo //x:y individual se puede obtener usando $(location //x:y).

Cualquier *_binary o herramienta que ejecute cmd debe aparecer en esta lista, no en srcs, para garantizar que se compilen con la configuración correcta.

test_suite

test_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, tests, visibility)

Un test_suite define un conjunto de pruebas que se consideran "útiles" para los humanos. Esto permite que los proyectos definan conjuntos de pruebas, como “pruebas que debes ejecutar antes de registrar”, “pruebas de esfuerzo de nuestro proyecto” o “todas las pruebas pequeñas”. El comando blaze test respeta este tipo de organización: para una invocación como blaze test //some/test:suite, Blaze primero enumera todos los destinos de prueba incluidos de forma transitiva en el objetivo //some/test:suite (lo llamamos "expansión de test_suite") y, luego, Blaze compila y prueba esos objetivos.

Ejemplos

Un paquete de pruebas para ejecutar todas las pruebas pequeñas en el paquete actual.

test_suite(
    name = "small_tests",
    tags = ["small"],
)

Un paquete de pruebas que ejecuta un conjunto específico de pruebas:

test_suite(
    name = "smoke_tests",
    tests = [
        "system_unittest",
        "public_api_unittest",
    ],
)

Un paquete de pruebas para ejecutar todas las pruebas del paquete actual que no son inestables.

test_suite(
    name = "non_flaky_test",
    tags = ["-flaky"],
)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

tags

List of strings; optional; nonconfigurable

Lista de etiquetas de texto como “pequeño” o “base de datos” o “-poco” Las etiquetas pueden ser cualquier cadena válida.

Las etiquetas que comienzan con un carácter "-" se consideran etiquetas negativas. El carácter "-" anterior no se considera parte de la etiqueta, por lo que una etiqueta de paquete "-small" coincide con el tamaño "pequeño" de una prueba. Todas las demás etiquetas se consideran positivas.

De manera opcional, para que las etiquetas positivas sean más explícitas, las etiquetas también pueden comenzar con el carácter "+", que no se evaluará como parte del texto de la etiqueta. Solo hace que la distinción positiva y negativa sea más fácil de leer.

Solo las reglas de prueba que coincidan con todas las etiquetas positivas y ninguna de las etiquetas negativas se incluirán en el conjunto de pruebas. Ten en cuenta que esto no significa que se omite la comprobación de errores de las dependencias de las pruebas que se filtran; las dependencias de las pruebas omitidas aún deben ser legales (p.ej., no deben estar bloqueadas por restricciones de visibilidad).

La "expansión de test_suite" que realiza el comando blaze test en las invocaciones que involucran patrones de destino comodines trata de la palabra clave de la etiqueta manual de manera diferente a lo anterior. Allí, los destinos test_suite etiquetados como "manuales" se filtran (y, por lo tanto, no se expanden). Este comportamiento es coherente con la forma en que blaze build y blaze test manejan los patrones de objetivo comodín en general. Ten en cuenta que esto es explícitamente diferente del comportamiento de blaze query 'tests(E)', ya que la función de consulta tests siempre expande los conjuntos, sin importar la etiqueta manual.

Ten en cuenta que el elemento size de una prueba se considera una etiqueta con el objetivo de filtrar.

Si necesitas un test_suite que contenga pruebas con etiquetas mutuamente excluyentes (p.ej., todas las pruebas pequeñas y medianas), tendrás que crear tres reglas de test_suite: una para todas las pruebas pequeñas, una para todas las pruebas de nivel intermedio y otra que incluya las dos anteriores.

tests

List of labels; optional; nonconfigurable

Una lista de paquetes de pruebas y objetivos de prueba de cualquier idioma.

Aquí se acepta cualquier *_test, independientemente del idioma. Sin embargo, no se aceptan objetivos *_binary, incluso si ejecutan una prueba. Solo se filtra por el tags especificado para las pruebas enumeradas directamente en este atributo. Si este atributo contiene test_suite, las pruebas dentro de ellos no se filtrarán por este test_suite (se consideran que ya están filtradas).

Si no se especifica el atributo tests o está vacío, la regla incluirá de forma predeterminada todas las reglas de prueba del archivo BUILD actual que no estén etiquetadas como manual. Estas reglas aún están sujetas al filtro tag.