Trang này mô tả cách tích hợp với các quy tắc C++ ở nhiều cấp độ khác nhau.
Truy cập chuỗi công cụ C++
Do
đang tiếp tục di chuyển các quy tắc C++ sang nền tảng và chuỗi công cụ, bạn nên sử dụng hàm trợ giúp có sẵn tại @bazel_tools//tools/cpp:toolchain_utils.bzl. Hàm này hoạt động khi cả chuỗi công cụ bị tắt và bật. Để phụ thuộc vào một chuỗi công cụ C++ trong quy tắc, hãy thêm thuộc tính
Label
có tên là _cc_toolchain
và trỏ thuộc tính đó vào @bazel_tools//tools/cpp:current_cc_toolchain
(một bản sao của quy tắc cc_toolchain_alias
, trỏ đến chuỗi công cụ C++ hiện được chọn).
Sau đó, trong quá trình triển khai quy tắc, hãy sử dụng find_cpp_toolchain(ctx)
để lấy CcToolchainInfo
.
Bạn có thể xem toàn bộ ví dụ về cách hoạt động trong ví dụ về rules_cc.
Tạo dòng lệnh và biến môi trường bằng chuỗi công cụ C++
Thông thường, bạn sẽ tích hợp với chuỗi công cụ C++ để gắn cờ các dòng lệnh giống như quy tắc C++, nhưng không trực tiếp sử dụng các thao tác của C++. Điều này là do khi viết các hành động của riêng mình, chúng phải hoạt động nhất quán với chuỗi công cụ C++ – ví dụ: truyền cờ dòng lệnh C++ đến một công cụ gọi trình biên dịch C++ ở hậu trường.
Các quy tắc C++ sử dụng cách đặc biệt để tạo dòng lệnh dựa trên cấu hình tính năng. Để tạo một dòng lệnh, bạn cần có:
features
vàaction_configs
– các giá trị này được lấy từCcToolchainConfigInfo
và được đóng gói trongCcToolchainInfo
FeatureConfiguration
– được trả về bởi cc_common.configure_features- Các biến cấu hình chuỗi công cụ cc – được trả về bởi cc_common.create_compile_variables hoặc cc_common.create_link_variables.
Vẫn có các phương thức getter dành riêng cho công cụ, chẳng hạn như compiler_executable.
Ưu tiên get_tool_for_action
hơn các lệnh gọi này, vì các phương thức getter dành riêng cho công cụ sẽ bị xóa.
Bạn có thể xem toàn bộ ví dụ về cách hoạt động trong ví dụ về rules_cc.
Việc triển khai các quy tắc Starlark phụ thuộc vào các quy tắc C++ và/hoặc các quy tắc C++ có thể phụ thuộc vào
Hầu hết các quy tắc C++ đều cung cấp CcInfo
, một nhà cung cấp có chứa CompilationContext
và LinkingContext
.
Thông qua những tiện ích này, bạn có thể truy cập vào thông tin, chẳng hạn như tất cả tiêu đề bắc cầu hoặc thư viện để liên kết. Từ CcInfo
và từ CcToolchainInfo
, các quy tắc Starlark tuỳ chỉnh sẽ có thể lấy tất cả thông tin cần thiết.
Nếu quy tắc Starlark tuỳ chỉnh cung cấp CcInfo
, đó là tín hiệu cho các quy tắc C++ mà các quy tắc đó cũng có thể phụ thuộc vào quy tắc đó. Tuy nhiên, hãy thận trọng – nếu bạn chỉ cần truyền CcInfo
thông qua biểu đồ đến quy tắc nhị phân để sử dụng tệp này, hãy gói CcInfo
trong một nhà cung cấp khác. Ví dụ: nếu muốn khai báo phần phụ thuộc gốc lên đến java_binary
, thì quy tắc java_library
sẽ không cung cấp trực tiếp CcInfo
(cc_binary
phụ thuộc vào java_library
sẽ không hợp lý), chẳng hạn như phải bọc trong đó, ví dụ: JavaCcInfo
.
Bạn có thể xem toàn bộ ví dụ về cách hoạt động trong ví dụ về rules_cc.
Sử dụng lại logic và hành động của quy tắc C++
Chưa ổn định; Phần này sẽ được cập nhật sau khi API ổn định. Hãy theo dõi #4570 để biết thông tin mới nhất.