Tích hợp với quy tắc C++

Trang này mô tả cách tích hợp với các quy tắc C++ ở nhiều cấp độ.

Truy cập vào chuỗi công cụ C++

Do quá trình di chuyển liên tục các quy tắc C++ sang các nền tảngchuỗi công cụ, bạn nên sử dụng hàm trợ giúp có tại @bazel_tools//tools/cpp:toolchain_utils.bzl, Hàm này hoạt động cả khi 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 của mình, hãy thêm một Label thuộc tính có tên là _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 quy tắc, 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ể tìm thấy một ví dụ minh hoạ hoàn chỉnh trong các 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 các cờ dòng lệnh như các quy tắc C++, nhưng không sử dụng trực tiếp các thao tác C++. Lý do là vì khi viết các thao tác của riêng mình, các thao tác này phải hoạt động nhất quán với chuỗi công cụ C++. Ví dụ: truyền các cờ dòng lệnh C++ đến một công cụ gọi trình biên dịch C++ ở chế độ nền.

Các quy tắc C++ sử dụng một 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 dòng lệnh, bạn cần có những thông tin sau:

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. Bạn nên dùng get_tool_for_action thay vì 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ẽ bị xoá.

Bạn có thể tìm thấy một ví dụ minh hoạ hoàn chỉnh trong các ví dụ về rules_cc.

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 chứa CompilationContextLinkingContext. Thông qua các quy tắc này, bạn có thể truy cập vào thông tin 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ừ các quy tắc Starlark tuỳ chỉnh CcToolchainInfo sẽ có thể lấy được tất cả thông tin mà chúng cần.

Nếu một quy tắc Starlark tuỳ chỉnh cung cấp CcInfo, thì đó là tín hiệu cho các quy tắc C++ rằng chúng cũng có thể phụ thuộc vào quy tắc đó. Tuy nhiên, hãy cẩn thận. Nếu bạn chỉ cần truyền CcInfo thông qua biểu đồ đến quy tắc nhị phân, sau đó sử dụng quy tắc đó, hãy 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ì quy tắc đó không được cung cấp CcInfo trực tiếp (việc cc_binary phụ thuộc vào java_library không có ý nghĩa), mà phải gói quy tắc đó trong, chẳng hạn như JavaCcInfo.

Bạn có thể tìm thấy một ví dụ minh hoạ hoàn chỉnh trong các ví dụ về rules_cc.

Tái sử dụng logic và các thao tác 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.