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

Báo cáo vấn đề Xem nguồn Nightly · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Tổng quan

Để gọi trình biên dịch bằng các tuỳ chọn phù hợp, Bazel cần có một số kiến thức về trình biên dịch bên trong, chẳng hạn như bao gồm 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 được đơn giản hoá để hiểu hoạt động.

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

  • Liệu trình biên dịch có hỗ trợ thinLTO, mô-đun, liên kết động hay PIC (mã độc lập với 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 bao gồm các thư mục. Bazel cần những thông tin này để xác thực rằng tất cả tiêu đề có trong tệp nguồn được khai báo đúng cách trong tệp BUILD.
  • sysroot mặc định.
  • Cờ nào cần sử dụng để biên dịch, liên kết, lưu trữ.
  • Cờ nào sẽ được sử dụng cho các chế độ biên dịch được hỗ trợ (opt, dbg, fastbuild).
  • Tạo các biến mà trình biên dịch yêu cầu cụ thể.

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

CcToolchainConfigInfo là một nhà cung cấp cung cấp cấp độ cần thiết độ chi tiế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ó lựa chọn định cấu hình theo cách thủ công. Để làm được điều đó, bạn cần có một 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ấu trúc mà bạn 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 đối tượng cc_toolchain nhắm mục tiêu dựa trên tệp BUILD và nhận được CcToolchainConfigInfo khỏi mục tiêu đã 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 hành động biên dịch hoặc liên kết, được tạo bản sao bằng một quy tắc như cc_binary hoặc cc_library, cần 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 mà thao tác 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) đều được chỉ định trong mục tiêu Starlark mà cc_toolchain trỏ đến.

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

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

Logic 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à điểm 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ụ. Chiến lược phát hành đĩa đơn giá trị của cờ --cpu--compiler sẽ xác định giá trị nào trong số đó chuỗi công cụ được chọn, chỉ dựa trên giá trị cờ --cpu, hoặc dựa trên giá trị --cpu | --compiler chung. Quá trình lựa chọn diễn ra như sau:

    • Nếu bạn 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 | --compiler. Nếu không tìm thấy mục nhập tương ứng, Bazel sẽ gửi một lỗi.

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

    • Nếu không có cờ nào được chỉ định, Bazel sẽ kiểm tra hệ thống máy chủ lưu trữ và chọn một --cpu giá trị dựa trên phát hiện của công cụ này. 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ẽ điều chỉnh cấu hình của bản dựng (tức là các mục được mô tả sau). Các 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. 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 cờ dòng lệnh, hành động, điều kiện 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 đối tượng có thể đơn giản như cho phép tệp BUILD chọn cấu hình cờ hiệu, chẳng hạn như treat_warnings_as_errors hoặc tương tác với các quy tắc C++ và bao gồm các hành động biên dịch mới và dữ liệu đầu vào vào 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 hành động cụ thể của Bazel.

Một đối tượng được chỉ định theo tên, cho phép tách hoàn toàn Starlark cấu hình quy tắc từ 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ấu hình CcToolchainConfigInfo, miễn là các cấu hình đó không yêu cầu sử dụng các tính năng mới.

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

  • Trường enabled của tính năng này được đặt thành true.
  • Bazel hoặc chủ sở hữu quy tắc bật quy tắc 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ó mối quan hệ 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ệ giữ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, vốn chỉ đơn giản là thực thi các yêu cầu và quản lý những xung đột nội tại về 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 các quy tắc ràng buộc chi tiết hơn để sử dụng trực tiếp trong quy tắc Starlark quản lý việc hỗ trợ và mở rộng tính năng. Đó là:

Giới hạn Nội dung 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 được chỉ định. Ví dụ: khi một tính năng chỉ được hỗ trợ trong một số chế độ xây dựng nhất định (opt, dbg hoặc fastbuild). Nếu yêu cầu chứa nhiều thuộc tính "feature_set" tính năng được hỗ trợ nếu có bất kỳ thuộc tính "feature_set" nào được đáp ứng (khi tất cả tính năng được 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 ẩn bật tất cả các tính năng mà tính năng đó ngụ ý (tức là tính năng đó hoạt động đệ quy).

Cũng có thể phân tích các nhóm nhỏ chức năng phổ biến ngoài một tập hợp các tính năng, chẳng hạn như các bộ phận phổ biến của chất tẩy rửa. Không thể tắt các tính năng ngụ ý.

provides = ['feature']

Cấp tính năng. Cho biết tính năng này là một trong số nhiều tính năng thay thế loại trừ lẫn nhau. Ví dụ: tất cả các chất khử trùng 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 cho 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 tập hợp cờ có nhiều tập hợp cờ. Khi bạn chỉ định with_features, cờ đã đặt sẽ chỉ mở rộng vào lệnh bản dựng nếu có ít nhất một with_feature_set mà tất cả tính năng trong features được chỉ định được đặt đã bật và tất cả tính năng được chỉ định trong not_features đã bị vô hiệu hoá. Nếu không chỉ định with_features, cờ được đặt sẽ là được áp dụng vô điều kiện cho mọi hành động cụ thể.

Thao tác

Hành động giúp bạn linh hoạt sửa đổi các trường hợp mà một hành động thực thi mà không cần giả định cách hành động đó sẽ chạy. Một action_config chỉ định tệp nhị phân của công cụ mà một hành động gọi ra, trong khi feature chỉ định cấu hình (gắn 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 hành động để báo hiệu các hành động của Bazel chúng ảnh hưởng bởi các hành động 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 với chúng, chẳng hạn như c++-compile. Cờ được chỉ định cho từng hành động bằng cách liên kết các 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 các hành động và các loại hành động Bazel, trong đó một loại hành động 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ể, "hành động liên quan đến tập hợp" và "hành động của trình biên dịch" trong bảng bên dưới là CppCompileAction, còn thao tác liên kết là CppLinkAction.

Thao tác với trình tập hợp

Hành động Nội dung mô tả
preprocess-assemble Tập hợp bằng cách xử lý trước. Thường dùng cho các tệp .S.
assemble Tập hợp mà không cần xử lý trước. Thường dành cho các tệp .s.

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

Hành động Nội dung mô tả
cc-flags-make-variable Truyền CC_FLAGS đến genrules.
c-compile Biên dịch dưới tên 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 đề độc lập, vì sẽ gây ra lỗi biên dịch. Áp dụng chỉ đối với chuỗi công cụ hỗ trợ các mô-đun.
Hành động Nội dung 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 thư viện cuối cùng sẵn sàng chạy.

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

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

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

Hành động LTO

Hành động Nội dung 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 Thao tác 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 Bazel bằng cách chỉ định công cụ (tệp nhị phân) để gọi trong khi thực hiện hành động và tập hợp cờ, được xác định bởi các tính năng. Các 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 tham số sau:

Thuộc tính Nội dung mô tả
action_name Thao tác Bazel tương ứng với thao tác này. Bazel sử dụng thuộc tính này để khám phá công cụ và hoạt động thực thi cho mỗi hành động các yêu cầu liên quan.
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ó tập hợp tính năng khớp với cấu hình tính năng. Bạn phải cung cấp giá trị mặc định.
flag_sets Danh sách cờ áp dụng cho một nhóm hành động. Tương tự như đối với của chúng tôi.
env_sets Danh sách các quy tắc ràng buộc môi trường áp dụng cho một nhóm hành động. Tương tự như đối với tính năng.

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

Hai 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 trong Bazel yêu cầu một số cờ hoặc biến môi trường nhất định và mục tiêu là tránh các cặp action_config+feature không cần thiết. Thông thường, bạn nên chia sẻ một tính năng trên nhiều action_config.

Bạn không thể xác định nhiều hơn một 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 tránh tình trạng không rõ ràng trong đường dẫn công cụ và thực thi ý định đằng sau action_config – rằng thuộc tính của một hành động được mô tả rõ ràng tại 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 bộ công cụ thông qua tham số tools. Hàm khởi tạo tool() nhận các tham số sau:

Trường Nội dung mô tả
path Đường dẫn đến công cụ có liên quan (tương ứng với vị trí hiện tại).
with_features Danh sách các nhóm tính năng, trong đó ít nhất một nhóm phải được đáp ứng để công cụ này áp dụng.

Đối với một action_config nhất định, chỉ áp dụng một tool duy nhất đường dẫn công cụ và các yêu cầu thực thi đối với hành động Bazel. Một công cụ được chọn bằng cách lặp lại thuộc tính tools trên action_config cho đến khi tìm thấy một công cụ có tập hợp with_feature khớp với cấu hình tính năng (xem phần Mối quan hệ giữa các tính năng ở 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ụ bằng công cụ tương ứng với một 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 các thao tác trên Bazel với ngữ nghĩa đa nền tảng. Ví dụ: gỡ lỗi tạo biểu tượng trên macOS yêu cầu tạo các biểu tượng trong thao tác biên dịch, sau đó gọi một công cụ chuyên biệt trong quá trình thực hiện thao tác liên kết để tạo tệp lưu trữ dsym được nén và sau đó giải nén tệp lưu trữ đó để tạo gói ứng dụng và .plist được cung cấp bởi Xcode.

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

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

action_configs = [
    action_config (
        action_name = ACTION_NAMES.cpp_link_executable,
        tools = [
            tool(
                with_features = [
                    with_feature(features=["generate-debug-symbols"]),
                ],
                path = "toolchain/mac/ld-with-dsym-packaging",
            ),
            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"],
   ),
]

Bạn có thể triển khai tính năng này theo cách hoàn toàn khác nhau cho Linux (sử dụng fission) hoặc cho Windows (tạo tệp .pdb). Ví dụ: quá trình triển khai việc tạo biểu tượng gỡ lỗi dựa trên fission có thể trông giống như sau:

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

action_configs = [
    action_config (
        name = ACTION_NAMES.cpp_compile,
        tools = [
            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"],
                    ),
                ],
            ),
      ],
    ),
]

Gắn cờ nhóm

CcToolchainConfigInfo cho phép bạn gói 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 phạm vi 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 . Ví dụ:

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

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 thao tác.

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

Đối với các cờ cần lặp lại với các giá trị khác nhau khi được thêm vào lệnh 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 mỗi 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ờ được mở rộng dưới dạng một đơn vị. Ví dụ:

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

sẽ 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>

Biến có thể tương ứng với các cấu trúc có thể truy cập bằ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ể lồng ghép vào nhau và cũng có thể chứa trình tự. Để tránh trường hợp xung đột tên và để trình bày 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 gắn cờ hỗ trợ mở rộng có điều kiện dựa trên sự hiện diện của một thuộc tính cụ thể biến hoặc trường của biến đó bằng cách sử dụng expand_if_available, expand_if_not_available, Thuộc tính 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 thông tin tham khảo về các biến bản dựng, tính năng và thông tin khác cần thiết để định cấu hình thành công các quy tắc C++.

Biến bản dựng CcToolchainConfigInfo

Sau đây là tài liệu tham khảo về các biến bản dựng CcToolchainConfigInfo.

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

Các tính năng phổ biến

Sau đây là tài liệu tham khảo về các tính năng và điều kiện kích hoạt của 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 Bật theo mặc định dựa trên chế độ liên kết.
per_object_debug_info Được bật nếu tính năng supports_fission được chỉ định và bật, đồng thời chế độ biên dịch hiện tại được chỉ định trong cờ --fission.
supports_start_end_lib Nếu được bật (và tuỳ chọn --start_end_lib được đặt), Bazel sẽ không liên kết với thư viện tĩnh mà thay vào đó 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 tạo thư viện tĩnh.
supports_interface_shared_libraries Nếu được bật (và tuỳ chọn --interface_shared_objects được đặt), Bazel sẽ liên kết các mục tiêu có linkstatic được đặt thành False (cc_test theo mặc định) với các thư viện dùng chung 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 ra những tệp được chia sẻ thư viện.
static_link_cpp_runtimes Nếu được bật, Bazel sẽ liên kết thời gian chạy C++ theo cách tĩnh ở chế độ liên kết tĩnh và theo cách động ở chế độ liên kết động. Cấu phần phần mềm được chỉ định trong cc_toolchain.static_runtime_lib hoặc thuộc tính cc_toolchain.dynamic_runtime_lib (tuỳ thuộc vào chế độ liên kết) sẽ được thêm vào hành động liên kết.
supports_pic Nếu được bật, chuỗi công cụ sẽ biết sử dụng các đối tượng PIC cho thư viện động. Biến "pic" sẽ xuất hiện bất cứ khi nào cần biên dịch PIC. Nếu không được bật theo mặc định và `--force_pic` đượ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 tính năng bị thiếu hoặc không thể sử dụng được bật, nên không thể sử dụng `--force_pic`.
static_linking_mode | dynamic_linking_mode Bật theo mặc định dựa trên chế độ liên kết.
no_legacy_features Không cho Bazel thêm các tính năng cũ vào cấu hình C++ nếu có. Xem danh sách đầy đủ dưới đây.

Logic vá tính năng cũ

Bazel áp dụng các thay đổi sau đây 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 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. Kế hoạch là loại bỏ các công cụ này sau khi hoàn tất Crosstool trong Starlark. Đối với những độc giả tò mò, hãy xem cách triển khai trong CppActionConfigs và đối với các chuỗi công cụ phát hành công khai, hãy cân nhắc thêm no_legacy_features để chuỗi công cụ trở nên độc lập hơn.