En esta página, se describen las prácticas recomendadas para usar Bazel en Windows. Para obtener instrucciones de instalación, consulta Instala Bazel en Windows.
Problemas conocidos
Los problemas relacionados con Windows en Bazel se marcan con la etiqueta "team-Windows" en GitHub. Aquí puedes ver los problemas abiertos.
Prácticas recomendadas
Evita problemas con rutas largas
Algunas herramientas tienen la Limitación de longitud máxima de la ruta de acceso en Windows, incluido el compilador de MSVC. Para evitar este problema, puedes especificar un directorio de salida corto para Bazel con la marca --output_user_root.
Por ejemplo, agrega la siguiente línea a tu archivo bazelrc:
startup --output_user_root=C:/tmp
Habilita la compatibilidad con nombres de archivo 8.3
Bazel intenta crear una versión de nombre corto para las rutas de archivos largas. Sin embargo, para hacerlo, se debe habilitar la compatibilidad con nombres de archivo 8.3 para el volumen en el que reside el archivo con la ruta de acceso larga. Puedes habilitar la creación de nombres 8.3 en todos los volúmenes ejecutando el siguiente comando:
fsutil 8dot3name set 0
Habilita la compatibilidad con vínculos simbólicos
Algunas funciones requieren que Bazel pueda crear vínculos simbólicos de archivos en Windows, ya sea habilitando el Modo de desarrollador (en Windows 10, versión 1703 o posterior) o ejecutando Bazel como administrador. Esto habilita las siguientes funciones:
Para que sea más fácil, agrega las siguientes líneas a tu archivo bazelrc:
startup --windows_enable_symlinks
build --enable_runfiles
Nota: Crear vínculos simbólicos en Windows es una operación costosa. La marca --enable_runfiles
puede crear una gran cantidad de vínculos simbólicos de archivos. Habilita esta función solo cuando la necesites.
Ejecución de Bazel: Shell de MSYS2, símbolo del sistema y PowerShell
Recomendación: Ejecuta Bazel desde el símbolo del sistema (cmd.exe
) o desde PowerShell.
Desde el 15/01/2020, no ejecutes Bazel desde bash
, ya sea desde el shell de MSYS2, Git Bash, Cygwin o cualquier otra variante de Bash. Si bien Bazel puede funcionar para la mayoría de los casos de uso, algunas cosas no funcionan, como interrumpir la compilación con Ctrl+C desde MSYS2.
Además, si eliges ejecutar bajo MSYS2, debes inhabilitar la conversión automática de rutas de acceso de MSYS2. De lo contrario, MSYS convertirá los argumentos de la línea de comandos que parecen rutas de acceso de Unix (como //foo:bar
) en rutas de acceso de Windows. Consulta esta respuesta de Stack Overflow para obtener más detalles.
Cómo usar Bazel sin Bash (MSYS2)
Cómo usar bazel build sin Bash
Las versiones de Bazel anteriores a la 1.0 requerían Bash para compilar algunas reglas.
A partir de Bazel 1.0, puedes compilar cualquier regla sin Bash, a menos que sea una de las siguientes:
genrule
, ya que las genrules ejecutan comandos de Bash- Regla
sh_binary
osh_test
, ya que estas requieren Bash de forma inherente - Regla de Starlark que usa
ctx.actions.run_shell()
octx.resolve_command()
Sin embargo, genrule
se suele usar para tareas simples, como copiar un archivo o escribir un archivo de texto.
En lugar de usar genrule
(y según Bash), puedes encontrar una regla adecuada en el repositorio bazel-skylib.
Cuando se compilan en Windows, estas reglas no requieren Bash.
Cómo usar bazel test sin Bash
Las versiones de Bazel anteriores a la 1.0 requerían Bash para bazel test
cualquier elemento.
A partir de Bazel 1.0, puedes probar cualquier regla sin Bash, excepto en los siguientes casos:
- usas
--run_under
- La regla de prueba en sí requiere Bash (porque su ejecutable es una secuencia de comandos de shell).
Cómo usar bazel run sin Bash
Las versiones de Bazel anteriores a la 1.0 requerían Bash para bazel run
cualquier elemento.
A partir de Bazel 1.0, puedes ejecutar cualquier regla sin Bash, excepto en los siguientes casos:
- Si usas
--run_under
o--script_path
- La regla de prueba en sí requiere Bash (porque su ejecutable es una secuencia de comandos de shell).
Uso de reglas shbinary y sh*, y ctx.actions.run_shell() sin Bash
Necesitas Bash para compilar y probar reglas de sh_*
, y para compilar y probar reglas de Starlark que usen ctx.actions.run_shell()
y ctx.resolve_command()
. Esto se aplica no solo a las reglas de tu proyecto, sino también a las reglas de cualquiera de los repositorios externos de los que depende tu proyecto (incluso de forma transitiva).
En el futuro, es posible que haya una opción para usar el Subsistema de Windows para Linux (WSL) para compilar estas reglas, pero, actualmente, no es una prioridad para el subequipo de Bazel en Windows.
Configura variables de entorno
Las variables de entorno que configures en el símbolo del sistema de Windows (cmd.exe
) solo se establecerán en esa sesión del símbolo del sistema. Si inicias un nuevo cmd.exe
, deberás volver a configurar las variables. Para establecer siempre las variables cuando se inicia cmd.exe
, puedes agregarlas a las variables del usuario o del sistema en el cuadro de diálogo Control Panel >
System Properties > Advanced > Environment Variables...
.
Compila en Windows
Cómo compilar C++ con MSVC
Para compilar destinos de C++ con MSVC, necesitas lo siguiente:
(Opcional) Las variables de entorno
BAZEL_VC
yBAZEL_VC_FULL_VERSION
Bazel detecta automáticamente el compilador de Visual C++ en tu sistema. Para indicarle a Bazel que use una instalación de VC específica, puedes configurar las siguientes variables de entorno:
Para Visual Studio 2017 y 2019, establece uno de los
BAZEL_VC
. Además, también puedes establecerBAZEL_VC_FULL_VERSION
.BAZEL_VC
el directorio de instalación de Visual C++ Build Toolsset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
BAZEL_VC_FULL_VERSION
(opcional) Solo para Visual Studio 2017 y 2019, el número de versión completo de tus herramientas de compilación de Visual C++. Puedes elegir la versión exacta de Visual C++ Build Tools conBAZEL_VC_FULL_VERSION
si hay más de una versión instalada. De lo contrario, Bazel elegirá la versión más reciente.set BAZEL_VC_FULL_VERSION=14.16.27023
Para Visual Studio 2015 o versiones anteriores, establece
BAZEL_VC
. (BAZEL_VC_FULL_VERSION
no es compatible).BAZEL_VC
el directorio de instalación de Visual C++ Build Toolsset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
-
El SDK de Windows contiene los archivos de encabezado y las bibliotecas que necesitas cuando compilas aplicaciones para Windows, incluido Bazel. De forma predeterminada, se usará el SDK de Windows más reciente instalado. También puedes especificar la versión del SDK de Windows configurando
BAZEL_WINSDK_FULL_VERSION
. Puedes usar un número completo del SDK de Windows 10, como 10.0.10240.0, o especificar 8.1 para usar el SDK de Windows 8.1 (solo hay disponible una versión del SDK de Windows 8.1). Asegúrate de tener instalado el SDK de Windows especificado.Requisito: Esta función es compatible con VC 2017 y 2019. Las herramientas de compilación de VC 2015 independientes no admiten la selección del SDK de Windows. Necesitarás la instalación completa de Visual Studio 2015. De lo contrario, se ignorará
BAZEL_WINSDK_FULL_VERSION
.set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
Si todo está configurado, puedes compilar un destino de C++ ahora.
Intenta compilar un destino a partir de uno de nuestros proyectos de muestra:
bazel build //examples/cpp:hello-world
bazel-bin\examples\cpp\hello-world.exe
De forma predeterminada, los objetos binarios compilados se dirigen a la arquitectura x64. Para especificar una arquitectura de destino diferente, establece la opción de compilación --cpu
para tu arquitectura de destino:
* x64 (predeterminada): --cpu=x64_windows
o sin opción
* x86: --cpu=x64_x86_windows
* ARM: --cpu=x64_arm_windows
* ARM64: --cpu=arm64_windows
Por ejemplo, para compilar destinos para la arquitectura ARM, ejecuta lo siguiente:
bazel build //examples/cpp:hello-world --cpu=x64_arm_windows
Para compilar y usar bibliotecas de vínculos dinámicos (archivos DLL), consulta este ejemplo.
Límite de longitud de la línea de comandos: Para evitar el problema del límite de longitud de la línea de comandos de Windows, habilita la función de archivo de parámetros del compilador a través de --features=compiler_param_file
.
Cómo compilar C++ con Clang
A partir de la versión 0.29.0, Bazel admite la compilación con el controlador del compilador compatible con MSVC de LLVM (clang-cl.exe
).
Requisito: Para compilar con Clang, debes instalar tanto
LLVM como las herramientas de compilación de Visual C++, ya que, aunque uses clang-cl.exe
como compilador, deberás vincularte a las bibliotecas de Visual C++.
Bazel puede detectar automáticamente la instalación de LLVM en tu sistema, o bien puedes indicarle explícitamente a Bazel dónde se instaló LLVM con BAZEL_LLVM
.
BAZEL_LLVM
el directorio de instalación de LLVMset BAZEL_LLVM=C:\Program Files\LLVM
Existen varias situaciones en las que se puede habilitar la cadena de herramientas de Clang para compilar C++.
En bazel 0.28 y versiones anteriores, no se admite Clang.
Sin
--incompatible_enable_cc_toolchain_resolution
: Puedes habilitar la cadena de herramientas de Clang con una marca de compilación--compiler=clang-cl
.Con
--incompatible_enable_cc_toolchain_resolution
: Debes agregar un destino de plataforma a tuBUILD file
(p. ej., el archivoBUILD
de nivel superior):platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", ], )
Luego, puedes habilitar la cadena de herramientas de Clang de una de las siguientes dos maneras:
- Especifica las siguientes marcas de compilación:
--extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
- Registra la plataforma y la cadena de herramientas en tu archivo
WORKSPACE
:
register_execution_platforms( ":x64_windows-clang-cl" ) register_toolchains( "@local_config_cc//:cc-toolchain-x64_windows-clang-cl", )
Se planea habilitar la marca --incompatible_enable_cc_toolchain_resolution de forma predeterminada en una versión futura de Bazel. Por lo tanto, se recomienda habilitar la compatibilidad con Clang con el segundo enfoque.
Compila Java
Para compilar destinos de Java, necesitas lo siguiente:
En Windows, Bazel compila dos archivos de salida para las reglas java_binary
:
- Un archivo
.jar
- Un archivo
.exe
que puede configurar el entorno para la JVM y ejecutar el archivo binario
Intenta compilar un destino a partir de uno de nuestros proyectos de muestra:
bazel build //examples/java-native/src/main/java/com/example/myproject:hello-world
bazel-bin\examples\java-native\src\main\java\com\example\myproject\hello-world.exe
Compila Python
Para compilar destinos de Python, necesitas lo siguiente:
En Windows, Bazel compila dos archivos de salida para las reglas py_binary
:
- un archivo ZIP autoextraíble
- Un archivo ejecutable que puede iniciar el intérprete de Python con el archivo ZIP autoextraíble como argumento
Puedes ejecutar el archivo ejecutable (tiene una extensión .exe
) o ejecutar Python con el archivo ZIP autoextraíble como argumento.
Intenta compilar un destino a partir de uno de nuestros proyectos de muestra:
bazel build //examples/py_native:bin
bazel-bin\examples\py_native\bin.exe
python bazel-bin\examples\py_native\bin.zip
Si te interesa conocer los detalles sobre cómo Bazel compila destinos de Python en Windows, consulta este documento de diseño.