En esta página, se abordan las prácticas recomendadas para usar Bazel en Windows. Para obtener instrucciones de instalación, consulta Instala Bazel en Windows.
Errores conocidos
Los problemas de Bazel relacionados con Windows se marcan con la etiqueta “team-Windows” en GitHub. Puedes ver los problemas sin resolver aquí.
Prácticas recomendadas
Evita problemas de rutas de acceso extensas
Algunas herramientas tienen la limitación máxima de la ruta de acceso en Windows, incluido el compilador 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 de Bazelrc:
startup --output_user_root=C:/tmp
Habilitar la compatibilidad con nombres de archivo 8.3
Bazel intenta crear una versión con nombre corto para rutas de archivos largas. Sin embargo, para ello, se debe habilitar la compatibilidad con nombres de archivo 8.3 para el volumen en el que reside el archivo con la ruta larga. Puedes habilitar la creación de nombres 8.3 en todos los volúmenes mediante la ejecución del siguiente comando:
fsutil 8dot3name set 0
Habilitar la compatibilidad con symlink
Algunas funciones requieren que Bazel pueda crear symlinks de archivos en Windows, ya sea mediante la habilitación del modo de desarrollador (en Windows 10 1703 o versiones posteriores) o mediante la ejecución de Bazel como administrador. Esto habilita las siguientes funciones:
Para facilitar el proceso, agrega las siguientes líneas a tu archivo de Bazelrc:
startup --windows_enable_symlinks
build --enable_runfiles
Nota: Crear symlinks en Windows es una operación costosa. La marca --enable_runfiles
puede crear una gran cantidad de symlinks de archivos. Habilita esta función solo cuando la necesites.
Ejecución de Bazel: shell de MSYS2 frente al símbolo del sistema y PowerShell
Recomendación: Ejecuta Bazel desde el símbolo del sistema (cmd.exe
) o desde
PowerShell.
A partir del 15 de enero de 2020, no ejecutes Bazel desde bash
, ya sea desde la shell MSYS2, Git Bash, Cygwin ni ninguna otra variante de Bash. Si bien Bazel
puede funcionar en la mayoría de los casos de uso, algunos elementos no funcionan, como
interrumpir la compilación con Ctrl+C de MSYS2).
Además, si eliges ejecutarlo en MSYS2, debes inhabilitar la conversión automática de rutas de MSYS2. De lo contrario, MSYS convertirá los argumentos de la línea de comandos que se parecen a rutas de Unix (como //foo:bar
) en rutas de Windows. Consulta esta respuesta de Stack Overflow para obtener más detalles.
Usa Bazel sin Bash (MSYS2)
Usa la compilación de Bazel sin Bash
Las versiones de Bazel anteriores a la 1.0 solían requerir que Bash compilara algunas reglas.
A partir de Bazel 1.0, puedes compilar cualquier regla sin Bash, a menos que sea:
genrule
, porque genrules ejecuta comandos Bash- Las reglas
sh_binary
osh_test
, ya que estas necesariamente necesitan Bash - Regla de Starlark que usa
ctx.actions.run_shell()
octx.resolve_command()
Sin embargo, genrule
suele usarse 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.
Usa la prueba de Bazel sin Bash
Las versiones de Bazel anteriores a la 1.0 solían requerir que Bash bazel test
lo usara.
A partir de Bazel 1.0, puedes probar cualquier regla sin Bash, excepto cuando:
- usas
--run_under
- La regla de prueba en sí requiere Bash (porque su ejecutable es una secuencia de comandos de shell)
Usa Bazel Run sin Bash
Las versiones de Bazel anteriores a la 1.0 solían requerir que Bash bazel run
lo usara.
A partir de Bazel 1.0, puedes ejecutar cualquier regla sin Bash, excepto cuando:
- usas
--run_under
o--script_path
- La regla de prueba en sí requiere Bash (porque su ejecutable es una secuencia de comandos de shell)
Cómo usar las reglas sh_binary y sh_*, y ="{.actions.run_shell() sin Bash
Necesitas Bash para compilar y probar reglas de sh_*
, así como para compilar y probar reglas de Starlark que usan ctx.actions.run_shell()
y ctx.resolve_command()
. Esto se aplica no solo a las reglas de tu proyecto, sino también a las de cualquiera de los repositorios externos de los que depende tu proyecto (incluso de forma transitiva).
En el futuro, es posible que exista una opción para usar el subsistema de Windows para Linux (WSL) con el objetivo de compilar estas reglas, pero, por el momento, no es una prioridad para el subequipo Bazel-on-Windows.
Configura variables de entorno
Las variables de entorno que estableces en el símbolo del sistema de Windows (cmd.exe
) solo se
configuran en esa sesión del símbolo del sistema. Si inicias un cmd.exe
nuevo, debes volver a configurar las variables. Para configurar siempre las variables cuando se inicia cmd.exe
, puedes agregarlas a las variables de usuario o del sistema en el cuadro de diálogo Control Panel >
System Properties > Advanced > Environment Variables...
.
Compila en Windows
Compila C++ con MSVC
Para compilar destinos de C++ con MSVC, necesitas lo siguiente:
Las variables de entorno
BAZEL_VC
yBAZEL_VC_FULL_VERSION
(opcional).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
BAZEL_VC
. Además, también puedes configurarBAZEL_VC_FULL_VERSION
.BAZEL_VC
: El directorio de instalación de las herramientas de compilación de Visual C++set 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 las herramientas de compilación de Visual C++ a través deBAZEL_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
En Visual Studio 2015 o versiones anteriores, establece
BAZEL_VC
. (BAZEL_VC_FULL_VERSION
no es compatible).BAZEL_VC
: El directorio de instalación de las herramientas de compilación de Visual C++set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
-
El SDK de Windows contiene archivos de encabezado y bibliotecas que necesitas para compilar aplicaciones de Windows, incluido Bazel. De forma predeterminada, se usará el último SDK de Windows 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 una versión del SDK de Windows 8.1 está disponible). Asegúrate de tener instalado el SDK de Windows especificado.Requisito: Es compatible con VC 2017 y 2019. Las herramientas de compilación independientes de VC 2015 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 C++ ahora.
Intenta compilar un destino desde 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 orientan a la arquitectura x64. Si deseas especificar una arquitectura de destino diferente, configura la opción de compilación --cpu
para tu arquitectura de destino:
* x64 (predeterminado): --cpu=x64_windows
o ninguna 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 vinculación dinámica (archivos DLL), consulta este ejemplo.
Límite de longitud de la línea de comandos: Para evitar el problema de límite de longitud de la línea de comandos de Windows, habilita la función de archivos de parámetros del compilador mediante --features=compiler_param_file
.
Compila 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 LLVM y las herramientas de compilación de Visual C++ tanto como las herramientas de compilación de Visual C++ porque, si bien usas clang-cl.exe
como compilador, debes vincular a bibliotecas de Visual C++.
Bazel puede detectar automáticamente la instalación de LLVM en tu sistema, o puedes decirle a Bazel de forma explícita
dónde está instalada LLVM por BAZEL_LLVM
.
BAZEL_LLVM
(el directorio de instalación de LLVM)set BAZEL_LLVM=C:\Program Files\LLVM
Hay varias situaciones para habilitar la cadena de herramientas de Clang para compilar C++.
En Bazel 0.28 y versiones anteriores: Clang no es compatible.
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 una segmentación por 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 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
MODULE.bazel
:
register_execution_platforms( ":x64_windows-clang-cl" ) register_toolchains( "@local_config_cc//:cc-toolchain-x64_windows-clang-cl", )
Se planea que la marca --incompatible_enable_cc_toolchain_resolution esté habilitada de forma predeterminada en versiones futuras 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 de la JVM y ejecutar el objeto binario
Intenta compilar un destino desde 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 de extracción automática como argumento
Puedes ejecutar el archivo ejecutable (tiene una extensión .exe
) o puedes ejecutar Python con el archivo ZIP de extracción automática como argumento.
Intenta compilar un destino desde 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 obtener detalles sobre cómo Bazel compila destinos de Python en Windows, consulta este documento de diseño.