Definiciones comunes

Informar un problema Ver fuente

En esta sección, se definen varios términos y conceptos comunes a muchas funciones o reglas de compilación.

Contenido

Asignación de token de shell Bourne

Ciertos atributos de string de algunas reglas se dividen en varias palabras de acuerdo con las reglas de asignación de token de la shell Bourne: los espacios sin comillas delimitan palabras separadas, y los caracteres de comillas simples y dobles y las barras inversas se usan para evitar la asignación de token.

Los atributos que están sujetos a esta asignación de token se indican de forma explícita como tales en sus definiciones en este documento.

Por lo general, los atributos sujetos a la expansión de variables "Make" y a la asignación de token de shell Bourne se usan para pasar opciones arbitrarias a compiladores y otras herramientas. Algunos ejemplos de estos atributos son cc_library.copts y java_library.javacopts. Juntas, estas sustituciones permiten que una sola variable de string se expanda en una lista de palabras opción específica de la configuración.

Expansión de etiquetas

Algunos atributos de string de muy pocas reglas están sujetos a expansión de etiquetas: si esas strings contienen una etiqueta válida como subcadena, como //mypkg:target, y esa etiqueta es un requisito declarado de la regla actual, se expande al nombre de ruta del archivo representado por el //mypkg:target de destino.

Los atributos de ejemplo incluyen genrule.cmd y cc_binary.linkopts. Los detalles pueden variar de manera significativa en cada caso debido a problemas como la expansión de las etiquetas relativas, la manera en que se tratan las etiquetas que se expanden a varios archivos, etc. Consulta la documentación de los atributos de las reglas para obtener información específica.

Atributos típicos definidos por la mayoría de las reglas de compilación

En esta sección, se describen los atributos definidos por muchas reglas de compilación, pero no por todos.

Atributo Descripción
data

Lista de etiquetas; el valor predeterminado es []

Archivos que necesita esta regla en el tiempo de ejecución. Puede enumerar las orientaciones de archivo o regla. Por lo general, permite cualquier destino.

Los resultados y los archivos de ejecución predeterminados de los destinos del atributo data deben aparecer en el área *.runfiles de cualquier ejecutable que se ejecute en este destino o que tenga una dependencia del entorno de ejecución en este destino. Esto puede incluir objetos binarios o archivos de datos que se usan cuando se ejecuta la srcs de este destino. Consulta la sección de dependencias de datos para obtener más información sobre cómo depender de los archivos de datos y cómo usarlos.

Las reglas nuevas deben definir un atributo data si procesan entradas que podrían usar otras entradas en el entorno de ejecución. Las funciones de implementación de las reglas también deben propagar los archivos de ejecución del destino a partir de los resultados y los archivos de ejecución de cualquier atributo data, así como de los archivos de ejecución de cualquier atributo de dependencia que proporcione dependencias de código fuente o entorno de ejecución.

deps

Lista de etiquetas; el valor predeterminado es []

Dependencias para este destino. Por lo general, solo deben enumerar los objetivos de la regla. (Aunque algunas reglas permiten que los archivos se enumeren directamente en deps, esto se debe evitar siempre que sea posible).

Por lo general, las reglas específicas para un lenguaje limitan los destinos enumerados a aquellos con proveedores específicos.

La semántica precisa de lo que significa que un destino dependa de otro mediante deps es específica para el tipo de regla, y la documentación específica de la regla profundiza en ella. Por lo general, deps para las reglas que procesan código fuente especifica las dependencias de código que usa el código en srcs.

Por lo general, se usa una dependencia deps para permitir que un módulo use símbolos definidos en otro módulo escritos en el mismo lenguaje de programación y compilados por separado. Las dependencias entre lenguajes también se permiten en muchos casos. Por ejemplo, un destino java_library puede depender del código C++ en un destino cc_library si se enumera este último en el atributo deps. Consulta la definición de dependencias para obtener más información.

licenses

Lista de strings; no configurable; el valor predeterminado es ["none"]

