C++ và Bazel

Báo cáo sự cố Xem nguồn

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 phần hướng dẫn, quy tắc xây dựng và thông tin khác dành riêng cho việc xây dựng dự án C++ bằng Bazel.

Hợp 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 trong các dự án C++:

Các phương pháp hay nhất

Ngoài các phương pháp chung hay nhất của Bazel, dưới đây là các phương pháp hay nhất dành riêng cho các dự án C++.

XÂY DỰNG tệp

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 đích quy tắc cc_library cho mỗi đơn vị biên dịch trong thư mục.

  • Bạn nên chi tiết hoá thư viện C++ của mình nhiều nhất có thể để tăng tối đa mức độ gia tăng và tải bản dựng song song.

  • Nếu có một tệp nguồn 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++, mọi 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êu cc_library trong tệp. Đặt tên cho mục tiêu [library-name]_test và tệp nguồn là [library-name]_test.cc. Ví dụ: mục tiêu kiểm thử cho mục tiêu thư viện mylib hiển thị ở 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

Làm theo các nguyên tắc sau đối với đường dẫn bao gồm:

  • Hãy thêm tất cả đường dẫn tương ứng với thư mục không gian làm việc.

  • Sử dụng dấu ngoặc kép include (#include "foo/bar/baz.h") cho các tiêu đề không phải hệ thống, chứ không phải cho dấu ngoặc góc (#include <foo/bar/baz.h>).

  • Tránh dùng các lối tắt cho 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 mã third_party đòi hỏi phải trỏ đến bên ngoài kho lưu trữ dự án, chẳng hạn như kho lưu trữ bên ngoài yêu cầu một tiền tố, hãy sử dụng các đối số include_prefixstrip_include_prefix trên mục tiêu của quy tắc cc_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ể giúp cải thiện chất lượng của dự án C++. Bạn có thể bật các tính năng này bằng cách sử dụ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ả tệp tiêu đề trong mục tiêu đã tạo và các phần phụ thuộc của các tệp đó khi sử dụng cờ --process_headers_in_dependencies. Điều này có thể giúp phát hiện 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à độc lập với thứ tự đi kèm.
  • Tính năng layering_check thực thi việc nhắm 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 clang là trình biên dịch.