Cấu hình chuỗi công cụ C++

Tổng quan

Để gọi trình biên dịch với các tuỳ chọn phù hợp, Bazel cần một số kiến thức về các phần bên trong của trình biên dịch, chẳng hạn như các thư mục và cờ quan trọng. Nói cách khác, Bazel cần một mô hình trình biên dịch đơn giản để hiểu được hoạt động của nó.

Bazel cần biết những điều sau:

  • Liệu trình biên dịch có hỗ trợ mỏngLTO, mô-đun, liên kết động hay PIC (mã độc lập về vị trí) hay không.
  • Đường dẫn đến các công cụ bắt buộc như gcc, ld, ar, objcopy, v.v.
  • Hệ thống tích hợp sẵn bao gồm các thư mục. Bazel cần những thông tin này để xác thực rằng mọi tiêu đề trong tệp nguồn đã được khai báo đúng cách trong tệp BUILD.
  • sysroot mặc định.
  • Cờ sử dụng cho việc biên dịch, liên kết, lưu trữ.
  • Cờ cần dùng cho các chế độ biên dịch được hỗ trợ (opt, dbg, nhanh bản dựng).
  • Tạo các biến theo yêu cầu cụ thể của trình biên dịch.

Nếu trình biên dịch hỗ trợ nhiều cấu trúc, Bazel cần định cấu hình các cấu trúc đó một cách riêng biệt.

CcToolchainConfigInfo là một trình cung cấp cung cấp mức độ chi tiết cần thiết để định cấu hình hành vi của các quy tắc C++ của Bazel. Theo mặc định, Bazel tự động định cấu hình CcToolchainConfigInfo cho bản dựng, nhưng bạn có thể định cấu hình theo cách thủ công. Do đó, bạn cần quy tắc Starlark cung cấp CcToolchainConfigInfo và bạn cần trỏ thuộc tính toolchain_config của cc_toolchain đến quy tắc của mình. Bạn có thể tạo CcToolchainConfigInfo bằng cách gọi cc_common.create_cc_toolchain_config_info(). Bạn có thể tìm thấy các hàm khởi tạo Starlark cho tất cả các cấu trúc mà bạn sẽ cần trong quy trình này trong @rules_cc//cc:cc_toolchain_config_lib.bzl.

Khi một mục tiêu C++ bước vào giai đoạn phân tích, Bazel chọn mục tiêu cc_toolchain phù hợp dựa trên tệp BUILD và lấy trình cung cấp CcToolchainConfigInfo từ mục tiêu được chỉ định trong thuộc tính cc_toolchain.toolchain_config. Mục tiêu cc_toolchain truyền thông tin này đến mục tiêu C++ thông qua CcToolchainProvider.

Ví dụ: một thao tác biên dịch hoặc liên kết, được tạo thực thể bằng một quy tắc như cc_binary hoặc cc_library, cần có các thông tin sau:

  • Trình biên dịch hoặc trình liên kết cần sử dụng
  • Cờ dòng lệnh cho trình biên dịch/trình liên kết
  • Cờ cấu hình được truyền qua các tuỳ chọn --copt/--linkopt
  • Biến môi trường
  • Cấu phần phần mềm cần thiết trong hộp cát nơi hành động thực thi

Tất cả thông tin trên, ngoại trừ các cấu phần phần mềm bắt buộc trong hộp cát, được chỉ định trong mục tiêu Starlark mà cc_toolchain trỏ đến.

Các cấu phần phần mềm sẽ được chuyển đến hộp cát được khai báo trong mục tiêu cc_toolchain. Ví dụ: với thuộc tính cc_toolchain.linker_files, bạn có thể chỉ định thư viện tệp nhị phân của trình liên kết và thư viện chuỗi công cụ để đưa vào hộp cát.

Lựa chọn chuỗi công cụ

