- Uso
- Variables predefinidas
- Variables predefinidas de genrule
- Variables predefinidas de ruta de acceso de origen o salida
- Variables personalizadas
Las variables de "fabricación" son una clase especial de variables de cadena expandibles disponibles para los atributos marcados como "Sujeto a sustitución de 'variable de fabricación'".
Por ejemplo, se pueden usar para insertar rutas de acceso específicas de la cadena de herramientas en acciones de compilación creadas por el usuario.
Bazel proporciona variables predefinidas, que están disponibles para todos los destinos, y variables personalizadas, que se definen en los destinos de dependencia y solo están disponibles para los destinos que dependen de ellos.
El motivo del término "Make" es histórico: la sintaxis y la semántica de estas variables se diseñaron originalmente para que coincidieran con GNU Make.
Usar
Los atributos marcados como "Sujetos a sustitución de "Make variable"" pueden hacer referencia a la variable "Make" FOO
de la siguiente manera:
my_attr = "prefix $(FOO) suffix"
En otras palabras, cualquier subcadena que coincida con $(FOO)
se expande al valor de FOO
. Si ese valor es "bar"
, la cadena final se convierte en:
my_attr = "prefix bar suffix"
Si FOO
no corresponde a una variable conocida por el destino de consumo, Bazel falla con un error.
Las variables de "Make" cuyos nombres son símbolos que no son letras, como @
, también se pueden hacer referencia usando solo un signo de dólar, sin los paréntesis. Por ejemplo:
my_attr = "prefix $@ suffix"
Para escribir $
como un literal de cadena (es decir, para evitar la expansión de variables), escribe $$
.
Variables predefinidas
Se puede hacer referencia a las variables "Make" predefinidas en cualquier atributo marcado como "Sujeto a sustitución de 'variable Make'" en cualquier destino.
Para ver la lista de estas variables y sus valores para un conjunto determinado de opciones de compilación, ejecuta el siguiente comando:
bazel info --show_make_env [build options]
y observa las primeras líneas de salida con letras mayúsculas.
Consulta un ejemplo de variables predefinidas.
Variables de opciones de la cadena de herramientas
COMPILATION_MODE
:fastbuild
,dbg
oopt
. (Más detalles)
Variables de ruta de acceso
-
BINDIR
: Es la base del árbol binario generado para la arquitectura de destino.Ten en cuenta que se puede usar un árbol diferente para los programas que se ejecutan durante la compilación en la arquitectura del host, para admitir la compilación cruzada.
Si deseas ejecutar una herramienta desde un
genrule
, la forma recomendada de obtener su ruta de acceso es$(execpath toolname)
, donde toolname debe aparecer en el atributotools
delgenrule
. GENDIR
: Es la base del árbol de código generado para la arquitectura de destino.
Variables de arquitectura de la máquina
-
TARGET_CPU
: CPU de la arquitectura de destino, p.ej.,k8
.
Variables predefinidas de genrule
Los siguientes están disponibles especialmente para el atributo cmd
de genrule
y, en general, son importantes para que ese atributo funcione.
Consulta un ejemplo de variables predefinidas de genrule.
OUTS
: Es la lista deouts
del objetogenrule
. Si solo tienes un archivo de salida, también puedes usar$@
.-
SRCS
: Es la listasrcs
delgenrule
(o, más precisamente, los nombres de ruta de acceso de los archivos correspondientes a las etiquetas de la listasrcs
). Si solo tienes un archivo fuente, también puedes usar$<
. -
<
:SRCS
, si es un solo archivo. De lo contrario, se activará un error de compilación. -
@
:OUTS
, si es un solo archivo. De lo contrario, se activará un error de compilación. -
RULEDIR
: Es el directorio de salida del destino, es decir, el directorio correspondiente al nombre del paquete que contiene el destino en el árbolgenfiles
obin
. En el caso de//my/pkg:my_genrule
, siempre termina enmy/pkg
, incluso si las salidas de//my/pkg:my_genrule
están en subdirectorios. -
@D
: Es el directorio de salida. Si outs tiene una entrada, se expande al directorio que contiene ese archivo. Si tiene varias entradas, se expande al directorio raíz del paquete en el árbolgenfiles
, incluso si todos los archivos de salida están en el mismo subdirectorio.Nota: Usa
RULEDIR
en lugar de@D
porqueRULEDIR
tiene una semántica más simple y se comporta de la misma manera, independientemente de la cantidad de archivos de salida.Si la regla genrule necesita generar archivos intermedios temporales (quizás como resultado de usar alguna otra herramienta, como un compilador), debe intentar escribirlos en
@D
(aunque/tmp
también se podrá escribir) y quitarlos antes de finalizar.En especial, evita escribir en directorios que contengan entradas. Pueden estar en sistemas de archivos de solo lectura. Incluso si no es así, hacerlo dañaría el árbol de origen.
Variables predefinidas de ruta de acceso de entrada o salida
Las variables predefinidas execpath
, execpaths
, rootpath
, rootpaths
, location
y locations
toman parámetros de etiqueta (p.ej., $(execpath
//foo:bar)
) y sustituyen las rutas de acceso a archivos que denota esa etiqueta.
En el caso de los archivos fuente, esta es la ruta de acceso relativa a la raíz de tu espacio de trabajo. En el caso de los archivos que son resultados de reglas, esta es la ruta de acceso de salida del archivo (consulta la explicación de los archivos de salida a continuación).
Consulta un ejemplo de variables de ruta predefinidas.
-
execpath
: Denota la ruta de acceso debajo de execroot donde Bazel ejecuta acciones de compilación.En el ejemplo anterior, Bazel ejecuta todas las acciones de compilación en el directorio vinculado por el vínculo simbólico
bazel-myproject
en la raíz de tu espacio de trabajo. El archivo fuenteempty.source
está vinculado en la ruta de accesobazel-myproject/testapp/empty.source
. Por lo tanto, su ruta de ejecución (que es la subruta debajo de la raíz) estestapp/empty.source
. Esta es la ruta de acceso que las acciones de compilación pueden usar para encontrar el archivo.Los archivos de salida se organizan de manera similar, pero también se les agrega el prefijo de la ruta de acceso secundaria
bazel-out/cpu-compilation_mode/bin
(obazel-out/cpu-opt-exec-hash/bin
para las salidas de las herramientas). En el ejemplo anterior,//testapp:app
es una herramienta porque aparece en el atributotools
deshow_app_output
. Por lo tanto, su archivo de salidaapp
se escribe enbazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
. Por lo tanto, la ruta de acceso de ejecución esbazel-out/cpu-opt-exec-hash/bin/testapp/app
. Este prefijo adicional permite compilar el mismo destino para, por ejemplo, dos CPU diferentes en la misma compilación sin que los resultados se sobrescriban entre sí.La etiqueta que se pasa a esta variable debe representar exactamente un archivo. Para las etiquetas que representan archivos fuente, esto es automáticamente verdadero. En el caso de las etiquetas que representan reglas, la regla debe generar exactamente un resultado. Si es falso o la etiqueta no tiene el formato correcto, la compilación falla con un error.
-
rootpath
: Indica la ruta de acceso que un archivo binario compilado puede usar para encontrar una dependencia en el tiempo de ejecución en relación con el subdirectorio de su directorio de archivos de ejecución correspondiente al repositorio principal. Nota: Esto solo funciona si--enable_runfiles
está habilitado, lo que no sucede en Windows de forma predeterminada. En su lugar, usarlocationpath
para la compatibilidad con varias plataformas.Es similar a
execpath
, pero quita los prefijos de configuración descritos anteriormente. En el ejemplo anterior, esto significa queempty.source
yapp
usan rutas puras relativas al espacio de trabajo:testapp/empty.source
ytestapp/app
.El
rootpath
de un archivo en un repositorio externorepo
comenzará con../repo/
, seguido de la ruta de acceso relativa al repositorio.Tiene los mismos requisitos de "una sola salida" que
execpath
. -
rlocationpath
: Es la ruta de acceso que un objeto binario compilado puede pasar a la funciónRlocation
de una biblioteca de runfiles para encontrar una dependencia en el tiempo de ejecución, ya sea en el directorio de runfiles (si está disponible) o con el manifiesto de runfiles.Es similar a
rootpath
, ya que no contiene prefijos de configuración, pero se diferencia en que siempre comienza con el nombre del repositorio. En el ejemplo anterior, esto significa queempty.source
yapp
generan las siguientes rutas de acceso:myproject/testapp/empty.source
ymyproject/testapp/app
.El
rlocationpath
de un archivo en un repositorio externorepo
comenzará conrepo/
, seguido de la ruta de acceso relativa al repositorio.Pasar esta ruta de acceso a un archivo binario y resolverla en una ruta de acceso del sistema de archivos con las bibliotecas de runfiles es el enfoque preferido para encontrar dependencias en el tiempo de ejecución. En comparación con
rootpath
, tiene la ventaja de que funciona en todas las plataformas y, también, si el directorio de archivos ejecutables no está disponible.Tiene los mismos requisitos de "una sola salida" que
execpath
. -
location
: Es un sinónimo deexecpath
orootpath
, según el atributo que se expanda. Este es un comportamiento heredado anterior a Starlark y no se recomienda, a menos que sepas realmente lo que hace para una regla en particular. Consulta #2475 para obtener más información.
execpaths
, rootpaths
, rlocationpaths
y locations
son las variaciones en plural de execpath
, rootpath
, rlocationpath
y location
, respectivamente. Admiten etiquetas que producen varios resultados, en cuyo caso cada resultado se enumera separado por un espacio. Las reglas sin salida y las etiquetas con formato incorrecto producen errores de compilación.
Todas las etiquetas a las que se hace referencia deben aparecer en los archivos de salida srcs
o deps
del destino de consumo. De lo contrario, la compilación fallará. Los destinos de C++ también pueden hacer referencia a etiquetas en data
.
Las etiquetas no tienen que estar en formato canónico: foo
, :foo
y //somepkg:foo
son válidas.
Variables personalizadas
Se puede hacer referencia a las variables "Make" personalizadas desde cualquier atributo marcado como "Sujeto a sustitución de la variable Make", pero solo en los destinos que dependen de otros destinos que definen estas variables.
Como práctica recomendada, todas las variables deben ser personalizadas, a menos que haya un motivo muy bueno para incorporarlas a Bazel Core. Esto evita que Bazel tenga que cargar dependencias potencialmente costosas para proporcionar variables que los objetivos que consumen no necesitan.
Variables de la cadena de herramientas de C++
Los siguientes se definen en las reglas de la cadena de herramientas de C++ y están disponibles para cualquier regla que establezca toolchains =
["@bazel_tools//tools/cpp:current_cc_toolchain"]
. Algunas reglas, como java_binary
, incluyen implícitamente la cadena de herramientas de C++ en su definición de regla. Heredan estas variables automáticamente.
Las reglas integradas de C++ son mucho más sofisticadas que "ejecutar el compilador en él". Para admitir modos de compilación tan diversos como *SAN, ThinLTO, con o sin módulos, y archivos binarios cuidadosamente optimizados, además de pruebas de ejecución rápida en múltiples plataformas, las reglas integradas se esfuerzan por garantizar que se establezcan las entradas, las salidas y las marcas de línea de comandos correctas en cada una de las acciones generadas internamente, que pueden ser varias.
Estas variables son un mecanismo de resguardo que los expertos en idiomas pueden usar en casos excepcionales. Si te sientes tentado a usarlos, primero comunícate con los desarrolladores de Bazel.
ABI
: Es la versión de la ABI de C++.-
AR
: El comando "ar" de crosstool. -
C_COMPILER
: Es el identificador del compilador de C/C++, p.ej.,llvm
. -
CC
: Es el comando del compilador de C y C++.Te recomendamos que siempre uses
CC_FLAGS
en combinación conCC
. Si no lo haces, será bajo tu propia responsabilidad. CC_FLAGS
: Es un conjunto mínimo de marcas para que el compilador de C/C++ pueda usarse con genrules. En particular, contiene marcas para seleccionar la arquitectura correcta siCC
admite varias arquitecturas.-
DUMPBIN
: Microsoft COFF Binary File Dumper (dumpbin.exe) de Microsoft Visual Studio. -
NM
: El comando "nm" de crosstool. -
OBJCOPY
: Es el comando objcopy del mismo conjunto que el compilador de C/C++. -
STRIP
: Es el comando strip del mismo conjunto que el compilador de C/C++.
Variables de la cadena de herramientas de Java
Los siguientes se definen en las reglas de la cadena de herramientas de Java y están disponibles para cualquier regla que establezca toolchains =
["@rules_java//toolchains:current_java_runtime"]
(o "@rules_java//toolchains:current_host_java_runtime"
para el equivalente de la cadena de herramientas del host).
La mayoría de las herramientas del JDK no deben usarse directamente. Las reglas integradas de Java usan enfoques mucho más sofisticados para la compilación y el empaquetado de Java que los que pueden expresar las herramientas upstream, como los Jars de interfaz, los Jars de interfaz de encabezado y las implementaciones de empaquetado y combinación de Jars altamente optimizadas.
Estas variables son un mecanismo de resguardo que los expertos en idiomas pueden usar en casos excepcionales. Si te sientes tentado a usarlos, primero comunícate con los desarrolladores de Bazel.
-
JAVA
: El comando "java" (una máquina virtual Java). Evita esto y, en su lugar, usa una reglajava_binary
siempre que sea posible. Puede ser una ruta de acceso relativa. Si debes cambiar de directorio antes de invocarjava
, debes capturar el directorio de trabajo antes de cambiarlo. JAVABASE
: Es el directorio base que contiene las utilidades de Java. Puede ser una ruta de acceso relativa. Tendrá un subdirectorio "bin".
Variables definidas por Starlark
Los escritores de reglas y cadenas de herramientas pueden definir variables completamente personalizadas devolviendo un proveedor de TemplateVariableInfo. Cualquier regla que dependa de estos a través del atributo toolchains
puede leer sus valores: