Tổng quan
Để gọi trình biên dịch với các tuỳ chọn phù hợp, Bazel cần biết một số kiến thức về nội bộ bên trong của trình biên dịch, chẳng hạn như việc 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 đơ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í).
- Đườ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 các mã 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 sử dụng cho việc biên dịch, liên kết, lưu trữ.
- Cờ nào được sử dụng cho các chế độ biên dịch được hỗ trợ (opt, dbg, Fastbuild).
- 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, thì 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 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 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ác cấu trúc mà bạn cần cho quy trình này trong @rules_cc//cc:cc_toolchain_config_lib.bzl
.
Khi một mục tiêu C++ chuyển sang giai đoạn phân tích, Bazel sẽ 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ó những thông tin sau:
- Trình biên dịch hoặc trình liên kết để 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 của chuỗi công cụ hoạt động như sau:
Người dùng chỉ định mục tiêu
cc_toolchain_suite
trong tệpBUILD
và trỏ Bazel đến mục tiêu bằng cách sử dụng tuỳ chọn--crosstool_top
.Mục tiêu
cc_toolchain_suite
tham chiếu đến nhiều chuỗi công cụ. Giá trị của cờ--cpu
và--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ínhcc_toolchain_suite.toolchains
bằng--cpu | --compiler
. Nếu không tìm thấy mục tương ứng, Bazel sẽ gửi 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ínhcc_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 giá trị
--cpu
dựa trên kết quả thu được. Hã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 feature
và action_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. 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ờ hiệu dòng lệnh, thao tác, quy tắc ràng buộc trên 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 là cho phép các 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 các thao tác biên dịch và dữ liệu đầu vào mới 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 thao tác cụ thể trong Bazel.
Một tính năng được chỉ định theo tên, cho phép 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 những cách sau:
- Trường
enabled
của đối tượng này được đặt thànhtrue
. - Bazel hoặc chủ sở hữu quy tắc cho phép việc này một cách rõ ràng.
- Người dùng bật chế độ này thông qua tuỳ chọn
--feature
Bazel hoặc thuộc tính quy tắcfeatures
.
Các tính năng có thể có các phần phụ thuộc lẫn nhau, tuỳ 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ệ với tính năng
Các phần phụ thuộc thường được quản lý trực tiếp bằng Bazel, công cụ này chỉ thực thi các yêu cầu và quản lý xung đột nội tạ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 các quy tắc ràng buộc chi tiết hơn được sử dụng trực tiếp trong quy tắc Starlark chi phối việc hỗ trợ và mở rộng 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ế độ xây dựng nhất định (opt , dbg hoặc fastbuild ). Nếu "requires" ("yêu cầu") chứa nhiều "feature_set" ("yêu cầu") 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 đó hoạt động theo quy tắc đệ quy). Ngoài ra, tính năng này còn có thể phân loại các tập hợp con chức năng phổ biến từ một tập hợp tính năng, chẳng hạn như các bộ phận phổ biến của 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 đều có thể chỉ định Đ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 lựa chọn thay thế nếu người dùng cùng lúc yêu cầu 2 hoặc nhiều tính năng loại trừ lẫn nhau. |
with_features = [ with_feature_set( features = ['feature-1'], not_features = ['feature-2'], ), ] |
Ở cấp độ bộ 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ả tính năng trong tập hợp features được chỉ định đều đượ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 hành động được chỉ định.
|
Thao tác
Hành động cho phé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 chạy hành động đó. action_config
chỉ định tệp nhị phân của công cụ mà một thao tác gọi, trong khi feature
chỉ định cấu hình (cờ) xác định cách hoạt động của công cụ khi thao tác được gọi.
Các tính năng tham chiếu các thao tác để cho biết những thao tác đó ảnh hưởng đến Bazel, 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 với các thao tác đó, chẳng hạn như c++-compile
. Cờ được gán cho từng hành động bằng cách liên kết chúng với một tính năng.
Mỗi tên thao tác đại diện cho một loại thao tác 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à kiểu thao tác Bazel, trong đó kiểu thao tác Bazel đề cập đến một lớp Java triển khai thao tác (chẳng hạn như CppCompileAction
). Cụ thể, "thao tác của trình kết hợp" và "thao tác của 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 với trình lắp ráp
Hành động | Mô tả |
preprocess-assemble
|
Tập hợp quy trình xử lý trước. Thường đối với .S tệp.
|
assemble
|
Lắp ráp mà không cần xử lý trước. Thường đối với .s tệp.
|
Các 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 quy tắc tạo sinh.
|
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 độc lập, vì nếu không sẽ gây ra lỗi biên dịch. Chỉ áp dụng cho các chuỗi công cụ hỗ trợ mô-đun. |
Thao tác với đường liên kết
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ả phần phụ thuộc của thư viện đó. |
c++-link-nodeps-dynamic-library
|
Liên kết thư viện được chia sẻ chỉ chứa cc_library nguồn.
|
c++-link-executable
|
Liên kết một thư viện hoạt động hoàn chỉnh. |
Hành động thực tế tăng cường
Hành động thực tế tăng cườ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 của 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 đang 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) cần gọi trong suốt thao tác và các nhóm cờ, được xác định theo các tính năng. Những cờ này áp dụng các quy tắc ràng buộc cho quá trình thực thi 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ô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. Bắt buộc 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 một tính năng. |
env_sets
|
Danh sách các điều kiện ràng buộc về môi trường áp dụng cho một nhóm hành động. 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 và action_config
khác theo quy định trong các mối quan hệ tính năng được mô tả ở trên. Hành vi này tương tự như hành vi của một tính nă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 của 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
với 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 phía sau action_config
– rằng các thuộc tính của một 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 nhóm công cụ thông qua tham số tools
.
Hàm khởi tạo tool()
có các tham số sau:
Trường | Mô tả |
path
|
Đường dẫn đến công cụ liên quan (tương ứng với vị trí hiện tại). |
with_features
|
Một danh sách 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 đó trên 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ó 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ệ với 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ể dùng các tính năng và thao tác cùng nhau để triển khai các 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 tệp 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ể dùng cho 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 trên 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 cùng một tính năng này theo cách hoàn toàn khác cho Linux (sử dụng fission
) hoặc cho Windows (tạo ra tệp .pdb
). Ví dụ: quy trình triển khai việc 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(
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 cờ
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 một 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_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.
Nhóm 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 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 kiểu 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á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ào nhau và cũng có thể chứa chuỗi. Để tránh xung đột 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 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 các quy tắc C++.
Biến thể bản dựng CcToolchainConfigInfo
Sau đây là tài liệu tham khảo về các biến thể bản 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 xoá. |
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 tạo 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ư đối với output_file .
|
output_preprocess_file
|
compile | Đầu ra được 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ư đối với 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 được 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 đề có chứa #include<foo.h> và #include "foo.h" .
|
quote_include_paths
|
compile | Trình tự của -iquote bao gồm - các thư mục mà trong đó trình biên dịch tìm kiếm các tiêu đề có trong #include "foo.h" .
|
system_include_paths
|
compile | Trình tự của -isystem bao gồm - các thư mục mà trong đó trình biên dịch tìm kiếm các tiêu đề có trong #include <foo.h> .
|
dependency_file
|
compile | Tệp 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 độ phù hợp gcov .
|
per_object_debug_info_file
|
compile | Tệp thông tin gỡ lỗi cho từng đối tượng (.dwp ).
|
stripotps
|
dải | Thứ 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_flag và optional_cxx_flag .
|
user_compile_flags
|
compile | Trình tự gắn cờ từ thuộc tính quy tắc copt hoặc cờ --copt , --cxxopt và --conlyopt .
|
unfiltered_compile_flags
|
compile | Trình tự gắn cờ từ trường CROSSTOOL cũ của unfiltered_cxx_flag hoặc tính năng unfiltered_compile_flags . Những dữ liệu 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 với 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 sử dụng trên Windows có MSVC. |
linker_param_file
|
đường liên kết | Vị trí của tệp thông 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 có nên tạo thư viện giao diện 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ụ trình 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ụ trình 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 .
|
linkstamp_paths
|
đường liên kết | Một biến thể 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 rằng mã PIC/PIE cần được tạo (tuỳ chọn Bazel `--force_pic` đã được truyề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 | Truth (Chính xác) 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 sự phân chia (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 phải 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 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ữ hồ sơ đo lường FDO có phân biệt ngữ cảnh. |
Các đối tượng nổi tiếng
Sau đây là tài liệu tham khảo các tính năng và điều kiện kích hoạt.
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
|
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 bạn 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ử 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 độ tạo bản dựng vì Bazel không phải xây dựng thư viện tĩnh.
|
supports_interface_shared_libraries
|
Nếu bạn bật (và đặt tuỳ chọn --interface_shared_objects ), thì Bazel sẽ liên kết các mục tiêu đã linkstatic được đặt thành False (cc_test s theo mặc định) dựa trên các thư viện chia sẻ trên giao diện. Điều này giúp quá trình liên kết lại dần 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 các thư viện dùng chung. |
static_link_cpp_runtimes
|
Nếu bạn bật tính năng này, 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à liên kết độ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 tuỳ chọn này, 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 tính năng này không được bật theo mặc định và truyền dữ liệu "--force_pic", thì Bazel sẽ yêu cầu phương thức "supports_pic" và xác thực rằng tính năng này đã được bật. Nếu tính năng này bị thiếu hoặc không thể bật, thì bạn sẽ 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
|
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ụ để đảm bảo 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 các tính năng. Mục tiêu của kế hoạch là loại bỏ những công cụ đó sau khi hoàn tất Crosstool trong Starlark. Nếu bạn muốn đọc 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 chính thức, hãy cân nhắc thêm no_legacy_features
để giúp chuỗi công cụ trở nên độc lập hơn.