Logic lựa chọn chuỗi công cụ hoạt động như sau:

  1. Người dùng chỉ định một mục tiêu cc_toolchain_suite trong tệp BUILD và trỏ Bazel đến mục tiêu đó bằng cách sử dụng tuỳ chọn --crosstool_top.

  2. Mục tiêu cc_toolchain_suite tham chiếu đến nhiều chuỗi công cụ. Giá trị của cờ --cpu--compiler xác định chuỗi công cụ nào trong số đó được chọn, chỉ dựa trên giá trị cờ --cpu hoặc dựa trên giá trị --cpu | --compiler chung. Quy trình lựa chọn như sau:

    • Nếu bạn chỉ định tuỳ chọn --compiler, Bazel sẽ chọn mục tương ứng từ thuộc tính cc_toolchain_suite.toolchains bằng --cpu | --compiler. Nếu không tìm thấy mục tương ứng, Bazel sẽ gặp lỗi.

    • Nếu bạn không chỉ định tuỳ chọn --compiler, Bazel sẽ chọn mục nhập tương ứng từ thuộc tính cc_toolchain_suite.toolchains bằng --cpu.

    • Nếu không có cờ nào được chỉ định, Bazel sẽ kiểm tra hệ thống lưu trữ rồi chọn một giá trị --cpu dựa trên kết quả tìm được. Xem mã cơ chế kiểm tra.

Sau khi bạn chọn một chuỗi công cụ, các đối tượng featureaction_config tương ứng trong quy tắc Starlark sẽ chi phối cấu hình của bản dựng (tức là các mục được mô tả sau). Những thông báo này cho phép triển khai các tính năng C++ hoàn chỉnh trong Bazel mà không cần sửa đổi tệp nhị phân Bazel. Các quy tắc C++ hỗ trợ nhiều thao tác riêng biệt được ghi lại chi tiết trong mã nguồn Bazel.

Tính năng

Tính năng là một thực thể yêu cầu gắn cờ dòng lệnh, hành động, quy tắc ràng buộc đối với môi trường thực thi hoặc thay đổi phần phụ thuộc. Một tính năng có thể đơn giản như cho phép tệp BUILD chọn cấu hình cờ (chẳng hạn như treat_warnings_as_errors) hoặc tương tác với các quy tắc C++ và đưa vào thao tác biên dịch cũng như dữ liệu đầu vào mới cho quá trình biên dịch, chẳng hạn như header_modules hoặc thin_lto.

Lý tưởng nhất là CcToolchainConfigInfo chứa danh sách các tính năng, trong đó mỗi tính năng bao gồm một hoặc nhiều nhóm cờ, mỗi nhóm xác định một danh sách cờ áp dụng cho các thao tác cụ thể trên Bazel.

Một tính năng được chỉ định theo tên, cho phép phân tách hoàn toàn cấu hình quy tắc Starlark khỏi các bản phát hành Bazel. Nói cách khác, bản phát hành Bazel không ảnh hưởng đến hành vi của các cấu hình CcToolchainConfigInfo, miễn là các cấu hình đó không yêu cầu sử dụng tính năng mới.

Một tính năng được bật theo một trong các cách sau:

  • Trường enabled của đối tượng được đặt thành true.
  • Bazel hoặc chủ sở hữu quy tắc bật tính năng này một cách rõ ràng.
  • Người dùng bật tính năng này thông qua tuỳ chọn Bazel --feature hoặc thuộc tính quy tắc features.

Các tính năng có thể có các phần phụ thuộc lẫn nhau, phụ thuộc vào cờ dòng lệnh, chế độ cài đặt tệp BUILD và các biến khác.

Mối quan hệ của tính năng

Các phần phụ thuộc thường được quản lý trực tiếp bằng Bazel, đơn giản chỉ thực thi các yêu cầu và quản lý các xung đột nội tại đối với bản chất của các tính năng được xác định trong bản dựng. Thông số kỹ thuật của chuỗi công cụ cho phép bạn đưa ra các quy tắc ràng buộc chi tiết hơn để sử dụng ngay trong quy tắc Starlark chi phối việc mở rộng và hỗ trợ tính năng. Đó là:

Hạn chế Mô tả
requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
]
Cấp tính năng. Tính năng này chỉ được hỗ trợ nếu bạn bật các tính năng bắt buộc đã chỉ định. Ví dụ: khi một tính năng chỉ được hỗ trợ trong một số chế độ bản dựng nhất định (opt, dbg hoặc fastbuild). Nếu "requires" chứa nhiều "feature_set" thì tính năng sẽ được hỗ trợ nếu bất kỳ "feature_set" nào được đáp ứng (khi tất cả tính năng đã chỉ định đều được bật).
implies = ['feature']

