Usar Bazel en Windows

Denuncia un problema Ver fuente Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

En esta página, se abordan las prácticas recomendadas para usar Bazel en Windows. Para obtener instrucciones de instalación, consulta Cómo instalar Bazel en Windows.

Problemas conocidos

Los problemas de Bazel relacionados con Windows se marcan con la etiqueta "area-Windows" en GitHub. GitHub-Windows.

Prácticas recomendadas

Evita problemas con rutas de acceso largas

Algunas herramientas tienen la limitación de longitud máxima de la ruta 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 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 rutas de acceso 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 de acceso larga. Para habilitar la creación de nombres 8.3 en todos los volúmenes, ejecuta el siguiente comando:

fsutil 8dot3name set 0

Algunas funciones requieren que Bazel pueda crear symlinks 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 facilitar el proceso, agrega las siguientes líneas a tu archivo 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: Comparación entre la shell de MSYS2, el 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 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 funciones no funcionan, como interrumpir la compilación con Ctrl + C desde MSYS2. Además, si eliges ejecutarlo en MSYS2, debes inhabilitar la conversión automática de rutas de acceso de MSYS2. De lo contrario, MSYS convertirá los argumentos de línea de comandos que parezcan rutas de acceso de Unix (como //foo:bar) en rutas de acceso de Windows. Consulta esta respuesta de StackOverflow para obtener más detalles.

Cómo usar Bazel sin Bash (MSYS2)

Cómo usar la compilación de Bazel sin Bash

Las versiones de Bazel anteriores a la 1.0 solían requerir 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, porque genrules ejecuta comandos de Bash
  • la regla sh_binary o sh_test, ya que, de forma inherente, necesitan Bash
  • Regla de Starlark que usa ctx.actions.run_shell() o ctx.resolve_command()

Sin embargo, genrule se usa a menudo para tareas simples, como copiar un archivo o escribir un archivo de texto. En lugar de usar genrule (y dependiendo de Bash), puedes encontrar una regla adecuada en el repositorio bazel-skylib. Cuando se compilan en Windows, estas reglas no requieren Bash.

Cómo usar la prueba de bazel sin Bash

Las versiones de Bazel anteriores a la 1.0 solían requerir que Bash bazel test cualquier cosa.

A partir de Bazel 1.0, puedes probar cualquier regla sin Bash, excepto en los siguientes casos:

  • Si 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 cualquier cosa.

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)

Cómo usar las reglas sh_binary 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 usan ctx.actions.run_shell() y ctx.resolve_command(). Esto se aplica no solo a las reglas de tu proyecto, sino 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, por el momento, no es una prioridad para el subequipo de Bazel en Windows.

Configura variables de entorno

Las variables de entorno que configuras 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 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 C++ con MSVC, necesitas lo siguiente:

  • El compilador de Visual C++

  • (Opcional) La variable de entorno BAZEL_VC y BAZEL_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 BAZEL_VC. Además, también puedes configurar BAZEL_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 las 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 de BAZEL_VC_FULL_VERSION si se instala más de una versión. 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 se admite).

    • 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

    El SDK de Windows contiene archivos de encabezado y 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 de SDK de Windows 10 completo, como 10.0.10240.0, o especificar 8.1 para usar el SDK de Windows 8.1 (solo hay una versión del SDK de Windows 8.1 disponible). Asegúrate de tener instalado el SDK de Windows especificado.

    Requisito: Se admite en 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 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 orientan a la arquitectura x64. Para especificar una arquitectura de destino diferente, configura 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 de límite de longitud de la línea de comandos de Windows, habilita la función del 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 de compilador compatible con MSVC de LLVM (clang-cl.exe).

Requisito: Para compilar con Clang, debes instalar ambos LLVM y las herramientas de compilación de Visual C++, ya que, aunque usas clang-cl.exe como compilador, aún debes vincular las bibliotecas de Visual C++.

Bazel puede detectar automáticamente la instalación de LLVM en tu sistema, o bien puedes indicarle a Bazel dónde está instalada LLVM de forma explícita con BAZEL_LLVM.

  • BAZEL_LLVM el directorio de instalación de LLVM

    set BAZEL_LLVM=C:\Program Files\LLVM
    

Para habilitar la cadena de herramientas de Clang para compilar C++, existen varias situaciones.

  • 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 tu BUILD file (p. ej., el archivo BUILD 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 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 se habilite 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 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 puedes 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 interesan los detalles sobre cómo Bazel compila destinos de Python en Windows, consulta este documento de diseño.