Usar Bazel en Windows

Informar un problema Ver fuente Por la noche · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

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

Problemas conocidos

Los problemas de Bazel relacionados con Windows se marcan con el mensaje “team-Windows”. etiqueta en GitHub. Puedes ver los problemas abiertos aquí.

Prácticas recomendadas

Evita problemas con rutas largas

Algunas herramientas tienen la Limitación máxima de longitud de 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 bazelrc:

startup --output_user_root=C:/tmp

Habilitar la compatibilidad con nombres de archivos 8.3

Bazel intenta crear una versión con nombre corto para rutas de acceso a archivos largas. Sin embargo, para hacerlo, la compatibilidad con nombre de archivo 8.3 debe estar habilitada 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

Algunas funciones requieren que Bazel pueda crear symlinks de archivos en Windows. habilitando 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.

Ejecuta Bazel: shell de MSYS2 en comparación con 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/01/2020, no ejecutes Bazel desde bash. desde la shell de MSYS2, Git Bash, Cygwin o cualquier otra variante de Bash. Mientras que Bazel puede funcionar en la mayoría de los casos de uso, pero algunos elementos no funcionan, como interrumpir la compilación con Ctrl + C desde MSYS2). Además, si eliges ejecutar en MSYS2, debes inhabilitar conversión automática de rutas; de lo contrario, MSYS convertirá los argumentos de la línea de comandos que se ven como rutas de acceso de Unix (como //foo:bar) en rutas de acceso de Windows. Consulta esta respuesta de StackOverflow para conocer los 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 que Bash compilara algunas reglas.

A partir de Bazel 1.0, puedes compilar cualquier regla sin Bash, a menos que se trate de lo siguiente:

  • genrule, porque las genrules ejecutan comandos de Bash.
  • Regla sh_binary o sh_test, ya que necesitan Bash de forma inherente
  • Regla de Starlark que usa ctx.actions.run_shell() o ctx.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 la repositorio de 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 hiciera bazel test de elementos.

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)

Usa la ejecución de Bazel sin Bash

Las versiones de Bazel anteriores a la 1.0 solían requerir que Bash hiciera bazel run de elementos.

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

  • usas --run_under o --script_path
  • la regla de prueba en sí requiere Bash (porque su ejecutable es una secuencia de comandos de shell)

Usa reglas binarias y sh*, y ctx.actions.run_shell() sin Bash

Necesitas Bash para compilar y probar reglas de sh_*, y compilar y probar Starlark. reglas que usan ctx.actions.run_shell() y ctx.resolve_command(). Esta no solo se aplica a las reglas de tu proyecto, sino también a las de cualquiera de repositorios de los que depende tu proyecto (incluso de forma transitiva).

En el futuro, tal vez haya una opción para usar el Subsistema de Windows para Linux (WSL) para crear estas reglas, pero actualmente no es una prioridad el subequipo de Bazel en Windows.

Configura variables de entorno

Las variables de entorno que estableces en el Símbolo del sistema de Windows (cmd.exe) solo son se establece en esa sesión del símbolo del sistema. Si inicias un nuevo cmd.exe, debes configura las variables nuevamente. Para establecer siempre las variables cuando se inicia cmd.exe, debes hacer lo siguiente: puedes agregarlas a las variables de usuario o de 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:

  • El compilador de Visual C++.

  • Las variables de entorno BAZEL_VC y BAZEL_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 el las siguientes variables de entorno:

    Para Visual Studio 2017 y 2019, establece una de estas opciones: BAZEL_VC. Además, puedes configurar BAZEL_VC_FULL_VERSION.

    • Usa BAZEL_VC en 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, la versión completa la cantidad de tus herramientas de compilación de Visual C++. Puedes elegir las herramientas de compilación exactas de Visual C++ versión a través de BAZEL_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, configura BAZEL_VC. (BAZEL_VC_FULL_VERSION no es compatible).

    • Usa BAZEL_VC en 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
      
  • Las ventanas SDK.

    El SDK de Windows contiene los archivos de encabezado y las bibliotecas que necesitas cuando compilas Aplicaciones de Windows, incluida Bazel. De forma predeterminada, el último SDK de Windows instalado que se usará. También puedes especificar la versión del SDK de Windows configurando BAZEL_WINSDK_FULL_VERSION. Tú puedes usar un número de SDK completo de Windows 10, como 10.0.10240.0, o especificar 8.1 para usar Windows 8.1 SDK (solo hay una versión disponible del SDK de Windows 8.1). Asegúrate de haber especificado Se instaló el SDK de Windows.

    Requisito: Esto es compatible con VC 2017 y 2019. Las herramientas independientes de compilación VC 2015 no compatibilidad con 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 mismo.

Intenta crear una orientación a partir de uno de nuestros ejemplos proyectos:

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 un valor diferente arquitectura de destino, establece la opción de compilación --cpu para la arquitectura de destino: * x64 (predeterminado): --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 objetivos para la arquitectura ARM, ejecuta lo siguiente:

bazel build //examples/cpp:hello-world --cpu=x64_arm_windows

Para compilar y utilizar Bibliotecas vinculadas de forma dinámica (archivos DLL), consulta esta ejemplo.

Límite de longitud de la línea de comandos: Para evitar que se ejecute Problema de límite de longitud de la línea de comandos de Windows, Habilita la función de archivo de parámetros del compilador mediante --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 herramientas de compilación de Visual C++, ya que, aunque usas clang-cl.exe como compilador, aún debes vincular Bibliotecas de Visual C++.

Bazel puede detectar automáticamente la instalación de LLVM en tu sistema o puedes indicarle de forma explícita Bazel donde BAZEL_LLVM instala LLVM.

  • BAZEL_LLVM el directorio de instalación de LLVM

    set BAZEL_LLVM=C:\Program Files\LLVM
    

Existen varias situaciones para habilitar la cadena de herramientas de Clang a fin de 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 orientación por 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 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",
    )
    

    La opción --incompatible_enable_cc_toolchain_resolution se planea habilitar 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 pueda configurar el entorno para la JVM y ejecutar el objeto binario

Intenta crear una orientación a partir de uno de nuestros ejemplos proyectos:

  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 pueda 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 ejecutarlo Python con el archivo ZIP de extracción automática como argumento

Intenta crear una orientación a partir de uno de nuestros ejemplos proyectos:

  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 información sobre cómo Bazel compila destinos de Python en Windows, mira este diseño .doc.