Cấp tính năng. Tính năng này ngụ ý(các) tính năng được chỉ định. Việc bật một tính năng cũng ngầm bật tất cả các tính năng mà tính năng đó ngụ ý (nghĩa là tính năng này hoạt động theo quy tắc đệ quy).

Ngoài ra, bạn có thể tách các nhóm chức năng phổ biến ra khỏi một tập hợp tính năng, chẳng hạn như các phần phổ biến của các trình dọn dẹp. Không thể tắt các tính năng ngụ ý.

provides = ['feature']

Cấp tính năng. Cho biết rằng tính năng này là một trong nhiều tính năng thay thế loại trừ lẫn nhau. Ví dụ: tất cả các trình dọn dẹp có thể chỉ định provides = ["sanitizer"].

Điều này giúp cải thiện khả năng xử lý lỗi bằng cách liệt kê các phương án thay thế nếu người dùng yêu cầu sử dụng hai hoặc nhiều tính năng loại trừ lẫn nhau cùng một lúc.

with_features = [
  with_feature_set(
    features = ['feature-1'],
    not_features = ['feature-2'],
  ),
]
Cấp độ đã đặt cờ. Một tính năng có thể chỉ định nhiều bộ cờ với nhiều bộ cờ. Khi with_features được chỉ định, tập hợp cờ sẽ chỉ mở rộng thành lệnh bản dựng nếu có ít nhất một with_feature_set mà tất cả các tính năng trong tập hợp features đã chỉ định được bật và tất cả tính năng được chỉ định trong tập hợp not_features đều bị tắt. Nếu bạn không chỉ định with_features, tập hợp cờ sẽ được áp dụng vô điều kiện cho mọi thao tác được chỉ định.

Thao tác

Thao tác cho phép bạn linh hoạt sửa đổi những tình huống mà một thao tác thực thi mà không cần giả định cách thực hiện thao tác đó. action_config chỉ định tệp nhị phân của công cụ mà một hành động gọi, còn feature chỉ định cấu hình (cờ) xác định cách công cụ đó hoạt động khi hành động đó được gọi.

Tính năng tham chiếu các thao tác để cho biết những thao tác Bazel ảnh hưởng đến vì các thao tác có thể sửa đổi biểu đồ hành động Bazel. Trình cung cấp CcToolchainConfigInfo chứa các thao tác có cờ và công cụ liên kết, chẳng hạn như c++-compile. Cờ được gán cho mỗi hành động bằng cách liên kết hành động đó với một tính năng.

Mỗi tên hành động đại diện cho một loại hành động do Bazel thực hiện, chẳng hạn như biên dịch hoặc liên kết. Tuy nhiên, có mối quan hệ nhiều với một giữa thao tác và các loại thao tác Bazel, trong đó loại thao tác Bazel đề cập đến một lớp Java triển khai một thao tác (chẳng hạn như CppCompileAction). Cụ thể, "thao tác kết hợp" và "thao tác trình biên dịch" trong bảng dưới đây là CppCompileAction, còn thao tác liên kết là CppLinkAction.

Thao tác trong trình kết hợp

Hành động Mô tả
preprocess-assemble Tập hợp xử lý trước. Thường đối với tệp .S.
assemble Lắp ráp mà không xử lý trước. Thường đối với tệp .s.

Thao tác của trình biên dịch

Hành động Mô tả
cc-flags-make-variable Truyền CC_FLAGS vào các quy tắc genrules.
c-compile Biên dịch dưới dạng C.
c++-compile Biên dịch dưới dạng C++.
c++-header-parsing Chạy trình phân tích cú pháp của trình biên dịch trên tệp tiêu đề để đảm bảo rằng tiêu đề này là tiêu đề độc lập, vì sẽ gây ra lỗi biên dịch. Chỉ áp dụng cho những chuỗi công cụ hỗ trợ các mô-đun.
Hành động Mô tả
c++-link-dynamic-library Liên kết một thư viện chia sẻ chứa tất cả các phần phụ thuộc của thư viện đó.
c++-link-nodeps-dynamic-library Liên kết một thư viện chia sẻ chỉ chứa cc_library nguồn.
c++-link-executable Liên kết một thư viện hoàn thiện đã sẵn sàng chạy.

