Reglas generales

Informar un problema Ver fuente Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Reglas

alias

Ver la fuente de la regla
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 en una regla.

El alias solo funciona para los destinos "normales". En particular, package_group y test_suite no pueden tener alias.

Los alias pueden ser útiles en repositorios grandes en los que cambiar el nombre de un destino requeriría realizar cambios en muchos archivos. También puedes usar la regla de alias para almacenar una llamada a la función select si deseas reutilizar esa lógica para varios destinos.

La regla de alias tiene su propia declaración de visibilidad. En todos los demás aspectos, se comporta como la regla a la que hace referencia (p.ej., se ignora testonly en el alias; en su lugar, se usa el atributo testonly de la regla a la que se 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 destino en su atributo tests.
  • Cuando se definen grupos de entornos, no se admiten los alias para las reglas de 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

Nombre (obligatorio)

Es un nombre único para este destino.

actual

Label: Obligatoria

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

config_setting

Ver la fuente de la regla
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 propósito de activar atributos configurables. Consulta select para obtener información sobre cómo consumir esta regla y Configurable attributes para obtener una descripción general de la función general.

Ejemplos

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

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

La siguiente coincidencia se aplica a cualquier compilación que tenga como objetivo ARM y aplique 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 coincidencia se aplica a 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 de forma implícita desde los archivos .bazelrc):

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

La siguiente coincidencia se aplica a cualquier compilación que tenga como objetivo una plataforma con una arquitectura x86_64 y la versión 2.25 de glibc, suponiendo la existencia de un constraint_value con la etiqueta //example:glibc_2_25. Ten en cuenta que una plataforma sigue coincidiendo si define valores de restricción adicionales más allá 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 de su dependencia. Esto significa que, incluso cuando un config_setting no coincide con las marcas de línea de comandos de nivel superior, es posible que coincida con algunos destinos de compilación.

Notas

  • Consulta select para saber qué sucede cuando varios config_setting coinciden con el estado de configuración actual.
  • En el caso de las marcas que admiten formas abreviadas (p. ej., --compilation_mode en lugar de -c), las definiciones de values deben usar la forma completa. Estas invocaciones coinciden automáticamente con cualquiera de las dos formas.
  • Si una marca toma varios valores (como --copt=-Da --copt=-Db o una marca de Starlark con tipo de lista), values = { "flag": "a" } coincide si "a" está presente en cualquier lugar 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 segundo). Pero --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"]. Verifica las definiciones de las marcas y prueba tus condiciones con cuidado para verificar las expectativas exactas.

  • Si necesitas definir condiciones que no se modelan con marcas de compilación integradas, usa marcas definidas por Starlark. También puedes usar --define, pero ofrece una compatibilidad más débil y no se recomienda. Consulta aquí para obtener más información.
  • Evita repetir definiciones de config_setting idénticas en diferentes paquetes. En su lugar, haz referencia a un config_setting común definido 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 establecer al menos uno para cualquier config_setting determinado.

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

constraint_values

Lista de etiquetas; no configurable; el valor predeterminado es []

Es el conjunto mínimo de constraint_values que la plataforma de destino debe especificar para que coincida con este config_setting. (Aquí no se considera la plataforma de ejecución). Se ignoran los valores de restricción adicionales que tenga la plataforma. Consulta Atributos de compilación configurables para obtener más detalles.

En el caso en que dos config_setting coincidan en el mismo select, este atributo no se considera para 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 más que con otra.

define_values

Diccionario: Cadena -> Cadena; no configurable; el valor predeterminado es {}

Es igual que values, pero específicamente para el parámetro --define.

--define es especial porque su sintaxis (--define KEY=VAL) significa que KEY=VAL es un valor desde la perspectiva de una 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 ese 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 puede aparecer en values con la sintaxis de marcas normal y se puede combinar libremente con este atributo, siempre y cuando las claves del diccionario sigan siendo distintas.

flag_values

Diccionario: label -> Cadena; nonconfigurable; el valor predeterminado es {}

Es igual que values, pero para indicadores de compilación definidos 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 cadenas arbitrarias.

values

Diccionario: Cadena -> Cadena; no configurable; el valor predeterminado es {}

Es 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 la referencia en una declaración select. Se considera que "coincide" con una invocación de Bazel si, para cada entrada del 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 reglas configuradas para el destino.