Una lista de cadenas de tipo de licencia que se usarán para este destino en particular. Esto forma parte de una API de licencias obsoleta que Bazel ya no usa. No lo uses.

srcs

Lista de etiquetas; el valor predeterminado es []

Archivos procesados o incluidos por esta regla. Por lo general, enumera los archivos directamente, pero puede enumerar los objetivos de las reglas (como filegroup o genrule) para incluir sus resultados predeterminados.

A menudo, las reglas específicas para un lenguaje requieren que los archivos de la lista tengan extensiones de archivo particulares.

Atributos comunes a todas las reglas de compilación

En esta sección, se describen los atributos que se agregan de forma implícita a todas las reglas de compilación.

Atributo Descripción
compatible_with

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

La lista de entornos para los que se puede compilar este destino, además de los entornos compatibles de forma predeterminada.

Esto es parte del sistema de restricciones de Bazel, que permite a los usuarios declarar qué destinos pueden y no pueden depender unos de otros. Por ejemplo, los objetos binarios que se pueden implementar de forma externa no deberían depender de bibliotecas con código secreto de la empresa. Consulta ConstraintSemantics para obtener más información.

deprecation

String; no configurable; el valor predeterminado es None

Un mensaje de advertencia explicativo asociado con este destino. Por lo general, se usa para notificar a los usuarios que un objetivo se volvió obsoleto, o que fue sustituido por otra regla, que es privado para un paquete o que se considera perjudicial por algún motivo. Es una buena idea incluir alguna referencia (como una página web, un número de error o ejemplos de CL de migración) para que puedas encontrar con facilidad los cambios necesarios para evitar el mensaje. Si hay un destino nuevo que se puede usar como reemplazo gradual, es una buena idea migrar todos los usuarios del destino anterior.

Este atributo no afecta la forma en que se compilan los elementos, pero puede afectar el resultado del diagnóstico de la herramienta de compilación. La herramienta de compilación emite una advertencia cuando una regla con un atributo deprecation depende de un destino en otro paquete.

Las dependencias dentro del paquete están exentas de esta advertencia, por ejemplo, cuando se compilan las pruebas de una regla obsoleta, no se muestra una advertencia.

Si un destino obsoleto depende de otro, no se emite ningún mensaje de advertencia.

Una vez que las personas dejen de usarlo, el objetivo se puede quitar.

distribs

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

Una lista de cadenas de método de distribución que se usarán para este destino específico. Esto forma parte de una API de licencias obsoleta que Bazel ya no usa. No lo uses.

exec_compatible_with

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

Una lista de constraint_values que deben estar presentes en la plataforma de ejecución para este destino. Esto se suma a las restricciones que ya haya establecido el tipo de regla. Las restricciones se usan para restringir la lista de plataformas de ejecución disponibles. Para obtener más detalles, consulta la descripción de la resolución de la cadena de herramientas.

exec_properties

Diccionario de cadenas; el valor predeterminado es {}

Es un diccionario de cadenas que se agregará al exec_properties de una plataforma seleccionada para este destino. Consulta exec_properties de la regla de plataforma.

Si una clave está presente en las propiedades del nivel de la plataforma y del objetivo, el valor se tomará del destino.

features

Lista de cadenas feature; el valor predeterminado es []

Un componente es una etiqueta de cadena que se puede habilitar o inhabilitar en un objetivo. El significado de un atributo depende de la regla en sí.

Este atributo features se combina con el atributo features de nivel de paquete. Por ejemplo, si las funciones ["a", "b"] están habilitadas a nivel de paquete y el atributo features de un destino contiene ["-a", "c"], los atributos habilitados para la regla serán "b" y "c". Mira el ejemplo.

restricted_to

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

Es la lista de entornos para los que se puede compilar este destino, en lugar de los entornos compatibles de forma predeterminada.

Esto es parte del sistema de restricciones de Bazel. Consulta compatible_with para obtener más información.

tags

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

