Compile seus programas C++ com Bazel do Google

Incluindo programas escritos em Java e outras linguagens de programação.


Compile seus programas C++ com Bazel do Google


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, …

Qual o intuito de usar Bazel ?

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!


Instalação

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


Utilização

O exemplo mais básico de todos, nesse caso para C++, seria um projeto com 3 arquivos:

  • Seu programa: main.cpp
  • O arquivo BUILD que teria as macros para serem processadas
  • E um arquivo vazio de nome WORKSPACE, 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 .


Exemplos mais completos

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/ .


cpp cppdaily java


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!