Para mayor comodidad, los valores de configuración se especifican como marcas de compilación (sin el "--" anterior), pero ten en cuenta que no son lo mismo. Esto se debe a que los destinos se pueden compilar en varias configuraciones dentro de la misma compilación. Por ejemplo, el "cpu" de una configuración de ejecución coincide con el valor de --host_cpu, no con el de --cpu. Por lo tanto, diferentes instancias del mismo 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 establece una marca de forma explícita 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 establecer varias veces en la línea de comandos (p.ej., bazel build --copt=foo --copt=bar --copt=baz ...), se produce una coincidencia si coincide cualquiera de esos parámetros de configuración.

filegroup

Ver la fuente de la regla
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 una colección de destinos. Luego, se puede hacer referencia a ellas desde otras reglas.

Se recomienda usar filegroup en lugar de hacer referencia a directorios directamente. Esta última opción no es confiable, ya que el sistema de compilación no tiene conocimiento completo de todos los archivos que se encuentran debajo del directorio, por lo que es posible que no vuelva a compilar cuando cambien estos archivos. Cuando se combina con glob, filegroup puede garantizar que el sistema de compilación conozca explícitamente todos los archivos.

Ejemplos

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

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

O bien, usa glob para analizar 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

Nombre (obligatorio)

Es un nombre único para este destino.

srcs

Lista de etiquetas. El valor predeterminado es [].

Es la lista de los objetivos 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

Lista de etiquetas. El valor predeterminado es [].

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

Los destinos nombrados en el atributo data se agregarán al runfiles de esta regla filegroup. Cuando se hace referencia a filegroup en el atributo data de otra regla, su runfiles se agregará al runfiles de la regla dependiente. Consulta la sección sobre 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 usarlos.

output_group

Cadena. El valor predeterminado es "".

Es el grupo de salida del que se recopilan 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, especificada en la implementación de esa regla.

genquery