Las etiquetas se pueden usar en cualquier regla. Las etiquetas de prueba y de reglas test_suite son útiles para categorizar las pruebas. Las etiquetas en destinos que no son de prueba se usan para controlar la ejecución en la zona de pruebas de genrule y acciones de Starlark, y para analizarlos con humanos o herramientas externas.

Bazel modifica el comportamiento de su código de zona de pruebas si encuentra las siguientes palabras clave en el atributo tags de cualquier objetivo de prueba o genrule, o bien las claves de execution_requirements para cualquier acción de Starlark.

  • La palabra clave no-sandbox hace que la acción o prueba nunca se somete a una zona de pruebas. Aún se puede almacenar en caché o ejecutarse de forma remota. Usa no-cache o no-remote para evitar una o ambas.
  • La palabra clave no-cache hace que la acción o prueba nunca se almacene en caché (de forma local o remota). Nota: A los fines de esta etiqueta, la caché de disco se considera una caché local, mientras que las cachés HTTP y gRPC se consideran remotas. Otras cachés, como Skyframe o la caché de acciones persistentes, no se ven afectadas.
  • La palabra clave no-remote-cache hace que la acción o la prueba nunca se almacene en caché de forma remota (pero puede almacenarse en caché de manera local y, además, ejecutar de manera remota). Nota: A los fines de esta etiqueta, la caché de disco se considera una caché local, mientras que las cachés HTTP y gRPC se consideran remotas. Otras cachés, como Skyframe o la caché de acciones persistentes, no se ven afectadas. Si se usa una combinación de caché de disco local y caché remota (caché combinada), se trata como una caché remota y se inhabilita por completo, a menos que se establezca --incompatible_remote_results_ignore_disk, en cuyo caso se usarán los componentes locales.
  • La palabra clave no-remote-exec hace que la acción o prueba nunca se ejecute de manera remota (pero puede almacenarse en caché de manera remota).
  • La palabra clave no-remote evita que la acción o la prueba se ejecuten de forma remota o se almacenen en caché de manera remota. Esto equivale a usar no-remote-cache y no-remote-exec.
  • La palabra clave no-remote-cache-upload inhabilita la parte de carga del almacenamiento en caché remoto de una generación. no inhabilita la ejecución remota.
  • La palabra clave local impide que la acción o la prueba se almacene en caché, se ejecute de forma remota o se ejecute dentro de la zona de pruebas. Para genrules y pruebas, marcar la regla con el atributo local = True tiene el mismo efecto.
  • La palabra clave requires-network permite el acceso a la red externa desde el interior de la zona de pruebas. Esta etiqueta solo tiene efecto si está habilitada la zona de pruebas.
  • La palabra clave block-network bloquea el acceso a la red externa desde el interior de la zona de pruebas. En este caso, solo se permite la comunicación con localhost. Esta etiqueta solo tiene efecto si está habilitada la zona de pruebas.
  • requires-fakeroot ejecuta la prueba o la acción como uid y gid 0 (es decir, el usuario raíz). Esto solo se admite en Linux. Esta etiqueta tiene prioridad sobre la opción de línea de comandos --sandbox_fake_username.

Por lo general, se usan etiquetas en las pruebas para anotar la función de una prueba en el proceso de depuración y lanzamiento. Por lo general, las etiquetas son más útiles para las pruebas de C++ y Python, que no tienen capacidad de anotación de tiempo de ejecución. El uso de etiquetas y elementos de tamaño brinda flexibilidad para ensamblar conjuntos de pruebas en función de la política de registro de la base de código.

