Nesta página, você encontra as práticas recomendadas para o uso do 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. Confira 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 seu arquivo bazelrc:
startup --output_user_root=C:/tmp
Ativar suporte a nome 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 nome de arquivo 8.3 precisa ser ativado para o volume no qual reside o arquivo com o caminho longo. É possível ativar a criação de nomes com a versão 8.3 em todos os volumes executando o seguinte comando:
fsutil 8dot3name set 0
Ativar suporte a links simbólicos
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 arquivo. Só ative esse recurso quando precisar.
Como executar o Bazel: shell MSYS2 vs. 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 MSYS2, Git Bash, Cygwin ou qualquer outra variante do Bash. Embora o Bazel
possa funcionar na maioria dos casos de uso, algumas coisas não funcionam, como
interromper a compilação com Ctrl+C do MSYS2.
Além disso, se você optar por executar no MSYS2, será necessário desativar a conversão de caminho automática do MSYS2. Caso contrário, o MSYS converterá 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, é possível criar qualquer regra sem o Bash, a menos que seja:
genrule
, porque as regras gerais executam comandos Bash- regra
sh_binary
oush_test
, porque elas precisam, inerentemente, de - Regra Starlark que usa
ctx.actions.run_shell()
ouctx.resolve_command()
No entanto, o genrule
costuma ser usado para tarefas simples, como
copiar um arquivo
ou escrever um arquivo de texto.
Em vez de usar genrule
(e dependendo do 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 o Bash para bazel test
.
A partir do Bazel 1.0, é possível testar qualquer regra sem o Bash, exceto quando:
- você usa
--run_under
; - a regra de teste em si requer Bash (porque o executável é um script de shell)
Como usar o bazel run sem Bash
As versões do Bazel anteriores à 1.0 exigiam o Bash para bazel run
.
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 em si requer Bash (porque o executável é um script de shell)
Como usar as regras sh_binary e sh_* e ctx.actions.run_shell() sem Bash
Você precisa do Bash para criar e testar regras sh_*
e para criar e testar regras do Starlark
que usam ctx.actions.run_shell()
e ctx.resolve_command()
. Isso
se aplica não apenas às regras no seu projeto, mas também às regras em qualquer um dos repositórios
externos de que o projeto depende, 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.
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
é iniciado, adicione-as a 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:
(Opcional) As variáveis de ambiente
BAZEL_VC
eBAZEL_VC_FULL_VERSION
.O Bazel detecta automaticamente o compilador Visual C++ no seu sistema. Para instruir o Bazel a usar uma instalação de videoconferência 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 definirBAZEL_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ê pode escolher a versão exata do Visual C++ Build Tools usandoBAZEL_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
. Não há suporte paraBAZEL_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 14.0\VC
-
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 o VC 2017 e 2019. As ferramentas de build do VC 2015 autônomas 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 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
para a arquitetura de destino:
* 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 tamanho 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
.
Criar C++ com o Clang
Na versão 0.29.0, o Bazel oferece suporte à criação com o driver de compilação compatível com MSVC (clang-cl.exe
) do LLVM.
Requisito: para criar com o Clang, é necessário instalar ambas as
LLVM (links em inglês)
e as ferramentas de build do Visual C++.
Apesar de você usar clang-cl.exe
como compilador, ainda é necessário vincular
as 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 LLVMset BAZEL_LLVM=C:\Program Files\LLVM
Há várias situações para ativar o conjunto de ferramentas Clang para a criação de C++.
No bazel 0.28 e em versões 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 seuBUILD file
(por exemplo, o arquivoBUILD
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 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
MODULE.bazel
:
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 está planejada para 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
Build 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 autoextraível (que se descompacta automaticamente)
- um arquivo executável que possa iniciar o intérprete de Python com o arquivo ZIP de extração automática 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ê estiver interessado em detalhes sobre como o Bazel cria destinos Python no Windows, confira este documento de design.