Ver la fuente de la regla
genquery(name, deps, data, compatible_with, compressed_output, 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 consultas 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 búsquedas que incumplan esta regla fallarán durante la ejecución si strict no se especifica o es verdadero (si strict es falso, los objetivos fuera del alcance simplemente se omitirán con una advertencia). La forma más sencilla de asegurarse de que esto no suceda es mencionar las mismas etiquetas en el alcance que en la expresión de búsqueda.

La única diferencia entre las consultas permitidas aquí y en la línea de comandos es que no se permiten las consultas que contienen especificaciones de destino con comodines (p.ej., //pkg:* o //pkg:all). 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, segundo, porque los archivos BUILD no admiten dependencias de comodín (p.ej., deps=["//a/..."] no está permitido).

El resultado de genquery se ordena lexicográficamente para aplicar un resultado determinístico, excepto en el caso de --output=graph|minrank|maxrank o cuando somepath se usa como la función de nivel superior.

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

Ejemplos

En este ejemplo, se escribe la lista de 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

Nombre (obligatorio)

Es un nombre único para este destino.

compressed_output

Booleano; el valor predeterminado es False

Si es True, el resultado de la consulta se escribe en formato de archivo GZIP. Este parámetro de configuración se puede usar para evitar aumentos repentinos en el uso de memoria de Bazel cuando se espera que el resultado de la consulta sea grande. Bazel ya comprime internamente los resultados de las consultas que superan los 220 bytes, independientemente del valor de este parámetro de configuración, por lo que establecerlo en True podría no reducir el heap retenido. Sin embargo, permite que Bazel omita la descompresión cuando escribe el archivo de salida, lo que puede consumir mucha memoria.
expression

Cadena; obligatorio

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

Lista de cadenas; el valor predeterminado es []

Son las opciones que se pasan al motor de consultas. Corresponden a las opciones de línea de comandos que se pueden pasar a bazel query. Aquí no se permiten algunas opciones de búsqueda: --keep_going, --query_file, --universe_scope, --order_results y --order_output. Las opciones que no se especifican aquí tendrán sus valores predeterminados, al igual que en la línea de comandos de bazel query.
scope

Lista de etiquetas; obligatorio

Es el alcance de la búsqueda. No se permite que la búsqueda toque destinos fuera del cierre transitivo de estos destinos.
strict

Booleano; el valor predeterminado es True

Si es verdadero, no se podrán compilar los destinos cuyas búsquedas se escapen del cierre transitivo de sus alcances. Si es falso, Bazel imprimirá una advertencia y omitirá cualquier ruta de acceso de consulta que lo haya llevado fuera del alcance, mientras completa el resto de la consulta.

genrule

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

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

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

Ten en cuenta que genrule requiere un shell para interpretar el argumento de comando. También es fácil hacer referencia a programas arbitrarios disponibles en PATH, pero esto hace que el comando no sea hermético y es posible que no se pueda reproducir. Si solo necesitas ejecutar una sola herramienta, considera usar run_binary en su lugar.

No uses genrule para ejecutar pruebas. Existen 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 después de que se complete la compilación y en la arquitectura de destino, mientras que las reglas de generación se ejecutan durante la compilación y en la arquitectura de ejecución (las dos pueden ser diferentes). Si necesitas una regla de prueba de propósito 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 a menudo se usan después de la compilación, para la implementación o las pruebas. Considera el ejemplo de compilar 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 de C (si se compiló desde la fuente) sí debe hacerlo.

El sistema de compilación usa la configuración de ejecución 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 ejecutará el resultado de la compilación. Proporciona opciones para configurar cada uno de estos elementos 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 forma adecuada: Los srcs se compilan (si es necesario) para la configuración de destino. Los tools se compilan para la configuración de ejecución, y la salida se considera para la configuración de destino. También proporciona variables de "Make" que los comandos de 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 controlar las reglas dependientes, pero este nivel de automatización no es posible para las genrules. Las reglas de generación funcionan puramente a nivel de archivos y runfiles.

Casos especiales

Compilación de ejecutable a ejecutable: En algunos casos, el sistema de compilación necesita ejecutar genrules de modo que la salida también se pueda ejecutar durante la compilación. Si, por ejemplo, una regla genrule compila algún compilador personalizado que luego usa otra regla genrule, la primera debe generar su resultado para la configuración de ejecución, ya que ahí es donde se ejecutará el compilador en la otra regla genrule. En este caso, el sistema de compilación hace lo correcto automáticamente: compila srcs y outs de la primera regla genrule para la configuración de ejecución en lugar de la configuración de destino. Consulta el manual del usuario para obtener más información.

JDK y herramientas de C++: Para usar una herramienta del JDK o del 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 con un shell de Bash configurado para fallar cuando falla un comando o una canalización, con set -e -o pipefail.

La herramienta de compilación ejecuta el comando de Bash en un entorno de proceso saneado que define solo variables principales, como PATH, PWD, TMPDIR y algunas otras. 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 próxima compilación.

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

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

Asesoramiento general

  • Asegúrate de que las herramientas que ejecuta una regla genrule sean determinísticas y herméticas. No deben escribir marcas de tiempo en su salida y deben usar un orden estable para los conjuntos y los mapas, así como escribir solo rutas de acceso relativas a los archivos en la salida, no rutas de acceso absolutas. No seguir esta regla generará un comportamiento inesperado de la compilación (Bazel no recompilará una regla genrule que creías que recompilaría) y degradará el rendimiento de la caché.
  • Usa $(location) de forma extensiva para las salidas, las herramientas y las fuentes. Debido a la segregación de los archivos de salida para diferentes configuraciones, las reglas de generación no pueden depender de rutas de acceso codificadas o absolutas.
  • Escribe una macro de Starlark común en caso de que se usen genrules iguales o muy similares en varios lugares. Si la regla 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 si la regla genrule se ejecutó correctamente o no.
  • No escribas mensajes informativos en stdout o stderr. Si bien es útil para la depuración, esto puede convertirse fácilmente en ruido. Una genrule exitosa debería ser silenciosa. Por otro lado, una genrule que falla debe emitir buenos mensajes de error.
  • $$ 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 vínculos simbólicos y directorios. Bazel no copia la estructura de directorios o vínculos simbólicos que crean las genrules, y su verificación de dependencias de directorios no es confiable.
  • Cuando hagas referencia a la regla genrule en otras reglas, puedes usar la etiqueta de la regla genrule o las etiquetas de los 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á la selección no intencional de otras salidas de la regla genrule, pero puede ser tedioso si la regla genrule produce muchas salidas.

Ejemplos

En este ejemplo, se genera foo.h. No hay fuentes, ya que el comando no toma ninguna entrada. El "ejecutable" que ejecuta el comando es una secuencia de comandos de Perl en el mismo paquete que 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 también funcionaría usar $(SRCS) en lugar de directivas $(location) explícitas. En este ejemplo, se usa la última opción para fines 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

Nombre (obligatorio)

Es 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 fuente, debes usar el atributo srcs.
srcs

Lista de etiquetas. El valor predeterminado es [].

Es una lista de entradas para esta regla, como los archivos fuente que se deben procesar.

Este atributo no es adecuado para enumerar las herramientas que ejecuta cmd; en su lugar, usa el atributo tools.

El sistema de compilación garantiza que estos requisitos previos se compilen antes de ejecutar el comando genrule. 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). Como alternativa, la ruta de acceso de un destino srcs individual //x:y se puede obtener con $(location //x:y) o con $<, siempre que sea la única entrada en srcs.

outs

Lista de nombres de archivo; no configurable; obligatorio

Es una lista de archivos generados por esta regla.

Los archivos de salida no deben cruzar los límites del paquete. Los nombres de los archivos de salida se interpretan como relativos al 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 las variables "Make" específicas de genrule ($@, $(OUTS), $(@D) o $(RULEDIR)) o con la sustitución de $(location).

cmd

Cadena. El valor predeterminado es "".

Comando para ejecutar. Sujeto a la sustitución de $(location) y la variable"Make"
  1. Primero, se aplica la sustitución de $(location) , que reemplaza todas las ocurrencias de $(location label) y de $(locations label) (y construcciones similares que usan variables relacionadas execpath, execpaths, rootpath y rootpaths).
  2. A continuación, se expanden las variables de"Make". Ten en cuenta que las variables predefinidas $(JAVA), $(JAVAC) y $(JAVABASE) se expanden en la configuración exec, 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 con la shell de Bash. Si su código de salida es distinto de 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 8 K en Windows), genrule escribirá el comando en una secuencia de comandos y ejecutará esa secuencia para solucionar el problema. Esto se aplica a todos los atributos de cmd (cmd, cmd_bash, cmd_ps, cmd_bat).

