Como usar o Bazel no Windows

Esta página aborda 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 "area-Windows" no GitHub. GitHub-Windows.

Práticas recomendadas

Evitar problemas de caminho longo

Algumas ferramentas têm a limitação de comprimento 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 flag --output_user_root.

Por exemplo, adicione a seguinte linha ao arquivo bazelrc:

startup --output_user_root=C:/tmp

Alguns recursos exigem que o Bazel possa criar 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 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 flag --enable_runfiles pode criar uma grande quantidade de links simbólicos de arquivos. Ative esse recurso apenas quando necessário.

Execução do Bazel: shell do 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 no bash, seja no shell do MSYS2, no Git Bash, no Cygwin ou em qualquer outra variante do Bash. Embora o Bazel possa funcionar na maioria dos casos de uso, algumas coisas estão quebradas, como interromper o build com Ctrl+C no 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á argumentos de linha de comando que parecem caminhos do Unix (como //foo:bar) em caminhos do Windows. Consulte esta resposta do StackOverflow para mais detalhes.

Como usar o Bazel sem o Bash (MSYS2)

Como usar o build do Bazel sem o Bash

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

A partir do Bazel 1.0, é possível criar qualquer regra sem o Bash, a menos que seja:

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

No entanto, genrule é usado com frequência para tarefas simples, como copiar um arquivo ou gravar um arquivo de texto. Em vez de usar genrule (e depender do Bash), você pode encontrar uma regra adequada no repositório bazel-skylib. Quando criadas no Windows, essas regras não exigem o Bash.

Como usar o teste do Bazel sem o Bash

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

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

  • você usa --run_under
  • a regra de teste exige o Bash (porque o executável é um script de shell)

Como usar a execução do Bazel sem o Bash

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

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

  • você usa --run_under ou --script_path
  • a regra de teste exige o Bash (porque o executável é um script de shell)

Como usar regras sh_binary e sh_*, e ctx.actions.run_shell() sem o Bash

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

No futuro, pode haver uma opção para usar o Subsistema Windows para Linux (WSL, link em inglês) para criar essas regras, mas atualmente não é uma prioridade para a subequipe do Bazel no Windows.

Como definir variáveis de ambiente

As variáveis de ambiente definidas 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, você pode adicioná-las às variáveis de usuário ou de 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 Visual C++.

  • (Opcional) A variável de ambiente BAZEL_VC e BAZEL_VC_FULL_VERSION.

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

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

    • BAZEL_VC o diretório de instalação das ferramentas de build do Visual C++

      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 da versão completa das ferramentas de build do Visual C++. Você pode escolher a versão exata das ferramentas de build do Visual C++ 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 mais antigo, defina BAZEL_VC. (BAZEL_VC_FULL_VERSION não é compatível.)

    • BAZEL_VC o diretório de instalação das ferramentas de build do Visual C++

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

    O SDK do Windows contém arquivos de cabeçalho e bibliotecas necessários ao criar aplicativos do Windows, incluindo o próprio Bazel. Por padrão, o SDK do Windows mais recente instalado será usado. Você também pode especificar a versão do SDK do Windows definindo BAZEL_WINSDK_FULL_VERSION. É possível usar um número completo do SDK do Windows 10, como 10.0.10240.0, ou especificar 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 você tem o SDK do Windows especificado instalado.

    Requisito: isso é compatível com o VC 2017 e 2019. As ferramentas de build do VC 2015 independentes não oferecem suporte à seleção do SDK do Windows. Você 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 em 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 criar para a arquitetura ARM64, use

--platforms=//:windows_arm64  --extra_toolchains=@local_config_cc//:cc-toolchain-arm64_windows

É possível introduzir @local_config_cc em MODULE.bazel com

bazel_dep(name = "rules_cc", version = "0.1.1")
cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension")
use_repo(cc_configure, "local_config_cc")

Para criar e usar bibliotecas de vínculo dinâmico (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 usando --features=compiler_param_file.

Criar C++ com 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 as ferramentas de build do LLVM e do Visual C++ porque, embora você use clang-cl.exe como compilador, ainda é necessário vincular às bibliotecas do Visual C++.

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

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

    set BAZEL_LLVM=C:\Program Files\LLVM

Para ativar o conjunto de ferramentas do Clang, a configuração depende da versão do Bazel e se você está usando o Bzlmod ou o WORKSPACE.


Bazel 8 e mais recente:

  • Como usar o Bzlmod (recomendado):

    1. Verifique se você tem rules_cc carregado no MODULE.bazel e configure os conjuntos de ferramentas de CC: ```python bazel_dep(name = "rules_cc", version = "0.0.17") # Or newer

      cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension") use_repo(cc_configure, "local_config_cc") ```

    2. Defina um destino platform em um arquivo BUILD (por exemplo, o arquivo BUILD raiz): python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", # Alias to the @rules_cc constraint in Bazel 8+ ], )

    3. Ative o conjunto de ferramentas usando estas flags: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl

  • Como usar o WORKSPACE:

    1. Carregue as dependências e os conjuntos de ferramentas rules_cc no arquivo WORKSPACE : python load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains") rules_cc_dependencies() rules_cc_toolchains()

    2. Defina um destino platform em um arquivo BUILD (por exemplo, o arquivo BUILD raiz): python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", # Alias to the @rules_cc constraint in Bazel 8+ ], )

    3. Ative o conjunto de ferramentas usando estas flags: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl


Bazel 7:

Observação:no Bazel 7, @bazel_tools//tools/cpp:clang-cl não é um alias para a restrição @rules_cc. Para usar clang-cl corretamente com rules_cc no Bazel 7, é necessário referenciar uma restrição no repositório @rules_cc. O rótulo @rules_cc//cc/private/toolchain:clang-cl é tecnicamente particular, mas é necessário para um comportamento consistente entre as configurações do WORKSPACE e do Bzlmod no Bazel 7.

  • Como usar o Bzlmod:

    1. Configure MODULE.bazel como no exemplo do Bazel 8.

    2. Defina o destino platform usando a restrição particular @rules_cc: python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@rules_cc//cc/private/toolchain:clang-cl", # Necessary for Bazel 7 ], )

    3. Ative o conjunto de ferramentas usando estas flags: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl

  • Como usar o WORKSPACE:

    1. Carregue as dependências e os conjuntos de ferramentas rules_cc no arquivo WORKSPACE : python load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains") rules_cc_dependencies() rules_cc_toolchains()

    2. Defina o destino platform usando a restrição particular @rules_cc: python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@rules_cc//cc/private/toolchain:clang-cl", # Necessary for Bazel 7 ], )

    3. Ative o conjunto de ferramentas usando estas flags: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl


Bazel 0.29 a 6.x:

Bazel 0.28 e mais antigo:

  • O Clang não é compatível.

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 em 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 Python, você precisa de:

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

  • um arquivo ZIP autoextraível
  • um arquivo executável que pode iniciar o interpretador do Python com o arquivo ZIP autoextraível como argumento

É possível executar o arquivo executável (ele tem uma extensão .exe) ou executar o Python com o arquivo ZIP autoextraível como argumento.

Tente criar um destino em 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 Python no Windows, consulte este documento de design doc.