Hành động thực tế tăng cường

Các hành động AR tập hợp các tệp đối tượng vào thư viện lưu trữ (tệp .a) thông qua ar và mã hoá một số ngữ nghĩa thành tên.

Hành động Mô tả
c++-link-static-library Tạo thư viện tĩnh (lưu trữ).

Hành động LTO

Hành động Mô tả
lto-backend Thao tác ThinLTO biên dịch mã bit thành các đối tượng gốc.
lto-index Hành động ThinLTO tạo chỉ mục toàn cầu.

Sử dụng action_config

action_config là một cấu trúc Starlark mô tả một Hành động Bazel bằng cách chỉ định công cụ (tệp nhị phân) để gọi trong thao tác và các bộ cờ, do các tính năng xác định. Những cờ này áp dụng các quy tắc ràng buộc cho quá trình thực thi của hành động.

Hàm khởi tạo action_config() có các thông số sau:

Thuộc tính Mô tả
action_name Hành động Bazel tương ứng với hành động này. Bazel sử dụng thuộc tính này để khám phá các công cụ mỗi hành động và các yêu cầu thực thi.
tools Tệp thực thi để gọi. Công cụ được áp dụng cho thao tác sẽ là công cụ đầu tiên trong danh sách có bộ tính năng phù hợp với cấu hình tính năng. Giá trị mặc định phải được cung cấp.
flag_sets Danh sách cờ áp dụng cho một nhóm thao tác. Tương tự như đối với một tính năng.
env_sets Danh sách các quy tắc hạn chế về môi trường áp dụng cho một nhóm thao tác. Tương tự như đối với một đối tượng.

action_config có thể yêu cầu và ngụ ý các tính năng cũng như action_config khác theo quy định trong các mối quan hệ tính năng mô tả ở trên. Hành vi này tương tự như hành vi của một tính năng.

2 thuộc tính cuối cùng là thừa so với các thuộc tính tương ứng trên các tính năng và được đưa vào vì một số thao tác Bazel yêu cầu một số cờ hoặc biến môi trường nhất định, đồng thời mục tiêu là để tránh các cặp action_config + feature không cần thiết. Thông thường, việc chia sẻ một tính năng duy nhất trên nhiều action_config sẽ được ưu tiên.

Bạn không thể xác định nhiều action_config bằng cùng một action_name trong cùng một chuỗi công cụ. Điều này giúp ngăn chặn tình trạng không rõ ràng trong các đường dẫn công cụ và thực thi ý định đằng sau action_config – rằng các thuộc tính của hành động được mô tả rõ ràng ở một vị trí duy nhất trong chuỗi công cụ.

Sử dụng hàm khởi tạo công cụ

action_config có thể chỉ định một tập hợp công cụ thông qua tham số tools. Hàm khởi tạo tool() nhận các thông số sau:

Trường Mô tả
tool_path Đường dẫn đến công cụ đang được đề cập (tương ứng với vị trí hiện tại).
with_features Một danh sách gồm các bộ tính năng trong đó có ít nhất một tính năng phải đáp ứng thì công cụ này mới có thể áp dụng.

Đối với một action_config nhất định, chỉ một tool duy nhất áp dụng đường dẫn công cụ và các yêu cầu thực thi của thao tác đó cho thao tác Bazel. Một công cụ được chọn bằng cách lặp lại thông qua thuộc tính tools trên action_config cho đến khi tìm thấy một công cụ có bộ with_feature phù hợp với cấu hình tính năng (xem phần Mối quan hệ của tính năng ở phần trước trên trang này để biết thêm thông tin). Bạn nên kết thúc danh sách công cụ của mình bằng một công cụ mặc định tương ứng với cấu hình tính năng trống.

Ví dụ về cách sử dụng

