Trang này mô tả cách tích hợp với các quy tắc C++ ở các cấp độ khác nhau.
Truy cập chuỗi công cụ C++
Vì
việc di chuyển liên tục các quy tắc C++
lên nền tảng và
chuỗi công cụ, bạn
nên sử dụng chức năng trợ giúp có sẵn tại
@bazel_tools//tools/cpp:toolchain_utils.bzl,
Phương thức này hoạt động cả khi bạn tắt và bật chuỗi công cụ. Để phụ thuộc vào C++
chuỗi công cụ trong quy tắc của bạn, hãy thêm một
Label
thuộc tính có tên _cc_toolchain
và trỏ thuộc tính đó
đến @bazel_tools//tools/cpp:current_cc_toolchain
(một thực thể của
cc_toolchain_alias
mà 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)
để tải
CcToolchainInfo
.
Bạn có thể xem một ví dụ hoàn chỉnh 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++ để có cùng một gắn cờ dòng lệnh như quy tắc C++, nhưng không trực tiếp sử dụng thao tác C++. Đó là vì khi chúng ta viết hành động, chúng phải hành xử nhất quán với chuỗi công cụ C++ – ví dụ: truyền dòng lệnh C++ gắn cờ đối với một công cụ sẽ gọi trình biên dịch C++ ở hậu trường.
Quy tắc C++ sử dụng một cách đặc biệt để xây dựng dòng lệnh dựa trên tính năng cấu hình. Để tạo một dòng lệnh, bạn cần có:
features
vàaction_configs
- những ảnh này đến từCcToolchainConfigInfo
và được gói gọn trongCcToolchainInfo
FeatureConfiguration
– do cc_common.configure_features trả về- 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 (có thể thực thi).
Hãy ưu tiên get_tool_for_action
hơn các phương thức này vì các phương thức getter dành riêng cho công cụ sẽ
cuối cùng sẽ bị xoá.
Bạn có thể xem một ví dụ hoàn chỉnh 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
Hầu hết các quy tắc C++ đều cung cấp
CcInfo
!
một nhà cung cấp chứa CompilationContext
và
LinkingContext
.
Nhờ các công cụ này, bạn có thể truy cập thông tin
chẳng hạn như tất cả các tiêu đề bắc cầu
hoặc thư viện để liên kết. Từ CcInfo
và từ CcToolchainInfo
tùy chỉnh
Các quy tắc của Starlark có thể lấy được mọi thông tin cần thiết.
Nếu quy tắc Starlark tuỳ chỉnh cung cấp CcInfo
, thì đó là tín hiệu cho các quy tắc C++
họ cũng có thể phụ thuộc vào đó. Tuy nhiên, hãy thận trọng - nếu bạn chỉ cần tuyên bố
CcInfo
thông qua biểu đồ cho quy tắc nhị phân mà sau đó sử dụng chúng, gói
CcInfo
trong một nhà cung cấp khác. Ví dụ: nếu quy tắc java_library
muốn
để truyền các phần phụ thuộc gốc lên đến java_binary
, thì bạn không nên cung cấp
CcInfo
trực tiếp (cc_binary
phụ thuộc vào java_library
là không hợp lý),
nội dung đó sẽ được đặt trong mã, ví dụ: JavaCcInfo
.
Bạn có thể xem một ví dụ hoàn chỉnh 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 khi API ổn định. Theo dõi #4570 để xem thông tin mới nhất .