cmd_bash

Cadena. El valor predeterminado es "".

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

Cadena. El valor predeterminado es "".

Comando de lote 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 comillas iniciales y finales, 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 de $(location) y la variable"Make", las rutas de acceso se expandirán a rutas de acceso de estilo Windows (con barra inversa).
cmd_ps

Cadena. El valor predeterminado es "".

Comando de PowerShell que se ejecutará 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 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 comandos externos.
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8': Cambia la codificación predeterminada de UTF-16 a UTF-8.
executable

Booleano; no se puede configurar; el valor predeterminado es False

Declara que el resultado es ejecutable.

Si se configura esta marca como True, significa que el resultado es un archivo ejecutable y se puede ejecutar con el comando run. En este caso, la regla genrule debe producir exactamente un resultado. Si se configura este atributo, run intentará ejecutar el archivo independientemente de su contenido.

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

local

Booleano; el valor predeterminado es False

Si se establece como verdadero, esta opción obliga a este genrule a ejecutarse con la estrategia "local", lo que significa que no habrá ejecución remota, ni aislamiento, ni trabajadores persistentes.

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

message

Cadena. El valor predeterminado es "".

Es un mensaje de progreso.

Es un mensaje de progreso que se imprimirá a medida que se ejecute este paso de compilación. De forma predeterminada, el mensaje es "Generando salida" (o algo igual de insípido), pero puedes proporcionar uno más específico. Usa este atributo en lugar de echo o de otras sentencias de impresión en tu comando cmd, ya que esto permite que la herramienta de compilación controle si se imprimen o no esos mensajes de progreso.

output_licenses

Tipo de licencia; el valor predeterminado es ["none"]

Consulta common attributes
output_to_bindir

Booleano; no se puede configurar; el valor predeterminado es False

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

tools

Lista de etiquetas. El valor predeterminado es [].

Es una lista de dependencias de herramientas 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 con la configuración exec, ya que estas herramientas se ejecutan como parte de la compilación. La ruta de acceso de un destino tools individual //x:y se puede obtener con $(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.

starlark_doc_extract

Ver la fuente de la regla
starlark_doc_extract(name, deps, src, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, render_main_repo_name, restricted_to, symbol_names, tags, target_compatible_with, testonly, visibility)

starlark_doc_extract() extrae la documentación de las reglas, las funciones (incluidas las macros), los aspectos y los proveedores definidos o reexportados en un archivo .bzl o .scl determinado. El resultado de esta regla es un archivo ModuleInfo binario .proto, como se define en stardoc_output.proto en el árbol de origen de Bazel.

