Trang này chứa các tài nguyên giúp bạn sử dụng Bazel với các dự án C++. Tài liệu này liên kết đến một hướng dẫn, các quy tắc xây dựng và thông tin khác dành riêng cho việc xây dựng các dự án C++ bằng Bazel.
Làm việc với Bazel
Các tài nguyên sau đây sẽ giúp bạn làm việc với Bazel trên các dự án C++:
- Hướng dẫn: Tạo dự án C++
- Các trường hợp sử dụng phổ biến của C++
- Quy tắc C/C++
- Thư viện thiết yếu
- Cấu hình chuỗi công cụ C++
- Hướng dẫn: Định cấu hình chuỗi công cụ C++
- Tích hợp với các quy tắc C++
Các phương pháp hay nhất
Ngoài các phương pháp hay nhất chung của Bazel, dưới đây là các phương pháp hay nhất dành riêng cho dự án C++.
Tệp BUILD
Hãy tuân theo các nguyên tắc dưới đây khi tạo tệp BUILD:
Mỗi tệp
BUILD
phải chứa một mục tiêu quy tắccc_library
cho mỗi đơn vị biên dịch trong thư mục.Bạn nên chia nhỏ các thư viện C++ càng nhiều càng tốt để tối đa hoá tính gia tăng và song song hoá bản dựng.
Nếu có một tệp nguồn duy nhất trong
srcs
, hãy đặt tên cho thư viện giống như tên của tệp C++ đó. Thư viện này phải chứa(các) tệp C++, (các) tệp tiêu đề phù hợp và các phần phụ thuộc trực tiếp của thư viện. Ví dụ:cc_library( name = "mylib", srcs = ["mylib.cc"], hdrs = ["mylib.h"], deps = [":lower-level-lib"] )
Sử dụng một mục tiêu quy tắc
cc_test
cho mỗi mục tiêucc_library
trong tệp. Đặt tên cho[library-name]_test
đích và tệp nguồn[library-name]_test.cc
. Ví dụ: mục tiêu kiểm thử cho mục tiêu thư việnmylib
xuất hiện ở trên sẽ có dạng như sau:cc_test( name = "mylib_test", srcs = ["mylib_test.cc"], deps = [":mylib"] )
Bao gồm đường dẫn
Hãy làm theo các nguyên tắc sau đối với đường dẫn bao gồm:
Tạo tất cả các đường dẫn bao gồm tương ứng với thư mục không gian làm việc.
Sử dụng các tệp bao gồm trong dấu ngoặc kép (
#include "foo/bar/baz.h"
) cho các tiêu đề không phải của hệ thống, không phải dấu ngoặc nhọn (#include <foo/bar/baz.h>
).Tránh sử dụng các lối tắt thư mục UNIX, chẳng hạn như
.
(thư mục hiện tại) hoặc..
(thư mục mẹ).Đối với mã
third_party
hoặc mã cũ yêu cầu các tệp bao gồm trỏ ra ngoài kho lưu trữ dự án, chẳng hạn như các tệp bao gồm kho lưu trữ bên ngoài yêu cầu tiền tố, hãy dùng các đối sốinclude_prefix
vàstrip_include_prefix
trên mục tiêu quy tắccc_library
.
Các tính năng của chuỗi công cụ
Các tính năng không bắt buộc sau đây có thể cải thiện tính vệ sinh của một dự án C++. Bạn có thể bật các quy tắc này bằng cờ dòng lệnh --features
hoặc thuộc tính features
của các quy tắc repo
, package
hoặc cc_*
:
- Tính năng
parse_headers
giúp trình biên dịch C++ được dùng để phân tích cú pháp (nhưng không biên dịch) tất cả các tệp tiêu đề trong các mục tiêu đã tạo và các phần phụ thuộc của chúng khi dùng cờ--process_headers_in_dependencies
. Điều này có thể giúp phát hiện các vấn đề trong thư viện chỉ có tiêu đề và đảm bảo rằng các tiêu đề độc lập và không phụ thuộc vào thứ tự mà chúng được đưa vào. - Tính năng
layering_check
thực thi rằng các mục tiêu chỉ bao gồm những tiêu đề do các phần phụ thuộc trực tiếp của chúng cung cấp. Chuỗi công cụ mặc định hỗ trợ tính năng này trên Linux bằngclang
làm trình biên dịch.