Bazel é uma ferramenta de software livre para automação de construção e teste de software desenvolvido pelo Google .
Ou seja, o Bazel é alternativa para o Make(do projeto GNU) ou Ant e Maven, ambos para compilar programas em Java, desenvolvidas pela empresa: Apache .
Bazel foi escrito com a linguagem de programação Starlark , um dialeto de Python .
Bazel constrói quase todos os produtos do Google: Google Search, GMail, Google Docs, …
Bazel foi desenvolvido para funcionar de forma padronizada nos produtos da Google .
Geralmente empresas tendem a criar próprias soluções por motivos de padronização e também serve para evitar a “propaganda gratuita de produtos de outras empresas”, ainda mais o Google que uma das suas principais fontes de receita é justamente a: publicidade .
Mas, você pode migrar seus projetos, caso deseje!
Existem diversas maneiras de você instalar. Você pode usar o gerenciador de pacotes do seu sistema operacional, exemplos abaixo:
emerge dev-util/bazel # Gentoo
sudo pacman -S bazel # Arch via AUR
sudo dnf install bazel4 # Fedora após instalar dnf-plugins-core
pkg install devel/bazel # FreeBSD via Ports
E entre outros, para uma lista mais completa veja aqui .
Você também pode usar o npm independente do sistema operacional:
sudo npm install -g @bazel/bazelisk
O exemplo mais básico de todos, nesse caso para C++, seria um projeto com 3 arquivos:
main.cpp
BUILD
que teria as macros para serem processadasWORKSPACE
, serve para indicar a raíz do projeto .Em resumo:
MYPROJECT/
├── BUILD
├── WORKSPACE
└── main.cpp
0 directories, 3 files
O conteúdo exemplo para main.cpp
, um Hello, World! básico:
#include <iostream>
int main(){
std::cout << "Olá, Mundo!" << '\n';
}
Conteúdo de BUILD
:
cc_binary(
name = "hello-world",
srcs = ["main.cpp"],
)
E o conteúdo de WORKSPACE
vazio, para criar basta usar o comando:
> WORKSPACE
Agora para compilar rode:
bazel build hello-world
Ele terá uma saída similar à abaixo:
INFO: Analyzed target //:hello-world (37 packages loaded, 163 targets configured).
INFO: Found 1 target...
Target //:hello-world up-to-date:
bazel-bin/hello-world
INFO: Elapsed time: 6.229s, Critical Path: 0.55s
INFO: 6 processes: 4 internal, 2 linux-sandbox.
INFO: Build completed successfully, 6 total actions
Para rodar use o parâmetro run
seguido do alvo indicado em BUILD
, nesse caso, usamos o nome de binário hello-world
:
bazel run hello-world
Saída similar:
INFO: Analyzed target //:hello-world (36 packages loaded, 163 targets configured).
INFO: Found 1 target...
Target //:hello-world up-to-date:
bazel-bin/hello-world
INFO: Elapsed time: 3.666s, Critical Path: 0.66s
INFO: 6 processes: 4 internal, 2 linux-sandbox.
INFO: Build completed successfully, 6 total actions
INFO: Build completed successfully, 6 total actions
Olá, Mundo!
Antes de imprimir é descrito os testes e análises efetuadas. Se quiser rodar somente o binário, rode:
./bazel-bin/hello-world
Após build
ele cria alguns diretórios dentro do seu projeto, exemplo baseado acima:
$ ls
📁⠀bazel-MYPROJECT/ 📁⠀bazel-bin/ 📁⠀bazel-out/ 📁⠀bazel-testlogs/ BUILD main.cpp WORKSPACE
Use o comando
tree
(se tiver instalado) para mais detalhes .
O exemplo que mostramos é uma forma “informal” de criar um projeto para ser compilado com Bazel . A forma correta mesma pode ser encontrada no repositório do Bazel, exemplo:
git clone https://github.com/bazelbuild/examples
cd bazelbuild
tree cpp-tutorial
examples
└── cpp-tutorial
├──stage1
│ ├── main
│ │ ├── BUILD
│ │ └── hello-world.cc
│ └── WORKSPACE
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── WORKSPACE
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE
Entre no diretório stage1
que possui o exemplo mais básico e depois analise e teste os demais, exemplo para o stage1
:
cd stage1
bazel build //main:hello-world
Note a sintaxe informando que o arquivo
BUILD
está dentro do diretório📁⠀main
Para mais informações acesse a página oficial: https://bazel.build/ .