Bạn có thể sử dụng kết hợp các tính năng và thao tác để triển khai thao tác Bazel với ngữ nghĩa đa dạng trên nhiều nền tảng. Ví dụ: việc tạo biểu tượng gỡ lỗi trên macOS yêu cầu tạo biểu tượng trong thao tác biên dịch, sau đó gọi một công cụ chuyên dụng trong thao tác liên kết để tạo bản lưu trữ dsym nén, sau đó giải nén tệp lưu trữ đó để tạo gói ứng dụng và các tệp .plist có thể tiêu thụ bằng Xcode.

Với Bazel, quy trình này có thể được triển khai như sau, trong đó unbundle-debuginfo là một thao tác Bazel:

load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")

action_configs = [
    action_config (
        config_name = ACTION_NAMES.cpp_link_executable,
        action_name = ACTION_NAMES.cpp_link_executable,
        tools = [
            tool(
                with_features = [
                    with_feature(features=["generate-debug-symbols"]),
                ],
                tool_path = "toolchain/mac/ld-with-dsym-packaging",
            ),
            tool (tool_path = "toolchain/mac/ld"),
        ],
    ),
]

features = [
    feature(
        name = "generate-debug-symbols",
        flag_sets = [
            flag_set (
                actions = [
                    ACTION_NAMES.c_compile,
                    ACTION_NAMES.cpp_compile
                ],
                flag_groups = [
                    flag_group(
                        flags = ["-g"],
                    ),
                ],
            )
        ],
        implies = ["unbundle-debuginfo"],
   ),
]

Tính năng tương tự này có thể được triển khai hoàn toàn theo cách khác cho Linux (sử dụng fission) hoặc cho Windows (tạo ra các tệp .pdb). Chẳng hạn, quy trình triển khai để tạo biểu tượng gỡ lỗi dựa trên fission có thể như sau:

load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")

action_configs = [
    action_config (
        name = ACTION_NAMES.cpp_compile,
        tools = [
            tool(
                tool_path = "toolchain/bin/gcc",
            ),
        ],
    ),
]

features = [
    feature (
        name = "generate-debug-symbols",
        requires = [with_feature_set(features = ["dbg"])],
        flag_sets = [
            flag_set(
                actions = [ACTION_NAMES.cpp_compile],
                flag_groups = [
                    flag_group(
                        flags = ["-gsplit-dwarf"],
                    ),
                ],
            ),
            flag_set(
                actions = [ACTION_NAMES.cpp_link_executable],
                flag_groups = [
                    flag_group(
                        flags = ["-Wl", "--gdb-index"],
                    ),
                ],
            ),
      ],
    ),
]

Nhóm gắn cờ

CcToolchainConfigInfo cho phép bạn nhóm các cờ thành các nhóm phục vụ một mục đích cụ thể. Bạn có thể chỉ định cờ trong bằng cách sử dụng các biến được xác định trước trong giá trị cờ mà trình biên dịch sẽ mở rộng khi thêm cờ vào lệnh bản dựng. Ví dụ:

flag_group (
    flags = ["%{output_file_path}"],
)

Trong trường hợp này, nội dung của cờ sẽ được thay thế bằng đường dẫn tệp đầu ra của hành động.

Nhóm gắn cờ được mở rộng thành lệnh tạo bản dựng theo thứ tự mà chúng xuất hiện trong danh sách, từ trên xuống dưới, từ trái sang phải.

Đối với những cờ cần lặp lại với các giá trị khác nhau khi được thêm vào lệnh tạo bản dựng, nhóm cờ có thể lặp lại các biến thuộc loại list. Ví dụ: biến include_path thuộc loại list:

flag_group (
    iterate_over = "include_paths",
    flags = ["-I%{include_paths}"],
)

mở rộng thành -I<path> cho từng phần tử đường dẫn trong danh sách include_paths. Tất cả cờ (hoặc flag_group) trong phần nội dung khai báo nhóm cờ đều được mở rộng dưới dạng một đơn vị. Ví dụ:

flag_group (
    iterate_over = "include_paths",
    flags = ["-I", "%{include_paths}"],
)

mở rộng thành -I <path> cho từng phần tử đường dẫn trong danh sách include_paths.

Một biến có thể lặp lại nhiều lần. Ví dụ:

flag_group (
    iterate_over = "include_paths",
    flags = ["-iprefix=%{include_paths}", "-isystem=%{include_paths}"],
)

mở rộng thành:

-iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>

