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:
- Trình biên dịch có hỗ trợ mỏngLTO, mô-đun, liên kết động hoặc PIC hay không (mã độc lập về vị trí).
- Đường dẫn đến các công cụ bắt buộc, chẳng hạn 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 nên sử dụng để biên dịch, liên kết, lưu trữ.
- Cờ nào cần sử dụng cho các chế độ biên dịch được hỗ trợ (opt, dbg, nhanh).
- 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 quy tắc Starlark
cung cấp CcToolchainConfigInfo
và bạn cần chỉ định
thuộc tính toolchain_config
của cc_toolchain
vào 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 mọi cấu trúc cần thiết trong quá trình này
@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ụ: hành động 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 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ấ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ấ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:
Người dùng chỉ định một mục tiêu
cc_toolchain_suite
trong tệpBUILD
và điểm 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ụ. Chiến lược phát hành đĩa đơn giá trị của cờ--cpu
và--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ừcc_toolchain_suite.toolchains
bằng--cpu | --compiler
. Nếu Bazel không tìm thấy mục nhập tương ứng sẽ gửi lỗi.Nếu không chỉ định tuỳ chọn
--compiler
, Bazel sẽ chọn mục nhập tương ứng từcc_toolchain_suite.toolchains
chỉ với--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ụ, hãy chọn feature
và action_config
tương ứng
các đối tượng trong quy tắc Starlark chi phối cấu hình của bản dựng (tức là
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ờ hiệu dòng lệnh, hành động
các hạn chế về môi trường thực thi hoặc cá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
.
Tốt nhất là CcToolchainConfigInfo
chứa danh sách các tính năng, trong đó mỗi tính năng
tính năng này 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ể 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ànhtrue
. - 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 quy tắc này thông qua tuỳ chọn Bazel
--feature
hoặc quy tắcfeatures
.
Các tính năng có thể có phần phụ thuộc lẫn nhau, phụ thuộc vào cờ dòng lệnh, tệp BUILD
cài đặt 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 bạn chi tiết hơn các hạn chế để sử dụng trực tiếp bên trong quy tắc Starlark chi phối tính năng hỗ trợ và mở rộng. Đó là:
Hạn chế | 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 thuộc tính bắt buộc
các tính năng mới của Google. 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 sẽ ngầm bật tất cả các tính năng được ngụ ý trong đó (tức là hàm này hoạt động theo cách đệ 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. Ngụ ý Không thể tắt các tính nă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
các tính năng thay thế độc quyền. Ví dụ: tất cả các chất khử trùng 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 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 mang đến sự linh hoạt để điều chỉnh tình huống trong
một hành động thực thi mà không giả định hành động đó sẽ được thực hiện như thế nào. 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. Chiến lược phát hành đĩa đơn
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 từ khoá đó, 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 đối tượng địa lý.
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
|
Lắp ráp với quá trình 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ùng 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 cho quy tắc 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. |
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 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 sẵn sàng hoạt động hoàn thiện. |
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 một thư viện tĩnh (lưu trữ). |
Thao tác của 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
cờ, được xác định bởi các tính năng. Những cờ này áp dụng các quy tắc ràng buộc cho thao tác
thực thi.
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à quá trình 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 hành động đó 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 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 thao tác. 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 về 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 khác và
action_config
theo quy định của
mối quan hệ của tính năng được mô tả ở trên. 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 bị thừa so với các thuộc tính tương ứng trên
được bao gồm vì một số thao tác Bazel yêu cầu gắn cờ hoặc
các biến môi trường và mục tiêu là để tránh action_config
+feature
một cách không cần thiết
cặp. Thông thường, việc chia sẻ một tính năng trên nhiều action_config
ưu tiên.
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ả |
tool_path
|
Đường dẫn đến công cụ liên quan (tương đối so với vị trí hiện tại). |
with_features
|
Danh sách các nhóm tính năng mà trong đó có ít nhất một tính năng 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 thông qua thuộc tính tools
trên action_config
cho đến khi có một công cụ
có một tập hợp with_feature
khớp với cấu hình tính năng được tìm thấy
(xem 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ụ 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 (
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ũng có thể được triển khai hoàn toàn khác cho Linux, nền tảng sử dụng
fission
hoặc dành 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(
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ờ vào các nhóm phân phá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_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 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 bản dựng
, nhóm gắn 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}"],
)
sẽ 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ờ đượ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>
Các biến có thể tương ứng với 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ể 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 Ngoài ra, để 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 tài liệu tham khảo về biến bản dựng, tính năng và thông tin bắt buộc để định cấu hình thành công 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 | Kết quả biên dịch. |
output_assembly_file
|
biên dịch | Đã phát tệp tập hợp. Chỉ áp dụng khi
Hành động 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ư của
output_file .
|
output_preprocess_file
|
biên dịch | Đầu ra đượ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ự mà trình biên dịch
tìm kiếm tiêu đề được bao gồm bằ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 các 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 các 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ã 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 ).
|
stripotps
|
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_flag và
optional_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 và --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 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 | Đường dẫn thực thi 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ờ của trình liên kết đến từ --linkopt
hoặc thuộc tính linkopts .
|
symbol_counts_output
|
liên kết | Đường dẫn đến nơi ghi số lượng biểu tượng. |
linkstamp_paths
|
liên kết | Một biến bản dựng cung cấp đường dẫn linkstamp. |
force_pic
|
liên kết | Sự hiện diện của biến này cho thấy mã PIC/PIE sẽ được tạo (tuỳ chọn Bazel `--force_pic` đã được chuyển). |
strip_debug_symbols
|
liên kết | Sự hiện diện của biến này cho biết quá trình gỡ lỗi biểu tượng phải được 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. 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. |
csfdo_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 nổi tiếng
Sau đây là tài liệu tham khảo về các tính năng và cách 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
|
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à
và 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 tuỳ chọn --start_end_lib ), thì Bazel
sẽ không liên kết dựa trên thư viện tĩnh mà thay vào đó sẽ sử dụng
--start-lib/--end-lib tuỳ chọn trình liên kết để liên kết với các đối tượng
trực tiếp. 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 là
đã đặt), Bazel sẽ liên kết các mục tiêu đã đặt linkstatic thành
Sai (cc_test theo mặc định) đối với giao diện được chia sẻ
thư viện. Cách này giúp việc liên kết lại gia tăng 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 tĩnh môi trường thời gian chạy C++ theo phương thức liên kết tĩnh
và tự độ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 các 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 chưa đượ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á các tính năng cũ
Bazel áp dụng các thay đổi sau cho các tính năng của chuỗi công cụ để quay lại khả năng tương thích:
- 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. Kế hoạch là loại bỏ chúng một lần
Crosstool trong Starlark là
xong. Đối với độc giả tò mò, hãy xem cách triển khai trong
CppActionConfigs,
Còn đối với chuỗi công cụ sản xuất, hãy cân nhắc việc thêm no_legacy_features
để tạo
chuỗi công cụ độc lập hơn.