Bazel modifica el comportamiento de ejecución de pruebas si encuentra las siguientes palabras clave en el atributo tags de la regla de prueba:

  • exclusive forzará la ejecución de la prueba en el modo "exclusivo", lo que garantiza que no se ejecuten otras pruebas al mismo tiempo. Esas pruebas se ejecutarán en serie una vez que se hayan completado toda la actividad de compilación y las pruebas no exclusivas. La ejecución remota está inhabilitada para estas pruebas porque Bazel no tiene control sobre lo que se ejecuta en una máquina remota.
  • exclusive-if-local forzará la ejecución de la prueba en el modo “exclusivo” si se ejecuta de forma local, pero la ejecutará en paralelo si se ejecuta de forma remota.
  • La palabra clave manual excluirá el objetivo de la expansión de los comodines de patrones de objetivo (..., :*, :all, etc.) y las reglas test_suite que no enumeran la prueba de forma explícita cuando se calcula el conjunto de destinos de nivel superior para compilar o ejecutar para los comandos build, test y coverage. No afecta el comodín de destino ni la expansión del conjunto de pruebas en otros contextos, incluido el comando query. Ten en cuenta que manual no implica que los sistemas de compilación o prueba continuos no puedan compilar o ejecutar automáticamente un destino. Por ejemplo, puede ser conveniente excluir un destino de bazel test ... porque requiere marcas específicas de Bazel, pero aun así incluirlo en ejecuciones de pruebas continuas o antes del envío configuradas correctamente.
  • La palabra clave external forzará la ejecución de la prueba de forma incondicional (independientemente del valor --cache_test_results).
Consulta las Convenciones de etiquetas en la Enciclopedia de pruebas para conocer más convenciones sobre las etiquetas adjuntas a los destinos de prueba.
target_compatible_with

Lista de etiquetas; el valor predeterminado es []