Các biến có thể tương ứng với các cấu trúc có thể truy cập được bằng cách sử dụng ký hiệu dấu chấm. Ví dụ:

flag_group (
    flags = ["-l%{libraries_to_link.name}"],
)

Các cấu trúc có thể được lồng và cũng có thể chứa chuỗi. Để tránh trùng tên và để rõ ràng, bạn phải chỉ định đường dẫn đầy đủ thông qua các trường. Ví dụ:

flag_group (
    iterate_over = "libraries_to_link",
    flag_groups = [
        flag_group (
            iterate_over = "libraries_to_link.shared_libraries",
            flags = ["-l%{libraries_to_link.shared_libraries.name}"],
        ),
    ],
)

Mở rộng có điều kiện

Nhóm cờ hỗ trợ tính năng mở rộng có điều kiện dựa trên sự hiện diện của một biến cụ thể hoặc trường của biến đó bằng cách sử dụng các thuộc tính expand_if_available, expand_if_not_available, expand_if_true, expand_if_false hoặc expand_if_equal. Ví dụ:

flag_group (
    iterate_over = "libraries_to_link",
    flag_groups = [
        flag_group (
            iterate_over = "libraries_to_link.shared_libraries",
            flag_groups = [
                flag_group (
                    expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
                    flags = ["--whole_archive"],
                ),
                flag_group (
                    flags = ["-l%{libraries_to_link.shared_libraries.name}"],
                ),
                flag_group (
                    expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
                    flags = ["--no_whole_archive"],
                ),
            ],
        ),
    ],
)

Tài liệu tham khảo về CcToolchainConfigInfo

Phần này cung cấp tài liệu tham khảo về các biến thể bản dựng, tính năng và các thông tin khác cần thiết để định cấu hình thành công quy tắc C++.

Biến xây dựng CcToolchainConfigInfo

Sau đây là thông tin tham khảo về các biến xây dựng CcToolchainConfigInfo.

