C++ và Bazel

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++. Hướng dẫn này liên kết đến hướng dẫn, quy tắc xây dựng và các thông tin cụ thể khác về việc xây dựng các dự án C++ bằng Bazel.

Cộng tá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++:

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 làm theo các nguyên tắc bên dưới khi tạo tệp BUILD:

  • Mỗi tệp BUILD phải chứa một mục tiêu quy tắc cc_library cho mỗi đơn vị biên dịch trong thư mục.

  • Bạn nên phân tích chi tiết các thư viện C++ của mình nhiều nhất có thể để tối đa hoá tính tăng dần và chạy song song 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 với 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 đề trùng khớ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êu cc_library trong tệp. Đặt tên cho mục tiêu [library-name]_test 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ện mylib như trình bày ở 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 để thêm đường dẫn:

  • Đặt tất 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 dấu ngoặc kép bao gồm (#include "foo/bar/baz.h") cho các tiêu đề không thuộc hệ thống, chứ 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 đến 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ã cũ hoặc third_party yêu cầu bao gồm việc trỏ ra bên ngoài kho lưu trữ dự án, chẳng hạn như kho lưu trữ bên ngoài bao gồm việc yêu cầu tiền tố, hãy sử dụng đối số include_prefixstrip_include_prefix trên mục tiêu quy tắc cc_library.

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ể giúp cải thiện quy trình của dự án C++. Bạn có thể bật các quy tắc này bằng cách sử dụng cờ dòng lệnh --features hoặc thuộc tính features của 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ả 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 sử 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 đề là độc lập và không phụ thuộc vào thứ tự đưa vào.
  • Tính năng layering_check thực thi các mục tiêu chỉ bao gồm các tiêu đề do các phần phụ thuộc trực tiếp cung cấp. Chuỗi công cụ mặc định hỗ trợ tính năng này trên Linux với trình biên dịch là clang.