Tổng quan
Để gọi trình biên dịch bằng các lựa chọn phù hợp, Bazel cần có một số kiến thức về nội bộ trình biên dịch, chẳng hạn như các cờ quan trọng và thư mục bao gồm. Nói cách khác, Bazel cần một mô hình đơn giản của trình biên dịch để hiểu cách hoạt động của trình biên dịch.
Bazel cần biết những thông tin sau:
- Trình biên dịch có hỗ trợ thinLTO, các mô-đun, liên kết động hoặc 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ả các tiêu đề có trong tệp nguồn đều được khai báo đúng cách trong tệp
BUILD
. - Sysroot mặc định.
- Cần sử dụng cờ nào để biên dịch, liên kết, lưu trữ.
- Những cờ cần 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, Bazel cần định cấu hình riêng các cấu trúc đó.
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 sẽ tự động định cấu hình CcToolchainConfigInfo
cho bản dựng của bạn, nhưng bạn có thể định cấu hình theo cách thủ công. Để làm việc đó, 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 bạn.
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 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 sẽ chọn mục tiêu cc_toolchain
thích 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
sẽ 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 khởi tạo theo 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ờ hiệu 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ác cấu phần phần mềm cần thiết trong hộp cát mà thao tác sẽ 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á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 các thư viện nhị phân và chuỗi công cụ 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 lựa chọn chuỗi công cụ hoạt động như sau:
Người dùng chỉ định một mục tiêu
cc_toolchain_suite
trong tệpBUILD
và chỉ Bazel đến mục tiêu đó bằng cách sử dụng lựa chọn--crosstool_top
.Mục tiêu
cc_toolchain_suite
tham chiếu đến nhiều chuỗi công cụ. Cá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 lựa chọn
--compiler
, Bazel sẽ chọn mục nhập 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 nhập tương ứng, Bazel sẽ báo lỗi.Nếu bạn không chỉ định lựa chọn
--compiler
, Bazel sẽ chọn mục nhập tương ứng trong thuộc tínhcc_toolchain_suite.toolchains
chỉ có--cpu
.Nếu bạn không chỉ định cờ nào, Bazel sẽ kiểm tra hệ thống máy chủ và chọn 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 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++ đầy đủ 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 duy nhấ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ác cờ dòng lệnh, hành động, các ràng buộc đối với môi trường thực thi hoặc các thay đổi về phần phụ thuộc. Một tính năng có thể đơn giản như 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à bao gồm các 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 một 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ác cờ áp dụng cho các thao tác cụ thể của 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 các tính năng mới.
Bạn có thể bật một tính năng theo một trong những cách sau:
- Trường
enabled
của tính năng được đặt thànhtrue
. - 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 chế độ này thông qua lựa chọn
--feature
Bazel hoặc thuộc tính quy tắcfeatures
.
Các tính năng có thể có sự 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 các đối tượng
Các phần phụ thuộc thường được quản lý trực tiếp bằng Bazel, chỉ đơn giản là thực thi các yêu cầu và quản lý các xung đột vốn có trong bản chất của các tính năng được xác định trong bản dựng. Quy cách chuỗi công cụ cho phép các ràng buộc chi tiết hơn để 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à:
Constraint | Nội dung mô tả |
requires = [ feature_set (features = [ 'feature-name-1', 'feature-name-2' ]), ] |
Cấp đối tượ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ợ ở 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 này sẽ được hỗ trợ nếu bất kỳ "feature_set" nào được đáp ứng (khi tất cả các tính năng được chỉ định đều được bật).
|
implies = ['feature'] |
Cấp đối tượ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ụ ý (tức là tính năng này hoạt động đệ quy). Ngoài ra, bạn cũng có thể tách các tập hợp con chức năng phổ biến ra khỏi một tập hợp các tính năng, chẳng hạn như các phần phổ biến của trình dọn dẹp. Bạn không thể tắt các tính năng ngầm định. |
provides = ['feature'] |
Cấp đối tượng. Cho biết rằng 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 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 yêu cầu 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.
Khi bạn chỉ định with_features , tập hợp cờ sẽ chỉ mở rộng sang lệnh tạo 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 được chỉ định đều được bật và tất cả cá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 , thì bộ cờ sẽ được áp dụng vô điều kiện cho mọi thao tác được chỉ định.
|
Thao tác
Các thao tác mang đến sự linh hoạt để sửa đổi các trường hợp mà một thao tác thực thi mà không giả định cách thao tác sẽ chạy. 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 công cụ đó hoạt động khi thao tác được gọi.
Tính năng tham chiếu các thao tác để báo hiệu những thao tác Bazel mà chúng ảnh hưởng vì các thao tác có thể sửa đổi biểu đồ thao tác Bazel. Trình cung cấp CcToolchainConfigInfo
chứa các thao tác có cờ và công cụ được liên kết với các thao tác đó, chẳng hạn như c++-compile
. Cờ được chỉ định cho từng thao tác bằng cách liên kết các thao tác đó 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 duy nhất mà 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-một giữa các hành động và các loại hành động Bazel, trong đó loại hành động Bazel đề cập đến một lớp Java triển khai một hành động (chẳng hạn như CppCompileAction
). Cụ thể, "hành động của trình hợp ngữ" và "hành động của trình biên dịch" trong bảng dưới đây là CppCompileAction
, trong khi các hành động liên kết là CppLinkAction
.
Thao tác của trình hợp ngữ
Hành động | Nội dung mô tả |
preprocess-assemble
|
Tập hợp với quá trình tiền xử lý. Thường là đối với các tệp .S .
|
assemble
|
Tập hợp mà không cần xử lý trước. Thường là đối với 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 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 một tệp tiêu đề để đảm bảo rằng tiêu đề là độc lập, nếu không, tiêu đề sẽ tạo 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. |
Thao tác với đường liên kết
Hành động | Nội dung mô tả |
c++-link-dynamic-library
|
Liên kết một thư viện dùng chung 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 dùng chung chỉ chứa các nguồn cc_library .
|
c++-link-executable
|
Liên kết một thư viện cuối cùng đã sẵn sàng để chạy. |
Thao tác thực tế tăng cường
Các thao tác AR tập hợp các tệp đối tượng vào các 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 một thư viện tĩnh (lưu trữ). |
Thao tác 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 chung. |
Sử dụng action_config
action_config
là một cấu trúc Starlark mô tả một thao tác Bazel bằng cách chỉ định công cụ (nhị phân) để gọi trong thao tác và các tập hợp cờ, do các tính năng xác định. Các cờ này áp dụng cá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 tham số sau:
Thuộc tính | Nội dung mô tả |
action_name
|
Thao tác Bazel mà thao tác này tương ứng. Bazel sử dụng thuộc tính này để khám phá các yêu cầu về công cụ và quá trình thực thi cho mỗi thao tác. |
tools
|
Tệp thực thi cần 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ó một bộ tính năng phù hợ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ác cờ áp dụng cho một nhóm hành động. Tương tự như đối với một đối tượ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. |
Một 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ư hành vi của một tính năng.
Hai thuộc tính cuối cùng là dư 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 các 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 duy nhất trên nhiều action_config
.
Bạn không thể xác định nhiều action_config
có cùng action_name
trong cùng một chuỗi công cụ. Điều này giúp tránh sự mơ hồ trong các đường dẫn công cụ và thực thi ý định đằng sau action_config
– đó là các thuộc tính của một thao tác được mô tả rõ ràng ở một nơi 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()
có 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
|
Một danh sách các bộ tính năng mà bạn phải đáp ứng ít nhất một bộ để áp dụng công cụ này. |
Đố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 cho thao tác 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ó bộ with_feature
được đặt 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ướ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ụ 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 các tính năng và thao tác cùng nhau để triển khai các thao tác Bazel với nhiều ngữ nghĩa trên nhiều nền tảng. Ví dụ: quá trình 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 kho lưu trữ dsym nén, rồi giải nén kho lưu trữ đó để tạo gói ứng dụng và các tệp .plist
mà Xcode có thể sử dụng.
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 (
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 tương tự này theo cách hoàn toàn khác cho Linux (dùng fission
) hoặc cho Windows (tạo ra các tệp .pdb
). Ví dụ: việc triển khai để tạo biểu tượng gỡ lỗi dựa trên fission
có thể có dạ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"],
),
],
),
],
),
]
Nhóm cờ
CcToolchainConfigInfo
cho phép bạn kết hợp các cờ thành những nhóm phục vụ một mục đích cụ thể. Bạn có thể chỉ định một cờ trong khi sử dụng các biến được xác định trước trong giá trị cờ. Trình biên dịch sẽ mở rộng cờ này khi thêm cờ vào lệnh tạ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 tạo 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 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, 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 nội dung của một 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 những 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ể được lồng vào nhau và cũng có thể chứa các 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
Các nhóm cờ hỗ trợ việc 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"],
),
],
),
],
)
Thông tin tham chiếu CcToolchainConfigInfo
Phần này cung cấp thông tin tham khảo về các biến, tính năng bản dự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à thông tin 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 cần 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 assembly đã phát. Chỉ áp dụng khi thao tác compile phát ra văn bản hợp ngữ, thường là khi dùng cờ --save_temps . Nội dung giống với output_file .
|
output_preprocess_file
|
biên dịch | Đầu ra đã xử lý trước. Chỉ áp dụng cho các thao tác biên dịch chỉ tiền xử lý các tệp nguồn, thường là khi sử dụng cờ --save_temps . Nội dung giống với output_file .
|
includes
|
biên dịch | Trình tự của các tệp mà trình biên dịch phải đưa vào vô điều kiện trong nguồn đã biên dịch. |
include_paths
|
biên dịch | Trình tự 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 cách sử dụng #include<foo.h> và #include "foo.h" .
|
quote_include_paths
|
biên dịch | Trình tự của -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 cách sử dụng #include "foo.h" .
|
system_include_paths
|
biên dịch | Trình tự của -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 cách sử dụ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 đầu ra dưới dạng mã độc lập với vị trí. |
gcov_gcno_file
|
biên dịch | Tệp gcov về mức độ phù hợp.
|
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ự các cờ từ các trường CROSSTOOL cũ, chẳng hạn như compiler_flag , optional_compiler_flag , cxx_flag và optional_cxx_flag .
|
user_compile_flags
|
biên dịch | Trình tự cờ từ thuộc tính quy tắc copt hoặc các cờ --copt , --cxxopt và --conlyopt .
|
unfiltered_compile_flags
|
biên dịch | Trình tự cờ từ trường unfiltered_cxx_flag cũ CROSSTOOL hoặc tính năng unfiltered_compile_flags . Các mục 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 thời gian chạy của trình liên kết (thường đượ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 dưới dạng đầ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 dùng trên Windows bằng MSVC. |
linker_param_file
|
liên kết | Vị trí của tệp tham số trình liên kết do bazel tạo để khắc phục 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ó được tạo hay không.
|
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 | Đầu vào cho công cụ tạo ifso thư viện giao diện.
|
interface_library_output_path
|
liên kết | Đường dẫn để 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ờ trình liên kết đến từ các trường CROSSTOOL cũ.
|
user_link_flags
|
liên kết | Cờ liên kết đến từ thuộc tính --linkopt hoặc linkopts .
|
linkstamp_paths
|
liên kết | Một biến bản dựng cung cấp các đường dẫn linkstamp. |
force_pic
|
liên kết | Sự hiện diện của biến này cho biết mã PIC/PIE sẽ được tạo (đã truyền lựa chọn Bazel "--force_pic"). |
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 biểu tượng gỡ lỗi cần được loại bỏ. |
is_cc_test
|
liên kết | Truthy khi hành động hiện tại là hành động liên kết cc_test , ngược lại là false.
|
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 fission (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 và trình biên dịch cũng như 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ữ hồ sơ đo lường FDO nhạy cảm theo bối cảnh. |
Các tính năng phổ biến
Sau đây là thông tin tham khảo về các tính năng và điều kiện kích hoạt của chúng.
Tính năng | Tài liệu |
opt | dbg | fastbuild
|
Được 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à bạn đặt lựa 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 lựa chọn của 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. Điều này giúp tăng tốc độ bản dựng vì Bazel không cần phải tạo các thư viện tĩnh.
|
supports_interface_shared_libraries
|
Nếu được bật (và bạn đặt tuỳ chọn --interface_shared_objects ), 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 của giao diện. Điều này giúp việc 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 rằng chuỗi công cụ có thể tạo ra các thư viện dùng chung. |
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 linh động ở chế độ liên kết linh độ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 được bật, chuỗi công cụ sẽ biết cách sử dụng các đối tượng PIC cho các thư viện động. Biến "pic" 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 thiếu tính năng này hoặc không bật được, bạn sẽ không thể 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++ khi có. Xem danh sách đầy đủ các tính năng bên dưới. |
shorten_virtual_includes
|
Nếu được bật, các tệp tiêu đề bao gồm ảo sẽ được liên kết trong bin/_virtual_includes/<hash of target path> thay vì bin/<target package path>/_virtual_includes/<target name> . Hữu ích trên Windows để tránh vấn đề về đường dẫn dài với MSVC.
|
Logic vá các tính năng cũ
Bazel áp dụng các thay đổi sau đối với 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 chưa có) vào đầu chuỗi công cụ - Thêm tính năng
pic
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
per_object_debug_info
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
preprocessor_defines
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
includes
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
include_paths
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
fdo_instrument
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
fdo_optimize
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
cs_fdo_instrument
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
cs_fdo_optimize
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
fdo_prefetch_hints
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
autofdo
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
build_interface_libraries
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
dynamic_library_linker_tool
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
shared_flag
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
linkstamps
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
output_execpath_flags
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
runtime_library_search_directories
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
library_search_directories
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
archiver_flags
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
libraries_to_link
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
force_pic_flags
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
user_link_flags
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
legacy_link_flags
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
static_libgcc
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
fission_support
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
strip_debug_symbols
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
coverage
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
llvm_coverage_map_format
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
gcc_coverage_map_format
(nếu chưa có) vào đầu chuỗi công cụ - Thêm tính năng
fully_static_link
(nếu chưa có) vào cuối chuỗi công cụ - Thêm tính năng
user_compile_flags
(nếu chưa có) vào cuối chuỗi công cụ - Thêm tính năng
sysroot
(nếu chưa có) vào cuối chuỗi công cụ - Thêm tính năng
unfiltered_compile_flags
(nếu chưa có) vào cuối chuỗi công cụ - Thêm tính năng
linker_param_file
(nếu chưa có) vào cuối chuỗi công cụ - Thêm tính năng
compiler_input_flags
(nếu chưa có) vào cuối chuỗi công cụ - Thêm tính năng
compiler_output_flags
(nếu chưa có) vào cuối chuỗi công cụ
Đây là một danh sách dài các tính năng. Kế hoạch là loại bỏ các tệp 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 chuỗi công cụ sản xuất, hãy cân nhắc thêm no_legacy_features
để làm cho chuỗi công cụ độc lập hơn.