Archivos BUILD

Informar un problema Ver fuente Por la noche · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

En las secciones anteriores, se describieron paquetes, objetivos y etiquetas, y las compilar el gráfico de dependencias de forma abstracta. En esta sección, se describe la sintaxis concreta que se usa para definir un paquete.

Por definición, cada paquete contiene un archivo BUILD, que es un . Los archivos BUILD se evalúan usando un lenguaje imperativo. Starlark.

Se interpretan como una lista secuencial de declaraciones.

En general, el orden sí importa: las variables se deben definir antes de usarse, por ejemplo. Sin embargo, la mayoría de los archivos BUILD consisten solo en declaraciones de reglas de construcción y el orden relativo de estas instrucciones es inmaterial; todas que importa es qué reglas declaradas, y con qué valores, de tiempo de ejecución de la evaluación del paquete.

Cuando se ejecuta una función de regla de compilación, como cc_library, crea un nuevo objetivo en el gráfico. Más adelante, se puede hacer referencia a este destino con una etiqueta.

En archivos BUILD simples, las declaraciones de reglas se pueden reordenar libremente sin cambiar el comportamiento.

Para fomentar una separación clara entre el código y los datos, los archivos BUILD no pueden contienen definiciones de funciones, sentencias for o if (pero las se permiten la comprensión y las expresiones if). Las funciones se pueden declarar en .bzl en su lugar. Además, los argumentos *args y **kwargs no permitido en los archivos BUILD; en su lugar, enumera todos los argumentos de forma explícita.

Cabe destacar que los programas de Starlark no pueden realizar operaciones de E/S arbitrarias. Este invariante hace que la interpretación de los archivos BUILD sea hermética, es decir, depende solo de un archivo conjunto de entradas, lo cual es esencial para garantizar que las compilaciones sean reproducibles. Para obtener más detalles, consulta Hermeticidad.

Los archivos BUILD deben escribirse solo con caracteres ASCII, aunque técnicamente, se interpretan con el grupo de caracteres Latin-1.

Debido a que los archivos BUILD deben actualizarse siempre que las dependencias de la cambio de código subyacente, por lo general, son mantenidas por varias personas en un equipo. Los autores de archivos BUILD deben comentar libremente para documentar el rol. de cada objetivo de compilación, sin importar si está destinado o no para el uso público, y documentar el rol del paquete.

Cómo cargar una extensión

Las extensiones de Bazel son archivos que terminan en .bzl. Usa la sentencia load para importar un símbolo de una extensión.

load("//foo/bar:file.bzl", "some_library")

Este código carga el archivo foo/bar/file.bzl y agrega el símbolo some_library con el medioambiente. Se puede usar para cargar nuevas reglas, funciones o constantes (por ejemplo, una cadena o una lista). Se pueden importar varios símbolos argumentos adicionales a la llamada a load. Los argumentos deben ser literales de cadena (sin variable) y las sentencias load deben aparecer en el nivel superior; no pueden en el cuerpo de una función.

El primer argumento de load es una etiqueta que identifica una .bzl. Si es una etiqueta relativa, se resuelve con respecto a la Paquete (no directorio) que contiene el archivo bzl actual. Etiquetas relativas en Las sentencias load deben usar una : inicial.

load también admite alias; por lo tanto, puedes asignar nombres diferentes al símbolos importados.

load("//foo/bar:file.bzl", library_alias = "some_library")

Puedes definir varios alias dentro de una sentencia load. Además, el puede contener tanto alias como nombres de símbolos regulares. Lo siguiente ejemplo es perfectamente legal (ten en cuenta cuándo utilizar comillas).

load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")

En un archivo .bzl, los símbolos que comienzan con _ no se exportan y no se pueden cargado desde otro archivo.

Puedes usar la visibilidad de la carga para restringir que puede cargar un archivo .bzl.

Tipos de reglas de compilación

La mayoría de las reglas de compilación vienen en familias, agrupadas por idioma. Por ejemplo, cc_binary, cc_library y cc_test son las reglas de compilación para los objetos binarios de C++, bibliotecas y pruebas, respectivamente. En otros idiomas se usa lo mismo. esquema de nombres, con un prefijo diferente, como java_* para Java Algunas de estas funciones se documentan en el Compilar Enciclopedia, pero es posible para que cualquiera cree reglas nuevas.

  • Las reglas *_binary compilan programas ejecutables en un lenguaje determinado. Después de un compilación, el ejecutable residirá en el objeto binario de la herramienta de compilación árbol de resultados con el nombre correspondiente de la etiqueta de la regla por lo que //my:program aparecería (por ejemplo) en $(BINDIR)/my/program.

    En algunos lenguajes, esas reglas también crean un directorio de archivos runfiles. que contenga todos los archivos mencionados en un data atributo que pertenece a la regla, o cualquier regla en su el cierre de dependencias; este conjunto de archivos se junta en en un solo lugar para facilitar la implementación en producción.

  • Las reglas *_test son una especialización de una regla *_binary, que se usa para las y pruebas. Las pruebas son simplemente programas que no devuelven resultados en caso de éxito.

    Al igual que los objetos binarios, las pruebas también tienen árboles de archivos runfiles, y los archivos debajo están los únicos archivos que una prueba puede abrir legítimamente durante el tiempo de ejecución. Por ejemplo, un programa cc_test(name='x', data=['//foo:bar']) podría abrir y leer $TEST_SRCDIR/workspace/foo/bar durante la ejecución. (Cada lenguaje de programación tiene su propia función de utilidad para accediendo al valor de $TEST_SRCDIR, pero todas equivale a usar directamente la variable de entorno) Si no se cumple la regla, la prueba fallará cuando sea se ejecuta en un host de prueba remoto.

  • Las reglas *_library especifican módulos compilados por separado en la de programación centrado en los datos. Las bibliotecas pueden depender de otras bibliotecas, y los objetos binarios y las pruebas pueden depender de bibliotecas, con la capacidad de compilación separada.

Etiquetas Dependencias