Di sini Anda akan menemukan beberapa kasus penggunaan paling umum untuk membangun project C++ dengan Bazel. Jika belum melakukannya, mulailah membangun project C++ dengan Bazel dengan menyelesaikan tutorial Pengantar Bazel: Membangun Project C++.
Untuk mengetahui informasi tentang file header cc_library dan hdrs, lihat cc_library.
Menyertakan beberapa file dalam target
Anda dapat menyertakan beberapa file dalam satu target dengan glob. Contoh:
cc_library(
name = "build-all-the-files",
srcs = glob(["*.cc"]),
hdrs = glob(["*.h"]),
)
Dengan target ini, Bazel akan membangun semua file .cc dan .h yang ditemukannya di direktori yang sama dengan file BUILD yang berisi target ini (tidak termasuk subdirektori).
Menggunakan penyertaan transitif
Jika file menyertakan header, aturan apa pun dengan file tersebut sebagai sumber (yaitu,
memiliki file tersebut dalam atribut srcs, hdrs, atau textual_hdrs) harus
bergantung pada aturan library header yang disertakan. Sebaliknya, hanya dependensi langsung yang perlu ditentukan sebagai dependensi. Misalnya, anggaplah sandwich.h menyertakan bread.h dan bread.h menyertakan flour.h. sandwich.h
tidak menyertakan flour.h (siapa yang ingin tepung di sandwichnya?), sehingga file BUILD akan terlihat seperti ini:
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"],
)
Di sini, library sandwich bergantung pada library bread, yang bergantung pada library flour.
Menambahkan jalur penyertaan
Terkadang Anda tidak dapat (atau tidak ingin) jalur penyertaan root di root ruang kerja. Library yang ada mungkin sudah memiliki direktori penyertaan yang tidak cocok dengan jalurnya di ruang kerja Anda. Misalnya, anggaplah Anda memiliki struktur direktori berikut:
└── my-project
├── legacy
│ └── some_lib
│ ├── BUILD
│ ├── include
│ │ └── some_lib.h
│ └── some_lib.cc
└── MODULE.bazel
Bazel akan mengharapkan some_lib.h disertakan sebagai
legacy/some_lib/include/some_lib.h, tetapi anggaplah some_lib.cc menyertakan
"some_lib.h". Agar jalur penyertaan tersebut valid, legacy/some_lib/BUILD harus menentukan bahwa direktori some_lib/include adalah direktori penyertaan:
cc_library(
name = "some_lib",
srcs = ["some_lib.cc"],
hdrs = ["include/some_lib.h"],
copts = ["-Ilegacy/some_lib/include"],
)
Hal ini sangat berguna untuk dependensi eksternal, karena file headernya harus disertakan dengan awalan /.
Menyertakan library eksternal
Misalnya, Anda menggunakan Google Test.
Anda dapat menambahkan dependensi di file MODULE.bazel untuk mendownload Google Test dan membuatnya tersedia di repositori Anda:
bazel_dep(name = "googletest", version = "1.15.2")
Menulis dan menjalankan pengujian C++
Misalnya, Anda dapat membuat pengujian ./test/hello-test.cc, seperti:
#include "gtest/gtest.h"
#include "main/hello-greet.h"
TEST(HelloTest, GetGreet) {
EXPECT_EQ(get_greet("Bazel"), "Hello Bazel");
}
Kemudian, buat file ./test/BUILD untuk pengujian Anda:
cc_test(
name = "hello-test",
srcs = ["hello-test.cc"],
copts = [
"-Iexternal/gtest/googletest/include",
"-Iexternal/gtest/googletest",
],
deps = [
"@googletest//:main",
"//main:hello-greet",
],
)
Agar hello-greet terlihat oleh hello-test, Anda harus menambahkan
"//test:__pkg__", ke atribut visibility di ./main/BUILD.
Sekarang Anda dapat menggunakan bazel test untuk menjalankan pengujian.
bazel test test:hello-test
Tindakan ini menghasilkan output berikut:
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.
Menambahkan dependensi pada library yang telah dikompilasi
Jika Anda ingin menggunakan library yang hanya memiliki versi yang dikompilasi (misalnya, header dan file .so), gabungkan dalam aturan cc_library:
cc_library(
name = "mylib",
srcs = ["mylib.so"],
hdrs = ["mylib.h"],
)
Dengan cara ini, target C++ lainnya di ruang kerja Anda dapat bergantung pada aturan ini.