Aquí encontrarás algunos de los casos de uso más comunes para compilar proyectos de C++ con Bazel. Si aún no lo hiciste, comienza a compilar proyectos de C++ con Bazel completando el instructivo Introducción a Bazel: Compila un proyecto de C++.
Para obtener información sobre los archivos de encabezado cc_library y hdrs, consulta cc_library.
Cómo incluir varios archivos en un destino
Puedes incluir varios archivos en un solo destino con glob. Por ejemplo:
cc_library(
name = "build-all-the-files",
srcs = glob(["*.cc"]),
hdrs = glob(["*.h"]),
)
Con este destino, Bazel compilará todos los archivos .cc y .h que encuentre en el
mismo directorio que el archivo BUILD que contiene este destino (sin incluir
los subdirectorios).
Cómo usar inclusiones transitivas
Si un archivo incluye un encabezado, cualquier regla con ese archivo como fuente (es decir,
que tenga ese archivo en el atributo srcs, hdrs o textual_hdrs) debe
depender de la regla de biblioteca del encabezado incluido. Por el contrario, solo las dependencias directas
deben especificarse como dependencias. Por ejemplo, supongamos que
sandwich.h incluye bread.h y bread.h incluye flour.h. sandwich.h
no incluye flour.h (¿quién quiere harina en su sándwich?), por lo que el archivo BUILD
se vería de la siguiente manera:
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"],
)
Aquí, la biblioteca sandwich depende de la biblioteca bread, que depende
de la biblioteca flour.
Cómo agregar rutas de inclusión
A veces, no puedes (o no quieres) incluir rutas en la raíz del espacio de trabajo. Es posible que las bibliotecas existentes ya tengan un directorio de inclusión que no coincida con su ruta de acceso en tu espacio de trabajo. Por ejemplo, supongamos que tienes la siguiente estructura de directorios:
└── my-project
├── legacy
│ └── some_lib
│ ├── BUILD
│ ├── include
│ │ └── some_lib.h
│ └── some_lib.cc
└── MODULE.bazel
Bazel esperará que some_lib.h se incluya como
legacy/some_lib/include/some_lib.h, pero supongamos que some_lib.cc incluye
"some_lib.h". Para que esa ruta de inclusión sea válida,
legacy/some_lib/BUILD deberá especificar que el some_lib/include
directorio es un directorio de inclusión:
cc_library(
name = "some_lib",
srcs = ["some_lib.cc"],
hdrs = ["include/some_lib.h"],
copts = ["-Ilegacy/some_lib/include"],
)
Esto es especialmente útil para las dependencias externas, ya que sus archivos de encabezado
de lo contrario, deben incluirse con un prefijo /.
Cómo incluir bibliotecas externas
Supongamos que usas Google Test.
Puedes agregar una dependencia en el archivo MODULE.bazel para
descargar Google Test y que esté disponible en tu repositorio:
bazel_dep(name = "googletest", version = "1.15.2")
Cómo escribir y ejecutar pruebas de C++
Por ejemplo, puedes crear una prueba ./test/hello-test.cc, como la siguiente:
#include "gtest/gtest.h"
#include "main/hello-greet.h"
TEST(HelloTest, GetGreet) {
EXPECT_EQ(get_greet("Bazel"), "Hello Bazel");
}
Luego, crea el archivo ./test/BUILD para tus pruebas:
cc_test(
name = "hello-test",
srcs = ["hello-test.cc"],
copts = [
"-Iexternal/gtest/googletest/include",
"-Iexternal/gtest/googletest",
],
deps = [
"@googletest//:main",
"//main:hello-greet",
],
)
Para que hello-greet sea visible para hello-test, debes agregar
"//test:__pkg__", al atributo visibility en ./main/BUILD.
Ahora puedes usar bazel test para ejecutar la prueba.
bazel test test:hello-test
Esto da como resultado lo siguiente:
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.
Cómo agregar dependencias en bibliotecas precompiladas
Si deseas usar una biblioteca de la que solo tienes una versión compilada (por
ejemplo, encabezados y un .so archivo) envuélvela en una cc_library regla:
cc_library(
name = "mylib",
srcs = ["mylib.so"],
hdrs = ["mylib.h"],
)
De esta manera, otros destinos de C++ en tu espacio de trabajo pueden depender de esta regla.