Es una lista de constraint_value que deben estar presentes en la plataforma de destino para que este destino se considere compatible. Esto se suma a las restricciones ya establecidas por el tipo de regla. Si la plataforma de destino no cumple con todas las restricciones enumeradas, el destino se considera incompatible. Los destinos incompatibles se omiten para la compilación y las pruebas cuando el patrón de destino se expande (p.ej., //..., :all). Cuando se especifican de forma explícita en la línea de comandos, los destinos incompatibles hacen que Bazel imprima un error y cause un error de compilación o prueba.

Los objetivos que dependen de manera transitiva de destinos incompatibles se consideran incompatibles. También se omiten para la compilación y las pruebas.

Una lista vacía (predeterminada) significa que el destino es compatible con todas las plataformas.

Todas las reglas que no sean reglas de Workspace admiten este atributo. En algunas reglas, este atributo no tiene efecto. Por ejemplo, especificar target_compatible_with para una cc_toolchain no es útil.

Consulta la página Plataformas para obtener más información sobre la omisión de destinos incompatibles.

testonly

Booleano; no configurable; el valor predeterminado es False, excepto para los objetivos de conjuntos de pruebas y pruebas

Si es True, solo los objetivos de solo prueba (como las pruebas) pueden depender de este objetivo.

De forma equivalente, una regla que no sea testonly no puede depender de ninguna regla que sea testonly.

Las pruebas (reglas *_test) y los conjuntos de pruebas (reglas test_suite) son testonly de forma predeterminada.

Este atributo tiene como objetivo indicar que el destino no debe contener objetos binarios que se lanzan a producción.

Debido a que solo el test solo se aplica durante el tiempo de compilación y no de ejecución, y se propaga de forma viral por el árbol de dependencias, se debe aplicar con cuidado. Por ejemplo, los stubs y falsos que son útiles para las pruebas de unidades también pueden ser útiles para las pruebas de integración que involucran los mismos objetos binarios que se lanzarán a producción y, por lo tanto, es probable que no se marquen como solo de prueba. Por el contrario, las reglas que son peligrosas para vincular, quizás porque anulan de forma incondicional el comportamiento normal, definitivamente deben marcarse como solo de prueba.

toolchains

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

Es el conjunto de objetivos a cuyas variables Make puede acceder este destino. Estos destinos son instancias de reglas que proporcionan TemplateVariableInfo o destinos especiales para tipos de cadenas de herramientas compilados en Bazel. Por ejemplo:

  • @bazel_tools//tools/cpp:current_cc_toolchain
  • @bazel_tools//tools/jdk:current_java_runtime

Ten en cuenta que esto es distinto del concepto de resolución de la cadena de herramientas que usan las implementaciones de reglas para la configuración que depende de la plataforma. No puedes usar este atributo para determinar qué cc_toolchain o java_toolchain específico usará un destino.

visibility

Lista de etiquetas; no configurable; el valor predeterminado es default_visibility del paquete si se especifica, o bien "//visibility:private" de lo contrario

El atributo visibility de un destino controla si este se puede usar en otros paquetes. Consulta la documentación para conocer la visibilidad.

Atributos comunes a todas las reglas de prueba (*_test)

En esta sección, se describen los atributos comunes a todas las reglas de prueba.

Atributo Descripción
args

Lista de cadenas; sujeta a la sustitución $(location) y "Make variable", y asignación de token de shell Borne; el valor predeterminado es []

Argumentos de la línea de comandos que Bazel pasa al destino cuando se ejecuta con bazel test.

Estos argumentos se pasan antes que cualquier valor de --test_arg especificado en la línea de comandos de bazel test.

env

Diccionario de cadenas; los valores están sujetos a la sustitución $(location) y "Make variable"; el valor predeterminado es {}

Especifica las variables de entorno adicionales que se establecerán cuando bazel test ejecute la prueba.

Este atributo solo se aplica a reglas nativas, como cc_test, py_test y sh_test. No se aplica a las reglas de prueba definidas por Starlark. Para tus propias reglas de Starlark, puedes agregar un atributo “env” y usarlo para propagar un proveedor de TestEnvironment.

env_inherit

Lista de cadenas; el valor predeterminado es []

Especifica las variables de entorno adicionales que se heredarán del entorno externo cuando bazel test ejecute la prueba.

Este atributo solo se aplica a reglas nativas, como cc_test, py_test y sh_test. No se aplica a las reglas de prueba definidas por Starlark.

size

Cadena "enormous", "large", "medium" o "small"; no configurable; el valor predeterminado es "medium"

Especifica la “pesidad” de un objetivo de prueba, es decir, cuánto tiempo o recursos necesita para ejecutarse.

Las pruebas de unidades se consideran “pequeñas”, las pruebas de integración son “medianas” y las pruebas de extremo a extremo son “grandes” o “enormes”. Bazel usa el tamaño para determinar un tiempo de espera predeterminado, que se puede anular con el atributo timeout. El tiempo de espera es para todas las pruebas en el destino BUILD, no para cada prueba individual. Cuando la prueba se ejecuta de forma local, también se usa size con fines de programación: Bazel intenta respetar el --local_{ram,cpu}_resources y no abrumar la máquina local ejecutando muchas pruebas pesadas al mismo tiempo.

Los tamaños de prueba corresponden a los siguientes tiempos de espera predeterminados y a los usos máximos estimados de recursos locales:

del vocab. RAM (en MB) CPU (en núcleos de CPU) Tiempo de espera predeterminado
poco a poco 20 1 corto (1 minuto)
medium 100 1 moderada (5 minutos)
grandes 300 1 larga (15 minutos)
enorme 800 1 eternal (60 minutos)

La variable de entorno TEST_SIZE se establecerá con el valor de este atributo cuando se genere la prueba.

timeout

Cadena "short", "moderate", "long" o "eternal"; no configurable; el valor predeterminado se deriva del atributo size de la prueba

El tiempo que se espera que se ejecute la prueba antes de que se muestre.

Si bien el atributo de tamaño de una prueba controla la estimación de recursos, el tiempo de espera de una prueba se puede establecer de forma independiente. Si no se especifica de forma explícita, el tiempo de espera se basa en el tamaño de la prueba. El tiempo de espera de la prueba se puede anular con la marca --test_timeout, p.ej., para ejecutarse en ciertas condiciones que se sabe que son lentas. Los valores de tiempo de espera de prueba corresponden a los siguientes períodos:

Valor del tiempo de espera Período
short 1 minuto
Moderada 5 minutos
long 15 minutos
eterno 60 minutos

En tiempos distintos de los anteriores, el tiempo de espera de la prueba se puede anular con la marca de Bazel --test_timeout, p.ej., para la ejecución manual en condiciones que se sabe que son lentas. Los valores de --test_timeout están en segundos. Por ejemplo, --test_timeout=120 establecerá el tiempo de espera de la prueba en dos minutos.

La variable de entorno TEST_TIMEOUT se establecerá en el tiempo de espera de la prueba (en segundos) cuando se genere la prueba.

flaky

Booleano; no configurable; el valor predeterminado es False

Marca la prueba como inestable.

Si se configura, ejecuta la prueba hasta tres veces y la marca como con errores solo si falla cada vez. Según la configuración predeterminada, este atributo se establece como falso y la prueba se ejecuta solo una vez. Ten en cuenta que, en general, no se recomienda el uso de este atributo; las pruebas deben ser exitosas cuando se mantienen sus aserciones.

shard_count

Número entero no negativo menor o igual que 50; el valor predeterminado es -1

Especifica la cantidad de fragmentos paralelos que se usarán para ejecutar la prueba.

Si se establece, este valor anulará cualquier heurística usada para determinar la cantidad de fragmentos paralelos con los que se ejecutará la prueba. Ten en cuenta que, para algunas reglas de prueba, es posible que este parámetro sea necesario para habilitar la fragmentación en primer lugar. Consulta también --test_sharding_strategy.

Si la fragmentación de pruebas está habilitada, la variable de entorno TEST_TOTAL_SHARDS se establecerá en este valor cuando se genere la prueba.

La fragmentación requiere que el ejecutor de pruebas sea compatible con el protocolo de fragmentación de pruebas. Si no es así, es probable que ejecute todas las pruebas en cada fragmento, que no es lo que deseas.

Consulta Fragmentación de pruebas en la enciclopedia de pruebas para obtener detalles sobre la fragmentación.

local

Booleano; no configurable; el valor predeterminado es False

Fuerza la ejecución local de la prueba, sin zona de pruebas.

Si configuras esta opción como verdadera, equivale a proporcionar "local" como una etiqueta (tags=["local"]).

Atributos comunes a todas las reglas binarias (*_binary)

En esta sección, se describen los atributos que son comunes a todas las reglas binarias.

Atributo Descripción
args

Lista de strings; sujeta a la sustitución $(location) y “Make variable”, y asignación de token de shell Borne; no configurable; el valor predeterminado es []

Argumentos de la línea de comandos que Bazel pasará al destino cuando se ejecute mediante el comando run o como una prueba. Estos argumentos se pasan antes que los que se especifican en la línea de comandos bazel run o bazel test.

NOTA: Los argumentos no se pasan cuando ejecutas el destino fuera de Bazel (por ejemplo, cuando ejecutas el objeto binario de forma manual en bazel-bin/).

env

Diccionario de cadenas; los valores están sujetos a la sustitución $(location) y "Make variable"; el valor predeterminado es {}

Especifica las variables de entorno adicionales que se establecerán cuando bazel run ejecute el destino.

Este atributo solo se aplica a reglas nativas, como cc_binary, py_binary y sh_binary. No se aplica a las reglas ejecutables definidas por Starlark.

NOTA: Las variables de entorno no se configuran cuando ejecutas el destino fuera de Bazel (por ejemplo, cuando ejecutas el objeto binario de forma manual en bazel-bin/).

output_licenses

Lista de cadenas; el valor predeterminado es []

Las licencias de los archivos de salida que genera este objeto binario. Esto forma parte de una API de licencias obsoleta que Bazel ya no usa. No lo uses.

Atributos configurables

La mayoría de los atributos son “configurables”, lo que significa que sus valores pueden cambiar cuando el destino se crea de diferentes maneras. Específicamente, los atributos configurables pueden variar según las marcas que se pasan a la línea de comandos de Bazel o la dependencia descendente que solicita el destino. Se puede usar, por ejemplo, para personalizar el destino para varias plataformas o modos de compilación.

En el siguiente ejemplo, se declaran diferentes orígenes para distintas arquitecturas de destino. La ejecución de bazel build :multiplatform_lib --cpu x86 compilará el destino con x86_impl.cc, mientras que, en cambio, sustituir --cpu arm hará que use arm_impl.cc.

cc_library(
    name = "multiplatform_lib",
    srcs = select({
        ":x86_mode": ["x86_impl.cc"],
        ":arm_mode": ["arm_impl.cc"]
    })
)
config_setting(
    name = "x86_mode",
    values = { "cpu": "x86" }
)
config_setting(
    name = "arm_mode",
    values = { "cpu": "arm" }
)

La función select() elige entre diferentes valores alternativos para un atributo configurable según los criterios config_setting o constraint_value que satisface la configuración del destino.

Bazel evalúa los atributos configurables después de procesar macros y antes de procesar las reglas (de manera técnica, entre las fases de carga y análisis). Cualquier procesamiento anterior a la evaluación de select() no sabe qué rama elige la select(). Por ejemplo, las macros no pueden cambiar su comportamiento en función de la rama elegida, y bazel query solo puede realizar conjeturas conservadoras sobre las dependencias configurables de un destino. Consulta estas preguntas frecuentes para obtener más información sobre el uso de select() con reglas y macros.

Los atributos marcados como nonconfigurable en su documentación no pueden usar esta función. Por lo general, un atributo no se puede configurar porque, de forma interna, Bazel necesita conocer su valor antes de determinar cómo resolver un select().

Consulta Atributos de compilación configurables para obtener una descripción general detallada.

Objetivos de salida implícitos

Los resultados implícitos en C++ dejaron de estar disponibles. Evita usarlo en otros idiomas cuando sea posible. Aún no contamos con una ruta de baja, pero con el tiempo también se darán de baja.

Cuando defines una regla de compilación en un archivo BUILD, declaras de forma explícita un destino de regla nuevo con nombre en un paquete. Muchas funciones de las reglas de compilación también implican de forma implícita uno o más objetivos de archivo de salida, cuyos contenidos y significados son específicos de las reglas. Por ejemplo, cuando declaras explícitamente una regla java_binary(name='foo', ...), también declaras de forma implícita un destino de archivo de salida foo_deploy.jar como miembro del mismo paquete. (Este destino específico es un archivo Java autónomo adecuado para la implementación).

Los objetivos de salida implícitos son miembros de primera clase del gráfico de destino global. Al igual que otros destinos, se compilan según demanda, ya sea cuando se especifica en el comando de compilación de nivel superior o cuando son requisitos previos para otros destinos de compilación. Se puede hacer referencia a ellas como dependencias en los archivos BUILD y se pueden observar en el resultado de las herramientas de análisis, como bazel query.

Para cada tipo de regla de compilación, la documentación de la regla incluye una sección especial que detalla los nombres y el contenido de las salidas implícitas relacionadas con una declaración de ese tipo de regla.

Es una distinción importante, pero un tanto sutil, entre los dos espacios de nombres que usa el sistema de compilación: las etiquetas identifican destinos, que pueden ser reglas o archivos, y los destinos de archivo se pueden dividir en destinos de archivo de origen (o de entrada) y objetivos de archivo derivado (o de salida). Estos son los elementos que puedes mencionar en los archivos BUILD, compilar desde la línea de comandos o examinar con bazel query; este es el espacio de nombres de destino. Cada destino de archivo corresponde a un archivo real en el disco (el “espacio de nombres del sistema de archivos”) y cada destino de regla puede corresponder a cero, uno o más archivos reales en el disco. Es posible que haya archivos en el disco que no tengan un destino correspondiente. Por ejemplo, no se puede hacer referencia a los archivos de objeto .o producidos durante la compilación de C++ desde los archivos BUILD ni desde la línea de comandos. De esta manera, la herramienta de compilación puede ocultar ciertos detalles de implementación sobre cómo hace su trabajo. Esto se explica con más detalle en la referencia del concepto de COMPILACIÓN.