Aqui você encontra alguns dos casos de uso mais comuns para criar projetos em C++ com o Bazel. Se você ainda não fez isso, comece a criar projetos em C++ com o Bazel concluindo o tutorial Introdução ao Bazel: crie um projeto em C++.
Para informações sobre cc_library e arquivos de cabeçalho hdrs, consulte cc_library.
Incluir vários arquivos em uma meta
É possível incluir vários arquivos em uma única meta com glob. Exemplo:
cc_library(
name = "build-all-the-files",
srcs = glob(["*.cc"]),
hdrs = glob(["*.h"]),
)
Com essa meta, o Bazel vai criar todos os arquivos .cc
e .h
encontrados no mesmo diretório do arquivo BUILD
que contém essa meta (excluindo subdiretórios).
Usar includes transitivos
Se um arquivo incluir um cabeçalho, qualquer regra com esse arquivo como origem (ou seja, com esse arquivo no atributo srcs
, hdrs
ou textual_hdrs
) vai depender da regra de biblioteca do cabeçalho incluído. Por outro lado, apenas dependências diretas precisam ser especificadas como dependências. Por exemplo, suponha que sandwich.h
inclua bread.h
e bread.h
inclua flour.h
. sandwich.h
não inclui flour.h
(quem quer farinha no sanduíche?), então o arquivo BUILD
ficaria assim:
cc_library(
name = "sandwich",
srcs = ["sandwich.cc"],
hdrs = ["sandwich.h"],
deps = [":bread"],
)
cc_library(
name = "bread",
srcs = ["bread.cc"],
hdrs = ["bread.h"],
deps = [":flour"],
)
cc_library(
name = "flour",
srcs = ["flour.cc"],
hdrs = ["flour.h"],
)
Aqui, a biblioteca sandwich
depende da biblioteca bread
, que depende da biblioteca flour
.
Como adicionar caminhos de inclusão
Às vezes, não é possível (ou não é desejável) incluir caminhos na raiz do espaço de trabalho. As bibliotecas atuais podem ter um diretório de inclusão que não corresponde ao caminho no seu espaço de trabalho. Por exemplo, suponha que você tenha a seguinte estrutura de diretórios:
└── my-project
├── legacy
│ └── some_lib
│ ├── BUILD
│ ├── include
│ │ └── some_lib.h
│ └── some_lib.cc
└── MODULE.bazel
O Bazel espera que some_lib.h
seja incluído como
legacy/some_lib/include/some_lib.h
, mas suponha que some_lib.cc
inclua
"some_lib.h"
. Para tornar esse caminho de inclusão válido,
legacy/some_lib/BUILD
precisa especificar que o diretório some_lib/include
é um diretório de inclusão:
cc_library(
name = "some_lib",
srcs = ["some_lib.cc"],
hdrs = ["include/some_lib.h"],
copts = ["-Ilegacy/some_lib/include"],
)
Isso é especialmente útil para dependências externas, já que os arquivos de cabeçalho delas
precisam ser incluídos com um prefixo /
.
Incluir bibliotecas externas
Suponha que você esteja usando o Google Test
{: .external}.
É possível adicionar uma dependência a ele no arquivo MODULE.bazel
para
baixar o Google Test e disponibilizá-lo no seu repositório:
bazel_dep(name = "googletest", version = "1.15.2")
Como escrever e executar testes em C++
Por exemplo, você pode criar um ./test/hello-test.cc
de teste, como:
#include "gtest/gtest.h"
#include "main/hello-greet.h"
TEST(HelloTest, GetGreet) {
EXPECT_EQ(get_greet("Bazel"), "Hello Bazel");
}
Em seguida, crie o arquivo ./test/BUILD
para seus testes:
cc_test(
name = "hello-test",
srcs = ["hello-test.cc"],
copts = [
"-Iexternal/gtest/googletest/include",
"-Iexternal/gtest/googletest",
],
deps = [
"@googletest//:gtest_main",
"//main:hello-greet",
],
)
Para tornar hello-greet
visível para hello-test
, adicione
"//test:__pkg__",
ao atributo visibility
em ./main/BUILD
.
Agora você pode usar bazel test
para executar o teste.
bazel test test:hello-test
Isso produz a seguinte saída:
INFO: Found 1 test target...
Target //test:hello-test up-to-date:
bazel-bin/test/hello-test
INFO: Elapsed time: 4.497s, Critical Path: 2.53s
//test:hello-test PASSED in 0.3s
Executed 1 out of 1 tests: 1 test passes.
Adicionar dependências a bibliotecas pré-compiladas
Se você quiser usar uma biblioteca de que só tem uma versão compilada (por exemplo, cabeçalhos e um arquivo .so
), encapsule-a em uma regra cc_library
:
cc_library(
name = "mylib",
srcs = ["mylib.so"],
hdrs = ["mylib.h"],
)
Assim, outros destinos em C++ no seu espaço de trabalho podem depender dessa regra.