Como usar o Bazel no Windows

Nesta página, abordamos as práticas recomendadas para usar o Bazel no Windows. Para instruções de instalação, consulte Instalar o Bazel no Windows.

Problemas conhecidos

Os problemas do Bazel relacionados ao Windows são marcados com o rótulo "team-Windows" no GitHub. Você pode ver os problemas pendentes aqui.

Práticas recomendadas

Evitar problemas de caminho longo

Algumas ferramentas têm a limitação de tamanho máximo do caminho no Windows, incluindo o compilador MSVC. Para evitar esse problema, especifique um diretório de saída curto para o Bazel pela sinalização --output_user_root.

Por exemplo, adicione a seguinte linha ao arquivo bazelrc:

startup --output_user_root=C:/tmp

Ativar o suporte a nomes de arquivo 8.3

O Bazel tenta criar uma versão de nome curto para caminhos de arquivos longos. Mas, para isso, o suporte a nomes de arquivo 8.3 precisa ser ativado para o volume no qual está o arquivo com o caminho longo. É possível ativar a criação de nomes 8.3 em todos os volumes executando o seguinte comando:

fsutil 8dot3name set 0

Alguns recursos exigem que o Bazel crie links simbólicos de arquivos no Windows, ativando o Modo de desenvolvedor (no Windows 10 versão 1703 ou mais recente) ou executando o Bazel como administrador. Isso ativa os seguintes recursos:

Para facilitar, adicione as seguintes linhas ao seu arquivo bazelrc:

startup --windows_enable_symlinks
build --enable_runfiles

Observação: a criação de links simbólicos no Windows é uma operação cara. A sinalização --enable_runfiles pode criar uma grande quantidade de links simbólicos de arquivos. Só ative esse recurso quando necessário.

Como executar o Bazel: shell MSYS2 x prompt de comando x PowerShell

Recomendação:execute o Bazel no prompt de comando (cmd.exe) ou no PowerShell.

