Di sini Anda akan menemukan beberapa kasus penggunaan paling umum untuk membangun project C++ dengan Bazel. Jika Anda belum melakukannya, mulai bangun 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 mem-build semua file .cc
dan .h
yang ditemukannya di direktori yang sama dengan file BUILD
yang berisi target ini (tidak termasuk subdirektori).
Menggunakan transitif mencakup
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, misalkan
sandwich.h
mencakup bread.h
dan bread.h
mencakup flour.h
. sandwich.h
tidak menyertakan flour.h
(siapa yang mau tepung dalam sandwichnya?), jadi 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 sertakan
Terkadang Anda tidak dapat (atau tidak ingin) menyertakan jalur root di root ruang kerja. Library yang ada mungkin sudah memiliki direktori include yang tidak cocok dengan jalur di ruang kerja Anda. Misalnya, 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 misalkan some_lib.cc
menyertakan
"some_lib.h"
. Agar jalur include tersebut valid,
legacy/some_lib/BUILD
perlu menentukan bahwa direktori some_lib/include
adalah direktori include:
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 header-nya harus disertakan dengan awalan /
.
Menyertakan library eksternal
Misalnya, Anda menggunakan Google Test
{: .external}.
Anda dapat menambahkan dependensi padanya di file MODULE.bazel
untuk
mendownload Google Test dan menyediakannya di repositori Anda:
bazel_dep(name = "googletest", version = "1.15.2")
Menulis dan menjalankan pengujian C++
Misalnya, Anda dapat membuat ./test/hello-test.cc
pengujian, 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//:gtest_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 sebelumnya
Jika Anda ingin menggunakan library yang hanya memiliki versi yang dikompilasi (misalnya, header dan file .so
), bungkus library tersebut dalam aturan cc_library
:
cc_library(
name = "mylib",
srcs = ["mylib.so"],
hdrs = ["mylib.h"],
)
Dengan cara ini, target C++ lain di ruang kerja Anda dapat bergantung pada aturan ini.