Biến Hành động Mô tả
source_file compile Tệp nguồn để biên dịch.
input_file dải Cấu phần phần mềm cần loại bỏ.
output_file compile Kết quả biên dịch.
output_assembly_file compile Tệp tập hợp đã phát. Chỉ áp dụng khi thao tác compile phát ra văn bản tập hợp, thường là khi sử dụng cờ --save_temps. Nội dung giống như trong output_file.
output_preprocess_file compile Đầu ra đã xử lý trước. Chỉ áp dụng cho các thao tác biên dịch chỉ xử lý trước tệp nguồn, thường là khi sử dụng cờ --save_temps. Nội dung giống như trong output_file.
includes compile Trình tự các tệp mà trình biên dịch phải đưa vào nguồn đã biên dịch một cách vô điều kiện.
include_paths compile Các thư mục trình tự mà trong đó trình biên dịch tìm kiếm các tiêu đề đi kèm bằng cách sử dụng #include<foo.h>#include "foo.h".
quote_include_paths compile Trình tự -iquote bao gồm - các thư mục mà trình biên dịch tìm kiếm các tiêu đề được đưa vào bằng #include "foo.h".
system_include_paths compile Trình tự -isystem bao gồm - các thư mục mà trình biên dịch tìm kiếm các tiêu đề được đưa vào bằng #include <foo.h>.
dependency_file compile Tệp phần phụ thuộc .d do trình biên dịch tạo.
preprocessor_defines compile Trình tự của defines, chẳng hạn như --DDEBUG.
pic compile Biên dịch đầu ra dưới dạng mã độc lập về vị trí.
gcov_gcno_file compile Tệp mức độ sử dụng gcov.
per_object_debug_info_file compile Tệp thông tin gỡ lỗi cho mỗi đối tượng (.dwp).
stripotps dải Trình tự của stripopts.
legacy_compile_flags compile Trình tự gắn cờ từ các trường CROSSTOOL cũ như compiler_flag, optional_compiler_flag, cxx_flagoptional_cxx_flag.
user_compile_flags compile Trình tự các cờ từ thuộc tính quy tắc copt hoặc cờ --copt, --cxxopt--conlyopt.
unfiltered_compile_flags compile Trình tự các cờ từ trường CROSSTOOLunfiltered_cxx_flag hoặc tính năng unfiltered_compile_flags. Những quy tắc này không được lọc bằng thuộc tính quy tắc nocopts.
sysroot sysroot
runtime_library_search_directories đường liên kết Các mục nhập trong đường dẫn tìm kiếm trong thời gian chạy của trình liên kết (thường được đặt bằng cờ -rpath).
library_search_directories đường liên kết Các mục nhập trong đường dẫn tìm kiếm của trình liên kết (thường được đặt bằng cờ -L).
libraries_to_link đường liên kết Gắn cờ cung cấp các tệp để liên kết dưới dạng dữ liệu đầu vào trong lệnh gọi trình liên kết.
def_file_path đường liên kết Vị trí của tệp def được dùng trên Windows với MSVC.
linker_param_file đường liên kết Vị trí của tệp tham số trình liên kết do bazel tạo để vượt qua giới hạn độ dài dòng lệnh.
output_execpath đường liên kết Đường dẫn thực thi của đầu ra của trình liên kết.
generate_interface_library đường liên kết "yes" hoặc "no" tuỳ thuộc vào việc thư viện giao diện có được tạo hay không.
interface_library_builder_path đường liên kết Đường dẫn đến công cụ trình tạo thư viện giao diện.
interface_library_input_path đường liên kết Thông tin đầu vào cho công cụ tạo ifso của thư viện giao diện.
interface_library_output_path đường liên kết Đường dẫn nơi tạo thư viện giao diện bằng công cụ tạo ifso.
legacy_link_flags đường liên kết Cờ trình liên kết đến từ các trường CROSSTOOL cũ.
user_link_flags đường liên kết Cờ trình liên kết đến từ thuộc tính --linkopt hoặc linkopts.
symbol_counts_output đường liên kết Đường dẫn để ghi số lượng biểu tượng.
linkstamp_paths đường liên kết Một biến bản dựng cung cấp các đường dẫn linkstamp.
force_pic đường liên kết Sự hiện diện của biến này cho biết mã PIC/PIE cần được tạo (tuỳ chọn Bazel `--force_pic` đã được chuyển).
strip_debug_symbols đường liên kết Sự hiện diện của biến này cho biết rằng bạn cần xoá các biểu tượng gỡ lỗi.
is_cc_test đường liên kết "True" khi thao tác hiện tại là thao tác liên kết cc_test, nếu không thì sẽ sai.
is_using_fission biên dịch, liên kết Sự hiện diện của biến này cho biết rằng tính năng phân hạch (thông tin gỡ lỗi cho mỗi đối tượng) đã được kích hoạt. Thông tin gỡ lỗi sẽ nằm trong các tệp .dwo thay vì các tệp .o. Đồng thời, trình biên dịch và trình liên kết cần biết điều này.
fdo_instrument_path biên dịch, liên kết Đường dẫn đến thư mục lưu trữ hồ sơ đo lường FDO.
fdo_profile_path compile Đường dẫn đến hồ sơ FDO.
fdo_prefetch_hints_path compile Đường dẫn đến cấu hình tìm nạp trước bộ nhớ đệm.
csfdo_instrument_path biên dịch, liên kết Đường dẫn đến thư mục lưu trữ hồ sơ đo lường FDO theo bối cảnh.

Tính năng nổi tiếng

Sau đây là thông tin tham chiếu về các tính năng và điều kiện kích hoạt các tính năng đó.

