Tại đây, bạn sẽ tìm thấy một số trường hợp sử dụng phổ biến nhất để xây dựng các dự án C++ bằng Bazel. Nếu chưa làm, hãy bắt đầu xây dựng các dự án C++ bằng Bazel bằng cách hoàn tất hướng dẫn Giới thiệu về Bazel: Xây dựng dự án C++.
Để biết thông tin về tệp tiêu đề cc_library và hdrs, hãy xem cc_library.
Thêm nhiều tệp vào một mục tiêu
Bạn có thể thêm nhiều tệp vào một mục tiêu bằng glob. Ví dụ:
cc_library(
name = "build-all-the-files",
srcs = glob(["*.cc"]),
hdrs = glob(["*.h"]),
)
Với mục tiêu này, Bazel sẽ xây dựng tất cả các tệp .cc và .h mà nó tìm thấy trong cùng thư mục với tệp BUILD chứa mục tiêu này (không bao gồm các thư mục con).
Sử dụng các phần include bắc cầu
Nếu một tệp bao gồm tiêu đề, thì mọi quy tắc có tệp đó làm nguồn (tức là,
có tệp đó trong thuộc tính srcs, hdrs, hoặc textual_hdrs) đều phải
phụ thuộc vào quy tắc thư viện của tiêu đề được thêm vào. Ngược lại, bạn chỉ cần chỉ định các phần phụ thuộc trực tiếp
làm phần phụ thuộc. Ví dụ: giả sử
sandwich.h bao gồm bread.h và bread.h bao gồm flour.h. sandwich.h
không bao gồm flour.h (ai muốn có bột mì trong bánh mì kẹp của họ?), vì vậy, tệp BUILD
sẽ có dạng như sau:
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"],
)
Ở đây, thư viện sandwich phụ thuộc vào thư viện bread, thư viện này phụ thuộc
vào thư viện flour.
Thêm đường dẫn include
Đôi khi, bạn không thể (hoặc không muốn) đặt đường dẫn include gốc tại gốc không gian làm việc. Các thư viện hiện có có thể đã có một thư mục include không khớp với đường dẫn của thư mục đó trong không gian làm việc. Ví dụ: giả sử bạn có cấu trúc thư mục sau:
└── my-project
├── legacy
│ └── some_lib
│ ├── BUILD
│ ├── include
│ │ └── some_lib.h
│ └── some_lib.cc
└── MODULE.bazel
Bazel sẽ mong đợi some_lib.h được thêm vào dưới dạng
legacy/some_lib/include/some_lib.h, nhưng giả sử some_lib.cc bao gồm
"some_lib.h". Để đường dẫn include đó hợp lệ,
legacy/some_lib/BUILD sẽ cần chỉ định rằng thư mục some_lib/include
là một thư mục include:
cc_library(
name = "some_lib",
srcs = ["some_lib.cc"],
hdrs = ["include/some_lib.h"],
copts = ["-Ilegacy/some_lib/include"],
)
Điều này đặc biệt hữu ích đối với các phần phụ thuộc bên ngoài, vì các tệp tiêu đề của chúng
phải được thêm vào bằng tiền tố /.
Thêm các thư viện bên ngoài
Giả sử bạn đang sử dụng Google Test.
Bạn có thể thêm một phần phụ thuộc vào tệp đó trong tệp MODULE.bazel để
tải Google Test xuống và cung cấp trong kho lưu trữ của mình:
bazel_dep(name = "googletest", version = "1.15.2")
Viết và chạy các bài kiểm thử C++
Ví dụ: bạn có thể tạo một bài kiểm thử ./test/hello-test.cc, chẳng hạn như:
#include "gtest/gtest.h"
#include "main/hello-greet.h"
TEST(HelloTest, GetGreet) {
EXPECT_EQ(get_greet("Bazel"), "Hello Bazel");
}
Sau đó, tạo tệp ./test/BUILD cho các bài kiểm thử:
cc_test(
name = "hello-test",
srcs = ["hello-test.cc"],
copts = [
"-Iexternal/gtest/googletest/include",
"-Iexternal/gtest/googletest",
],
deps = [
"@googletest//:main",
"//main:hello-greet",
],
)
Để hello-greet hiển thị cho hello-test, bạn phải thêm
"//test:__pkg__", vào thuộc tính visibility trong ./main/BUILD.
Giờ đây, bạn có thể sử dụng bazel test để chạy bài kiểm thử.
bazel test test:hello-test
Kết quả như sau:
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.
Thêm các phần phụ thuộc vào thư viện được biên dịch sẵn
Nếu bạn muốn sử dụng một thư viện mà bạn chỉ có phiên bản đã biên dịch (ví dụ: tiêu đề và tệp .so), hãy gói thư viện đó trong một quy tắc cc_library:
cc_library(
name = "mylib",
srcs = ["mylib.so"],
hdrs = ["mylib.h"],
)
Bằng cách này, các mục tiêu C++ khác trong không gian làm việc của bạn có thể phụ thuộc vào quy tắc này.