Objetivos de salida implícitos

  • name.binaryproto (la salida predeterminada): Un prototipo binario de ModuleInfo.
  • name.textproto (solo se compila si se solicita de forma explícita): Es la versión en formato .proto de name.binaryproto.

Advertencia: No se garantiza que el formato de salida de esta regla sea estable. Está diseñado principalmente para el uso interno de Stardoc.

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

deps

Lista de etiquetas. El valor predeterminado es [].

Es una lista de destinos que encapsulan los archivos de Starlark que load()src. En condiciones normales de uso, estos destinos deberían ser destinos bzl_library, pero la regla starlark_doc_extract no exige eso y acepta cualquier destino que proporcione archivos de Starlark en su DefaultInfo.

Ten en cuenta que los archivos de Starlark incluidos deben ser archivos del árbol de origen; Bazel no puede incluir archivos load() generados.

src

Label: Obligatoria

Es un archivo de Starlark desde el que se extraerá la documentación.

Ten en cuenta que debe ser un archivo en el árbol de origen; Bazel no puede load() archivos generados.

render_main_repo_name

Booleano; el valor predeterminado es False

Si es verdadero, renderiza las etiquetas en el repositorio principal en la documentación emitida con un componente de repositorio (en otras palabras, //foo:bar.bzl se emitirá como @main_repo_name//foo:bar.bzl).

El nombre que se usará para el repositorio principal se obtiene de module(name = ...) en el archivo MODULE.bazel del repositorio principal (si Bzlmod está habilitado) o de workspace(name = ...) en el archivo WORKSPACE del repositorio principal.

Este atributo debe establecerse en False cuando se genera documentación para archivos de Starlark que se deben usar solo dentro del mismo repositorio y en True cuando se genera documentación para archivos de Starlark que se deben usar desde otros repositorios.

symbol_names

Lista de cadenas; el valor predeterminado es []

Es una lista opcional de nombres calificados de funciones, reglas, proveedores o aspectos exportados (o structs en los que están anidados) para los que se extraerá la documentación. Aquí, un nombre calificado significa el nombre con el que una entidad está disponible para un usuario del módulo, incluidos los structs en los que la entidad está anidada para el espacio de nombres.

starlark_doc_extract emite documentación para una entidad si y solo si se cumplen las siguientes condiciones:

  1. cada componente del nombre calificado de la entidad es público (en otras palabras, el primer carácter de cada componente del nombre calificado es alfabético, no "_"); y
    1. o bien la lista symbol_names está vacía (que es el caso predeterminado), o bien
    2. El nombre calificado de la entidad o el nombre calificado de una estructura en la que se anida la entidad se encuentra en la lista symbol_names.

test_suite

Ver la fuente de la regla
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 registrarte", "pruebas de estrés 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 por el destino //some/test:suite (a esto lo llamamos "expansión de test_suite"), luego Blaze compila y prueba esos destinos.

Ejemplos

Es un conjunto de pruebas para ejecutar todas las pruebas pequeñas del paquete actual.

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

Un paquete de pruebas que ejecuta un conjunto especificado de pruebas:

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

Es 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

Nombre (obligatorio)

Es un nombre único para este destino.

tags

Lista de cadenas; no configurable; el valor predeterminado es []

Es una lista de etiquetas de texto, como "small", "database" o "-flaky". Las etiquetas pueden ser cualquier cadena válida.

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

De manera opcional, para que las etiquetas positivas sean más explícitas, también pueden comenzar con el carácter "+", que no se evaluará como parte del texto de la etiqueta. Simplemente, facilita la lectura de la distinción entre positivo y negativo.

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

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

Ten en cuenta que el size de una prueba se considera una etiqueta a los efectos del filtrado.

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

tests

Lista de etiquetas; no configurable; el valor predeterminado es []

Es una lista de conjuntos de pruebas y destinos de prueba en cualquier idioma.

Aquí se acepta cualquier *_test, independientemente del idioma. Sin embargo, no se aceptan destinos *_binary, incluso si ejecutan una prueba. El filtrado por el tags especificado solo se realiza para las pruebas que se enumeran directamente en este atributo. Si este atributo contiene test_suites, las pruebas dentro de esos no se filtrarán con este test_suite (se considera que ya están filtradas).

Si el atributo tests no se especifica 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 filtrado de tag.