Tính năng Tài liệu
opt | dbg | fastbuild Bật theo mặc định dựa trên chế độ biên dịch.
static_linking_mode | dynamic_linking_mode Được bật theo mặc định dựa trên chế độ liên kết.
per_object_debug_info Bật nếu tính năng supports_fission được chỉ định và bật, đồng thời chỉ định chế độ biên dịch hiện tại trong cờ --fission.
supports_start_end_lib Nếu bật (và đặt tuỳ chọn --start_end_lib), Bazel sẽ không liên kết với các thư viện tĩnh mà thay vào đó sẽ sử dụng các tuỳ chọn trình liên kết --start-lib/--end-lib để liên kết trực tiếp với các đối tượng. Việc này giúp tăng tốc quá trình xây dựng vì Bazel không phải xây dựng các thư viện tĩnh.
supports_interface_shared_libraries Nếu bạn bật tuỳ chọn này (và đặt tuỳ chọn --interface_shared_objects), Bazel sẽ liên kết các mục tiêu đã đặt linkstatic thành False (cc_test theo mặc định) với các thư viện chia sẻ giao diện. Điều này giúp quá trình liên kết lại gia tăng diễn ra nhanh hơn.
supports_dynamic_linker Nếu được bật, các quy tắc C++ sẽ biết chuỗi công cụ có thể tạo thư viện dùng chung.
static_link_cpp_runtimes Nếu được bật, Bazel sẽ liên kết môi trường thời gian chạy C++ theo cách tĩnh ở chế độ liên kết tĩnh và động ở chế độ liên kết động. Các cấu phần phần mềm được chỉ định trong thuộc tính cc_toolchain.static_runtime_lib hoặc cc_toolchain.dynamic_runtime_lib (tuỳ thuộc vào chế độ liên kết) sẽ được thêm vào các thao tác liên kết.
supports_pic Nếu bạn bật, chuỗi công cụ sẽ biết sử dụng các đối tượng PIC cho các thư viện động. Biến "pic" sẽ xuất hiện bất cứ khi nào bạn cần biên dịch PIC. Nếu tính năng "--force_pic" không được bật theo mặc định và được truyền, Bazel sẽ yêu cầu "supports_pic" và xác thực rằng tính năng này đã được bật. Nếu không thể hoặc không thể bật tính năng này, thì bạn sẽ không thể sử dụng "--force_pic".
static_linking_mode | dynamic_linking_mode Được bật theo mặc định dựa trên chế độ liên kết.
no_legacy_features Ngăn Bazel thêm các tính năng cũ vào cấu hình C++ (nếu có). Hãy xem danh sách đầy đủ các tính năng dưới đây.

Logic vá các tính năng cũ

Bazel áp dụng những thay đổi sau cho các tính năng của chuỗi công cụ để có khả năng tương thích ngược:

  • Di chuyển tính năng legacy_compile_flags lên đầu chuỗi công cụ
  • Di chuyển tính năng default_compile_flags lên đầu chuỗi công cụ
  • Thêm tính năng dependency_file (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng pic (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng per_object_debug_info (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng preprocessor_defines (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng includes (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng include_paths (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng fdo_instrument (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng fdo_optimize (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng cs_fdo_instrument (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng cs_fdo_optimize (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng fdo_prefetch_hints (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng autofdo (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng build_interface_libraries (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng dynamic_library_linker_tool (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng symbol_counts (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng shared_flag (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng linkstamps (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng output_execpath_flags (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng runtime_library_search_directories (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng library_search_directories (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng archiver_flags (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng libraries_to_link (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng force_pic_flags (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng user_link_flags (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng legacy_link_flags (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng static_libgcc (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng fission_support (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng strip_debug_symbols (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng coverage (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng llvm_coverage_map_format (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng gcc_coverage_map_format (nếu không có) vào đầu chuỗi công cụ
  • Thêm tính năng fully_static_link (nếu không có) vào cuối chuỗi công cụ
  • Thêm tính năng user_compile_flags (nếu không có) vào cuối chuỗi công cụ
  • Thêm tính năng sysroot (nếu không có) vào cuối chuỗi công cụ
  • Thêm tính năng unfiltered_compile_flags (nếu không có) vào cuối chuỗi công cụ
  • Thêm tính năng linker_param_file (nếu không có) vào cuối chuỗi công cụ
  • Thêm tính năng compiler_input_flags (nếu không có) vào cuối chuỗi công cụ
  • Thêm tính năng compiler_output_flags (nếu không có) vào cuối chuỗi công cụ

Đây là một danh sách dài gồm nhiều tính năng. Mục đích của kế hoạch là loại bỏ chúng sau khi hoàn tất Crosstool trong Starlark. Nếu độc giả tò mò muốn xem cách triển khai trong CppActionConfigs, hãy cân nhắc thêm no_legacy_features để chuỗi công cụ độc lập hơn đối với các chuỗi công cụ phát hành chính thức.