A partir de 15/01/2020, não execute o Bazel em bash, seja do shell MSYS2, Git Bash, Cygwin ou qualquer outra variante Bash. Embora o Bazel possa funcionar na maioria dos casos de uso, algumas coisas apresentam falhas, como a interrupção do build com Ctrl+C do MSYS2. Além disso, se você optar por executar no MSYS2, será necessário desativar a conversão automática de caminho do MSYS2. Caso contrário, o MSYS converterá os argumentos de linha de comando que se parecem com caminhos Unix (como //foo:bar) em caminhos do Windows. Veja esta resposta do StackOverflow para mais detalhes.

Como usar o Bazel sem Bash (MSYS2)

Como usar o build do bazel sem Bash

As versões do Bazel anteriores à 1.0 exigiam o Bash para criar algumas regras.

A partir do Bazel 1.0, você pode criar qualquer regra sem Bash, a menos que seja:

  • genrule, porque as regras gerais executam comandos Bash
  • a regra sh_binary ou sh_test, porque elas precisam de Bash
  • Regra do Starlark que usa ctx.actions.run_shell() ou ctx.resolve_command()

No entanto, o genrule costuma ser usado para tarefas simples, como copiar um arquivo ou gravar um arquivo de texto. Em vez de usar genrule (e, dependendo de Bash), você pode encontrar uma regra adequada no repositório bazel-skylib (em inglês). Quando criadas no Windows, essas regras não exigem Bash.

Como usar o teste do Bazel sem Bash

As versões do Bazel anteriores à 1.0 exigiam que o Bash aplicasse qualquer coisa em bazel test.

A partir do Bazel 1.0, é possível testar qualquer regra sem Bash, exceto quando:

  • você usar --run_under;
  • a regra de teste em si requer Bash (porque seu executável é um script de shell)

Como usar o bazel run sem Bash

As versões do Bazel anteriores à 1.0 exigiam que o Bash aplicasse qualquer coisa em bazel run.

A partir do Bazel 1.0, é possível executar qualquer regra sem Bash, exceto quando:

  • você usar --run_under ou --script_path
  • a regra de teste em si requer Bash (porque seu executável é um script de shell)

Como usar regras shbinary e sh* e ctx.actions.run_shell() sem Bash

Você precisa do Bash para criar e testar regras sh_* e criar e testar regras do Starlark que usam ctx.actions.run_shell() e ctx.resolve_command(). Isso se aplica não apenas às regras do projeto, mas às regras de qualquer um dos repositórios externos de que o projeto depende (até mesmo de forma transitiva).

No futuro, pode haver uma opção para usar o subsistema Windows para Linux (WSL) para criar essas regras, mas atualmente isso não é uma prioridade para a subequipe do Bazel no Windows.

Como definir variáveis de ambiente

As variáveis de ambiente que você define no prompt de comando do Windows (cmd.exe) são definidas apenas nessa sessão do prompt de comando. Se você iniciar um novo cmd.exe, será necessário definir as variáveis novamente. Para sempre definir as variáveis quando cmd.exe for iniciado, adicione-as a "Variáveis de usuário" ou "Variáveis do sistema" na caixa de diálogo Control Panel > System Properties > Advanced > Environment Variables....

Criar no Windows

Criar C++ com MSVC

Para criar destinos C++ com MSVC, você precisa de:

  • O compilador do Visual C++

  • (Opcional) As variáveis de ambiente BAZEL_VC e BAZEL_VC_FULL_VERSION.

    O Bazel detecta automaticamente o compilador do Visual C++ no seu sistema. Para instruir o Bazel a usar uma instalação de VC específica, defina as seguintes variáveis de ambiente:

    Para o Visual Studio 2017 e 2019, defina um BAZEL_VC. Além disso, você também pode definir BAZEL_VC_FULL_VERSION.

    • BAZEL_VC: o diretório de instalação do Visual C++ Build Tools

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
      
    • BAZEL_VC_FULL_VERSION (opcional) somente para o Visual Studio 2017 e 2019, o número completo da versão das Ferramentas de build do Visual C++. Você poderá escolher a versão exata do Visual C++ Build Tools usando BAZEL_VC_FULL_VERSION se mais de uma versão estiver instalada. Caso contrário, o Bazel escolherá a versão mais recente.

      set BAZEL_VC_FULL_VERSION=14.16.27023
      

    Para o Visual Studio 2015 ou anterior, defina BAZEL_VC. (BAZEL_VC_FULL_VERSION não é compatível.)

    • BAZEL_VC: o diretório de instalação do Visual C++ Build Tools

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
      
  • O SDK do Windows.

    O SDK do Windows contém os arquivos principais e as bibliotecas que você precisa para criar aplicativos do Windows, incluindo o próprio Bazel. Por padrão, o SDK do Windows mais recente instalado será usado. Também é possível especificar a versão do SDK do Windows definindo BAZEL_WINSDK_FULL_VERSION. Você pode usar um número completo do SDK do Windows 10, como 10.0.10240.0, ou especificar o 8.1 para usar o SDK do Windows 8.1 (apenas uma versão do SDK do Windows 8.1 está disponível). Verifique se o SDK do Windows especificado está instalado.

    Requisito: compatível com VC 2017 e 2019. O VC 2015 Build Tools autônomo não oferece suporte à seleção do SDK do Windows. Você vai precisar da instalação completa do Visual Studio 2015. Caso contrário, BAZEL_WINSDK_FULL_VERSION será ignorado.

    set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
    

Se tudo estiver configurado, você poderá criar um destino C++ agora.

Tente criar um destino usando um dos nossos projetos de exemplo:

bazel build //examples/cpp:hello-world
bazel-bin\examples\cpp\hello-world.exe

Por padrão, os binários criados têm como destino a arquitetura x64. Para especificar uma arquitetura de destino diferente, defina a opção de build --cpu * x64 (padrão): --cpu=x64_windows ou nenhuma opção * x86: --cpu=x64_x86_windows * ARM: --cpu=x64_arm_windows * ARM64: --cpu=arm64_windows

Por exemplo, para criar destinos para a arquitetura ARM, execute:

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

Para criar e usar bibliotecas vinculadas dinamicamente (arquivos DLL), consulte este exemplo.

Limite de comprimento da linha de comando: para evitar o problema de limite de comprimento da linha de comando do Windows, ative o recurso de arquivo de parâmetro do compilador via --features=compiler_param_file.

Crie C++ com o Clang

A partir da versão 0.29.0, o Bazel oferece suporte à criação com o driver de compilador compatível com MSVC do LLVM (clang-cl.exe).

Requisito: para criar com o Clang, é necessário instalar ambas as ferramentas do LLVM (link em inglês) e de build do Visual C++. Apesar de você usar clang-cl.exe como compilador, ainda é necessário vincular às bibliotecas Visual C++.

O Bazel pode detectar automaticamente a instalação do LLVM no sistema ou você pode informar explicitamente ao Bazel onde o LLVM está instalado pelo BAZEL_LLVM.

  • BAZEL_LLVM: o diretório de instalação do LLVM

    set BAZEL_LLVM=C:\Program Files\LLVM
    

Há várias situações para ativar o conjunto de ferramentas do Clang para a compilação em C++.

  • No bazel 0.28 e anteriores: o Clang não é compatível.

  • Sem --incompatible_enable_cc_toolchain_resolution: é possível ativar o conjunto de ferramentas do Clang usando uma sinalização de compilação --compiler=clang-cl.

  • Com --incompatible_enable_cc_toolchain_resolution: é necessário adicionar um destino de plataforma ao seu BUILD file (por exemplo, o arquivo BUILD de nível superior):

    platform(
        name = "x64_windows-clang-cl",
        constraint_values = [
            "@platforms//cpu:x86_64",
            "@platforms//os:windows",
            "@bazel_tools//tools/cpp:clang-cl",
        ],
    )
    

    Em seguida, você pode ativar o conjunto de ferramentas do Clang de duas maneiras:

    • Especifique as flags de build abaixo:
    --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
    
    • Registre a plataforma e o conjunto de ferramentas no arquivo WORKSPACE:
    register_execution_platforms(
        ":x64_windows-clang-cl"
    )
    
    register_toolchains(
        "@local_config_cc//:cc-toolchain-x64_windows-clang-cl",
    )
    

    A flag --incompatible_enable_cc_toolchain_resolution vai ser ativada por padrão em uma versão futura do Bazel. Portanto, é recomendável ativar a compatibilidade com o Clang com a segunda abordagem.

Criar Java

Para criar destinos Java, você precisa de:

No Windows, o Bazel cria dois arquivos de saída para regras java_binary:

  • um arquivo .jar
  • Um arquivo .exe que pode configurar o ambiente para a JVM e executar o binário

Tente criar um destino usando um dos nossos projetos de exemplo:

  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

Criar Python

Para criar destinos do Python, você precisa de:

No Windows, o Bazel cria dois arquivos de saída para regras py_binary:

  • um arquivo ZIP de autoextração
  • Um arquivo executável que pode iniciar o intérprete de Python com o arquivo ZIP de autoextração como argumento

Você pode executar o arquivo executável (ele tem uma extensão .exe) ou executar o Python com o arquivo ZIP de autoextração como argumento.

Tente criar um destino usando um dos nossos projetos de exemplo:

  bazel build //examples/py_native:bin
  bazel-bin\examples\py_native\bin.exe
  python bazel-bin\examples\py_native\bin.zip

Se você tiver interesse em detalhes sobre como o Bazel cria destinos do Python no Windows, confira este documento de design (link em inglês).