Quy tắc C / C++

Báo cáo vấn đề Xem nguồn

Quy tắc

cc_binary

Xem nguồn quy tắc
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

Các mục tiêu đầu ra ngầm ẩn

  • name.stripped (chỉ được tạo nếu được yêu cầu rõ ràng): Phiên bản đã loại bỏ của tệp nhị phân. strip -g được chạy trên tệp nhị phân để xoá các biểu tượng gỡ lỗi. Bạn có thể cung cấp thêm các tuỳ chọn dải trên dòng lệnh bằng cách sử dụng --stripopt=-foo. Kết quả này chỉ được tạo khi có yêu cầu rõ ràng.
  • name.dwp (chỉ tạo nếu được yêu cầu rõ ràng): Nếu bật Fission: một tệp gói thông tin gỡ lỗi phù hợp để gỡ lỗi các tệp nhị phân được triển khai từ xa. Trường hợp còn lại: một tệp trống.

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện khác được liên kết đến mục tiêu nhị phân.

Đây có thể là mục tiêu cc_library hoặc objc_library.

srcs

Danh sách nhãn; mặc định là []

Danh sách tệp C và C++ được xử lý để tạo mục tiêu. Đây là các tệp tiêu đề và tệp nguồn C/C++, không được tạo (mã nguồn thông thường) hoặc được tạo.

Tất cả tệp .cc, .c.cpp sẽ được biên dịch. Đây có thể là các tệp được tạo: nếu một tệp được đặt tên nằm trong outs của một số quy tắc khác, thì quy tắc này sẽ tự động phụ thuộc vào quy tắc khác đó.

Tệp .h sẽ không được biên dịch nhưng sẽ có thể đưa vào các nguồn trong quy tắc này. Cả tệp .cc.h đều có thể trực tiếp chứa tiêu đề được liệt kê trong srcs này hoặc trong hdrs của bất kỳ quy tắc nào được liệt kê trong đối số deps.

Tất cả tệp #include phải được đề cập trong thuộc tính srcs của quy tắc này hoặc trong thuộc tính hdrs của các cc_library() được tham chiếu. Kiểu nên dùng dành cho các tiêu đề liên kết với thư viện sẽ được liệt kê trong thuộc tính hdrs của thư viện đó và mọi tiêu đề còn lại liên kết với các nguồn của quy tắc này sẽ được liệt kê trong srcs. Hãy xem bài viết "Kiểm tra việc bao gồm tiêu đề" để biết nội dung mô tả chi tiết hơn.

Nếu tên của một quy tắc nằm trong srcs, thì quy tắc này sẽ tự động phụ thuộc vào quy tắc đó. Nếu outs của quy tắc được đặt tên là tệp nguồn C hoặc C++, thì các tệp đó sẽ được biên dịch thành quy tắc này; nếu là tệp thư viện, thì các tệp đó sẽ được liên kết.

Loại tệp srcs được phép:

  • Tệp nguồn C và C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Tệp tiêu đề C và C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Tập hợp với bộ tiền xử lý C: .S
  • Lưu trữ: .a, .pic.a
  • Thư viện "Luôn liên kết": .lo, .pic.lo
  • Thư viện chia sẻ, đã tạo phiên bản hoặc chưa tạo phiên bản: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

...và bất kỳ quy tắc nào tạo ra các tệp đó. Các tiện ích khác nhau biểu thị các ngôn ngữ lập trình khác nhau theo quy ước gcc.

additional_linker_inputs

Danh sách nhãn; mặc định là []

Truyền các tệp này vào lệnh trình liên kết C++.

Ví dụ: bạn có thể cung cấp các tệp Windows .res đã biên dịch tại đây để nhúng vào mục tiêu nhị phân.

copts

Danh sách chuỗi; mặc định là []

Thêm các tuỳ chọn này vào lệnh biên dịch C++. Áp dụng tuỳ chọn thay thế "Tạo biến"tạo mã thông báo shell Bourne.

Mỗi chuỗi trong thuộc tính này được thêm theo thứ tự nhất định vào COPTS trước khi biên dịch mục tiêu nhị phân. Cờ chỉ có hiệu lực khi biên dịch mục tiêu này chứ không phải các phần phụ thuộc của mục tiêu. Vì vậy, hãy cẩn thận với các tệp tiêu đề được đưa vào những nơi khác. Tất cả đường dẫn đều phải liên quan đến không gian làm việc chứ không phải gói hiện tại.

Nếu gói khai báo tính năng no_copts_tokenization, thì việc mã hoá mã thông báo shell Bourne sẽ chỉ áp dụng cho các chuỗi chứa một biến "Make" duy nhất.

defines

Danh sách chuỗi; mặc định là []

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Tuân theo việc thay thế biến"Make"mã hoá mã thông báo shell Bourne. Mỗi chuỗi (phải bao gồm một mã thông báo shell Bourne duy nhất,) sẽ được thêm vào trước -D và thêm vào dòng lệnh biên dịch cho mục tiêu này, cũng như vào mọi quy tắc phụ thuộc vào chuỗi đó. Hãy thật cẩn thận vì việc này có thể gây ảnh hưởng sâu sắc. Khi nghi ngờ, hãy thêm các giá trị định nghĩa vào local_defines.
includes

Danh sách chuỗi; mặc định là []

Danh sách các thư mục bao gồm sẽ được thêm vào dòng biên dịch.

Đối với sự thay thế "Tạo biến". Mỗi chuỗi được thêm vào trước -isystem và thêm vào COPTS. Không giống như COPTS, những cờ này được thêm cho quy tắc này và mọi quy tắc phụ thuộc vào quy tắc đó. (Lưu ý: không phải quy tắc mà nó phụ thuộc vào!) Hãy thật cẩn thận vì việc này có thể gây ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm cờ "-I" vào COPTS.

Bạn phải thêm tiêu đề vào src hoặc hdr, nếu không, các quy tắc phụ thuộc sẽ không sử dụng được các quy tắc phụ thuộc khi quá trình biên dịch ở dạng hộp cát (mặc định).

Nhãn; mặc định là "@bazel_tools//tools/cpp:link_extra_lib"

Kiểm soát việc liên kết thư viện bổ sung.

Theo mặc định, các tệp nhị phân C++ được liên kết với //tools/cpp:link_extra_lib mà theo mặc định, tệp nhị phân này phụ thuộc vào cờ nhãn //tools/cpp:link_extra_libs. Nếu bạn không đặt cờ này, theo mặc định, thư viện này sẽ trống. Việc đặt cờ nhãn cho phép liên kết các phần phụ thuộc không bắt buộc, chẳng hạn như cơ chế ghi đè cho các ký hiệu yếu, trình chặn đối với các hàm thư viện dùng chung hoặc thư viện thời gian chạy đặc biệt (để thay thế Malloc, hãy ưu tiên malloc hoặc --custom_malloc). Việc đặt thuộc tính này thành None sẽ tắt hành vi này.

linkopts

Danh sách chuỗi; mặc định là []

Thêm các cờ này vào lệnh trình liên kết C++. Tuân theo việc thay thế biến"Make", mã hoá mã thông báo shell Bournemở rộng nhãn. Mỗi chuỗi trong thuộc tính này được thêm vào LINKOPTS trước khi liên kết mục tiêu nhị phân.

Mỗi phần tử của danh sách này không bắt đầu bằng $ hoặc - được coi là nhãn của một mục tiêu trong deps. Danh sách các tệp do mục tiêu đó tạo ra sẽ được thêm vào các tuỳ chọn trình liên kết. Hệ thống sẽ báo cáo lỗi nếu nhãn không hợp lệ hoặc không được khai báo trong deps.

linkshared

Boolean; không thể định cấu hình; giá trị mặc định là False

Tạo thư viện chia sẻ. Để bật thuộc tính này, hãy thêm linkshared=True vào quy tắc của bạn. Tuỳ chọn này tắt theo mặc định.

Sự hiện diện của cờ này có nghĩa là việc liên kết sẽ diễn ra với cờ -shared đến gcc và thư viện dùng chung thu được phù hợp để tải vào một chương trình Java chẳng hạn. Tuy nhiên, vì mục đích xây dựng, tệp này sẽ không bao giờ được liên kết với tệp nhị phân phụ thuộc, vì giả định rằng các thư viện dùng chung được tạo bằng quy tắc cc_binary chỉ được các chương trình khác tải theo cách thủ công. Vì vậy, bạn không nên coi thư viện này thay thế cho quy tắc cc_library. Để tăng khả năng có thể mở rộng, bạn nên tránh sử dụng hoàn toàn phương pháp này và chỉ để java_library phụ thuộc vào các quy tắc cc_library.

Nếu chỉ định cả linkopts=['-static']linkshared=True, bạn sẽ nhận được một đơn vị hoàn toàn độc lập. Nếu chỉ định cả linkstatic=Truelinkshared=True, bạn sẽ nhận được một đơn vị duy nhất, hầu hết độc lập.

linkstatic

Boolean; giá trị mặc định là True

Đối với cc_binarycc_test: liên kết tệp nhị phân ở chế độ tĩnh. Đối với cc_library.linkstatic: xem bên dưới.

Theo mặc định, tuỳ chọn này được bật cho cc_binary và tắt cho các ứng dụng còn lại.

Nếu được bật và đây là tệp nhị phân hoặc kiểm thử, tuỳ chọn này sẽ yêu cầu công cụ bản dựng liên kết trong .a thay vì trong .so cho thư viện người dùng bất cứ khi nào có thể. Một số thư viện hệ thống vẫn có thể được liên kết động, tương tự như các thư viện không có thư viện tĩnh. Vì vậy, tệp thực thi thu được vẫn sẽ được liên kết động, do đó chỉ hầu hết là tệp tĩnh.

Có thực sự ba cách khác nhau để liên kết một tệp thực thi:

  • StatIC với tính năng full_static_link, trong đó mọi mục được liên kết theo phương thức tĩnh; ví dụ: "gcc -static foo.o libbar.a libbaz.a -lm".
    Chế độ này được bật bằng cách chỉ định fully_static_link trong thuộc tính features.
  • StatIC, trong đó tất cả thư viện người dùng được liên kết theo phương thức tĩnh (nếu có phiên bản tĩnh), nhưng trong trường hợp các thư viện hệ thống (ngoại trừ thư viện thời gian chạy C/C++) được liên kết động, ví dụ: "gcc foo.o libfoo.a libbaz.a -lm".
    Bạn có thể bật chế độ này bằng cách chỉ định linkstatic=True.
  • ĐỘNG, trong đó tất cả thư viện được liên kết động (nếu có phiên bản động), ví dụ: "gcc foo.o libfoo.so libbaz.so -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=False.

Thuộc tính linkstatic sẽ có ý nghĩa khác nếu được sử dụng trên quy tắc cc_library(). Đối với thư viện C++, linkstatic=True cho biết chỉ cho phép liên kết tĩnh, vì vậy sẽ không có .so nào được tạo. linkstatic=False không ngăn việc tạo thư viện tĩnh. Thuộc tính này dùng để kiểm soát việc tạo thư viện động.

Nếu là linkstatic=False, thì công cụ xây dựng sẽ tạo các đường liên kết tượng trưng đến các thư viện dùng chung phụ thuộc trong vùng *.runfiles.

local_defines

Danh sách chuỗi; mặc định là []

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Tuân theo việc thay thế biến"Make"mã hoá mã thông báo shell Bourne. Mỗi chuỗi (phải bao gồm một mã thông báo shell Bourne duy nhất,) sẽ được thêm vào trước -D và thêm vào dòng lệnh biên dịch cho mục tiêu này, nhưng không được thêm vào các phần phụ thuộc.
malloc

Nhãn; mặc định là "@bazel_tools//tools/cpp:malloc"

Ghi đè phần phụ thuộc mặc định trên malloc.

Theo mặc định, các tệp nhị phân C++ được liên kết với //tools/cpp:malloc (đây là một thư viện trống nên tệp nhị phân sẽ kết thúc bằng libc malloc). Nhãn này phải tham chiếu đến một cc_library. Nếu quá trình biên dịch không dành cho quy tắc không phải C++, thì tuỳ chọn này sẽ không có hiệu lực. Giá trị của thuộc tính này sẽ bị bỏ qua nếu bạn chỉ định linkshared=True.

nocopts

Chuỗi; giá trị mặc định là ""

Xoá các tuỳ chọn trùng khớp khỏi lệnh biên dịch C++. Phải tuân theo thay thế biến"Make". Giá trị của thuộc tính này được hiểu là biểu thức chính quy. Mọi COPTS có sẵn khớp với biểu thức chính quy này (bao gồm cả các giá trị được chỉ định rõ ràng trong thuộc tính copts của quy tắc) sẽ bị xoá khỏi COPTS nhằm mục đích biên dịch quy tắc này. Thuộc tính này hiếm khi cần thiết.
stamp

Số nguyên; giá trị mặc định là -1

Liệu có mã hoá thông tin bản dựng thành tệp nhị phân hay không. Có thể dùng các giá trị sau:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong các bản dựng --nostamp. Bạn nên tránh chế độ cài đặt này, vì chế độ này có thể tắt chức năng lưu vào bộ nhớ đệm từ xa đối với tệp nhị phân và mọi thao tác hạ nguồn phụ thuộc vào tệp nhị phân đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị hằng số. Điều này giúp lưu kết quả bản dựng tốt vào bộ nhớ đệm.
  • stamp = -1: Bạn có thể kiểm soát việc nhúng thông tin bản dựng bằng cờ --[no]stamp.

Tệp nhị phân đã đóng dấu không được tạo lại trừ phi các phần phụ thuộc của chúng thay đổi.

win_def_file

Nhãn; mặc định là None

Tệp Windows DEF cần được truyền đến trình liên kết.

Bạn chỉ nên sử dụng thuộc tính này khi Windows là nền tảng mục tiêu. Bạn có thể dùng công cụ này để xuất biểu tượng trong khi liên kết thư viện chia sẻ.

cc_import

Xem nguồn quy tắc
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)

Các quy tắc cc_import cho phép người dùng nhập các thư viện C/C++ được biên dịch trước.

Sau đây là các trường hợp sử dụng điển hình:
1. Liên kết thư viện tĩnh

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = 1,
)
2. Liên kết thư viện chia sẻ (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Liên kết thư viện dùng chung với thư viện giao diện (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. Liên kết thư viện dùng chung với system_provided=True (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = 1,
)
5. Liên kết đến thư viện tĩnh hoặc thư viện chia sẻ
Trên Unix:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

# first will link to libmylib.a
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
Trên Windows:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)

# first will link to libmylib.lib
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to mylib.dll through mylib.lib
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
cc_import hỗ trợ thuộc tính "include". Ví dụ:
  cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = [ "vendor/curl/include" ],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện khác mà mục tiêu phụ thuộc. Xem nhận xét chung về deps tại phần Các thuộc tính điển hình được xác định theo hầu hết các quy tắc xây dựng.
hdrs

Danh sách nhãn; mặc định là []

Danh sách các tệp tiêu đề do thư viện biên dịch trước này phát hành để các nguồn có thể trực tiếp đưa vào trong các quy tắc phụ thuộc.

Boolean; giá trị mặc định là False

Nếu là 1, bất kỳ tệp nhị phân nào phụ thuộc (trực tiếp hoặc gián tiếp) vào thư viện được biên dịch trước C++ này đều sẽ liên kết trong tất cả các tệp đối tượng được lưu trữ trong thư viện tĩnh, ngay cả khi một số tệp không chứa ký hiệu nào được tệp nhị phân tham chiếu đến. Điều này sẽ hữu ích nếu mã không được gọi rõ ràng bằng mã trong tệp nhị phân, chẳng hạn như khi mã của bạn đăng ký nhận một số lệnh gọi lại do dịch vụ nào đó cung cấp.

Nếu Alwayslink không hoạt động với VS 2017 trên Windows, thì nguyên nhân là do vấn đề đã biết, vui lòng nâng cấp VS 2017 lên phiên bản mới nhất.

interface_library

Nhãn; mặc định là None

Một thư viện giao diện duy nhất để liên kết thư viện chia sẻ.

Các loại tệp được phép: .ifso, .tbd, .lib, .so hoặc .dylib

shared_library

Nhãn; mặc định là None

Một thư viện chia sẻ được biên dịch trước. Bazel đảm bảo tệp này có sẵn cho tệp nhị phân phụ thuộc vào tệp này trong thời gian chạy.

Các loại tệp được phép: .so, .dll hoặc .dylib

static_library

Nhãn; mặc định là None

Một thư viện tĩnh được biên dịch trước.

Các loại tệp được phép: .a, .pic.a hoặc .lib

system_provided

Boolean; giá trị mặc định là False

Nếu giá trị là 1, thì tức là hệ thống cung cấp thư viện dùng chung cần thiết trong thời gian chạy. Trong trường hợp này, bạn phải chỉ định interface_library và để trống shared_library.

cc_library

Xem nguồn quy tắc
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

Kiểm tra việc đưa vào tiêu đề

Bạn phải khai báo mọi tệp tiêu đề dùng trong bản dựng trong hdrs hoặc srcs của các quy tắc cc_*. Yêu cầu này được thực thi.

Đối với các quy tắc cc_library, tiêu đề trong hdrs bao gồm giao diện công khai của thư viện và có thể được đưa trực tiếp vào cả từ các tệp trong hdrssrcs của chính thư viện, cũng như từ các tệp trong hdrssrcs của các quy tắc cc_* liệt kê thư viện trong deps của chúng. Bạn chỉ được đưa trực tiếp tiêu đề trong srcs vào các tệp trong hdrssrcs của chính thư viện đó. Khi quyết định đặt tiêu đề vào hdrs hay srcs, bạn nên hỏi xem bạn có muốn người tiêu dùng của thư viện này có thể trực tiếp đưa tiêu đề vào không. Đây gần như là quyết định giống như giữa chế độ hiển thị publicprivate trong các ngôn ngữ lập trình.

Các quy tắc cc_binarycc_test không có giao diện được xuất, vì vậy, chúng cũng không có thuộc tính hdrs. Tất cả tiêu đề thuộc tệp nhị phân hoặc kiểm thử trực tiếp phải được liệt kê trong srcs.

Để minh hoạ các quy tắc này, hãy xem ví dụ sau.

cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)

cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)

cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)

Những nội dung được phép đưa vào trực tiếp trong ví dụ này được liệt kê trong bảng dưới đây. Ví dụ: foo.cc được phép trực tiếp đưa foo.hbar.h vào, nhưng không được phép đưa baz.h vào.

Đang bao gồm tệpCác trang được phép đưa vào
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

Các quy tắc kiểm tra việc đưa vào chỉ áp dụng cho việc đưa vào trực tiếp. Trong ví dụ ở trên, foo.cc được phép bao gồm bar.h (có thể bao gồm baz.h) và sau đó cũng được phép đưa baz-impl.h vào. Về mặt kỹ thuật, quá trình biên dịch tệp .cc có thể bắc cầu mọi tệp tiêu đề trong hdrs hoặc srcs trong bất kỳ cc_library nào trong đóng deps bắc cầu. Trong trường hợp này, trình biên dịch có thể đọc baz.hbaz-impl.h khi biên dịch foo.cc, nhưng foo.cc không được chứa #include "baz.h". Để được phép làm điều đó, bạn phải thêm baz vào deps của foo.

Bazel phụ thuộc vào tính năng hỗ trợ chuỗi công cụ để thực thi các quy tắc kiểm tra việc đưa vào. Tính năng layering_check phải được chuỗi công cụ hỗ trợ và được yêu cầu rõ ràng, ví dụ: thông qua cờ dòng lệnh --features=layering_check hoặc tham số features của hàm package. Các chuỗi công cụ do Bazel cung cấp chỉ hỗ trợ tính năng này bằng clang trên Unix và macOS.

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện khác được liên kết đến mục tiêu nhị phân.

Đây có thể là mục tiêu cc_library hoặc objc_library.

srcs

Danh sách nhãn; mặc định là []

Danh sách tệp C và C++ được xử lý để tạo mục tiêu. Đây là các tệp tiêu đề và tệp nguồn C/C++, không được tạo (mã nguồn thông thường) hoặc được tạo.

Tất cả tệp .cc, .c.cpp sẽ được biên dịch. Đây có thể là các tệp được tạo: nếu một tệp được đặt tên nằm trong outs của một số quy tắc khác, thì quy tắc này sẽ tự động phụ thuộc vào quy tắc khác đó.

Tệp .h sẽ không được biên dịch nhưng sẽ có thể đưa vào các nguồn trong quy tắc này. Cả tệp .cc.h đều có thể trực tiếp chứa tiêu đề được liệt kê trong srcs này hoặc trong hdrs của bất kỳ quy tắc nào được liệt kê trong đối số deps.

Tất cả tệp #include phải được đề cập trong thuộc tính srcs của quy tắc này hoặc trong thuộc tính hdrs của các cc_library() được tham chiếu. Kiểu nên dùng dành cho các tiêu đề liên kết với thư viện sẽ được liệt kê trong thuộc tính hdrs của thư viện đó và mọi tiêu đề còn lại liên kết với các nguồn của quy tắc này sẽ được liệt kê trong srcs. Hãy xem bài viết "Kiểm tra việc bao gồm tiêu đề" để biết nội dung mô tả chi tiết hơn.

Nếu tên của một quy tắc nằm trong srcs, thì quy tắc này sẽ tự động phụ thuộc vào quy tắc đó. Nếu outs của quy tắc được đặt tên là tệp nguồn C hoặc C++, thì các tệp đó sẽ được biên dịch thành quy tắc này; nếu là tệp thư viện, thì các tệp đó sẽ được liên kết.

Loại tệp srcs được phép:

  • Tệp nguồn C và C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Tệp tiêu đề C và C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Tập hợp với bộ tiền xử lý C: .S
  • Lưu trữ: .a, .pic.a
  • Thư viện "Luôn liên kết": .lo, .pic.lo
  • Thư viện chia sẻ, đã tạo phiên bản hoặc chưa tạo phiên bản: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

...và bất kỳ quy tắc nào tạo ra các tệp đó. Các tiện ích khác nhau biểu thị các ngôn ngữ lập trình khác nhau theo quy ước gcc.

hdrs

Danh sách nhãn; mặc định là []

Danh sách các tệp tiêu đề do thư viện này xuất bản để các nguồn có thể trực tiếp đưa vào trong các quy tắc phụ thuộc.

Đây là vị trí được ưu tiên dùng để khai báo tệp tiêu đề mô tả giao diện cho thư viện. Những tiêu đề này sẽ được cung cấp để đưa vào các nguồn trong quy tắc này hoặc trong các quy tắc phụ thuộc. Các tiêu đề không dành cho ứng dụng của thư viện này phải được liệt kê trong thuộc tính srcs, ngay cả khi các tiêu đề đó có trong một tiêu đề đã xuất bản. Hãy xem bài viết "Kiểm tra việc bao gồm tiêu đề" để biết nội dung mô tả chi tiết hơn.

additional_compiler_inputs

Danh sách nhãn; mặc định là []

Ví dụ: mọi tệp bổ sung mà bạn có thể muốn chuyển đến dòng lệnh của trình biên dịch, chẳng hạn như danh sách bỏ qua của trình dọn dẹp. Sau đó, bạn có thể dùng các tệp được chỉ định ở đây trong thông tin đăng nhập bằng hàm $(location).
additional_linker_inputs

Danh sách nhãn; mặc định là []

Truyền các tệp này vào lệnh trình liên kết C++.

Ví dụ: bạn có thể cung cấp các tệp Windows .res đã biên dịch tại đây để nhúng vào mục tiêu nhị phân.

Boolean; giá trị mặc định là False

Nếu là 1, bất kỳ tệp nhị phân nào phụ thuộc (trực tiếp hoặc gián tiếp) vào thư viện C++ này đều sẽ liên kết trong tất cả các tệp đối tượng của các tệp được liệt kê trong srcs, ngay cả khi một số tệp không chứa ký hiệu nào được tệp nhị phân tham chiếu đến. Điều này sẽ hữu ích nếu mã không được gọi rõ ràng bằng mã trong tệp nhị phân, chẳng hạn như khi mã của bạn đăng ký nhận một số lệnh gọi lại do dịch vụ nào đó cung cấp.

Nếu Alwayslink không hoạt động với VS 2017 trên Windows, thì nguyên nhân là do vấn đề đã biết, vui lòng nâng cấp VS 2017 lên phiên bản mới nhất.

copts

Danh sách chuỗi; mặc định là []

Thêm các tuỳ chọn này vào lệnh biên dịch C++. Áp dụng tuỳ chọn thay thế "Tạo biến"tạo mã thông báo shell Bourne.

Mỗi chuỗi trong thuộc tính này được thêm theo thứ tự nhất định vào COPTS trước khi biên dịch mục tiêu nhị phân. Cờ chỉ có hiệu lực khi biên dịch mục tiêu này chứ không phải các phần phụ thuộc của mục tiêu. Vì vậy, hãy cẩn thận với các tệp tiêu đề được đưa vào những nơi khác. Tất cả đường dẫn đều phải liên quan đến không gian làm việc chứ không phải gói hiện tại.

Nếu gói khai báo tính năng no_copts_tokenization, thì việc mã hoá mã thông báo shell Bourne sẽ chỉ áp dụng cho các chuỗi chứa một biến "Make" duy nhất.

defines

Danh sách chuỗi; mặc định là []

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Tuân theo việc thay thế biến"Make"mã hoá mã thông báo shell Bourne. Mỗi chuỗi (phải bao gồm một mã thông báo shell Bourne duy nhất,) sẽ được thêm vào trước -D và thêm vào dòng lệnh biên dịch cho mục tiêu này, cũng như vào mọi quy tắc phụ thuộc vào chuỗi đó. Hãy thật cẩn thận vì việc này có thể gây ảnh hưởng sâu sắc. Khi nghi ngờ, hãy thêm các giá trị định nghĩa vào local_defines.
implementation_deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện khác mà thư viện nhắm đến phụ thuộc vào. Không giống như deps, tiêu đề và đường dẫn của những thư viện này (và tất cả các phần phụ thuộc bắc cầu của thư viện đó) chỉ được dùng để biên dịch thư viện này chứ không phải các thư viện phụ thuộc vào thư viện đó. Các thư viện được chỉ định bằng implementation_deps vẫn được liên kết trong các mục tiêu nhị phân phụ thuộc vào thư viện này.

Hiện tại, việc sử dụng chỉ giới hạn ở cc_ libraries và được bảo vệ bằng cờ --experimental_cc_implementation_deps.

include_prefix

Chuỗi; giá trị mặc định là ""

Tiền tố để thêm vào đường dẫn của các tiêu đề của quy tắc này.

Khi đặt giá trị này, các tiêu đề trong thuộc tính hdrs của quy tắc này có thể truy cập được tại giá trị của thuộc tính này được thêm vào trước đường dẫn tương đối của kho lưu trữ.

Tiền tố trong thuộc tính strip_include_prefix sẽ bị xoá trước khi thêm tiền tố này.

includes

Danh sách chuỗi; mặc định là []

Danh sách các thư mục bao gồm sẽ được thêm vào dòng biên dịch.

Đối với sự thay thế "Tạo biến". Mỗi chuỗi được thêm vào trước -isystem và thêm vào COPTS. Không giống như COPTS, những cờ này được thêm cho quy tắc này và mọi quy tắc phụ thuộc vào quy tắc đó. (Lưu ý: không phải quy tắc mà nó phụ thuộc vào!) Hãy thật cẩn thận vì việc này có thể gây ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm cờ "-I" vào COPTS.

Bạn phải thêm tiêu đề vào src hoặc hdr, nếu không, các quy tắc phụ thuộc sẽ không sử dụng được các quy tắc phụ thuộc khi quá trình biên dịch ở dạng hộp cát (mặc định).

linkopts

Danh sách chuỗi; mặc định là []

Thêm các cờ này vào lệnh trình liên kết C++. Tuân theo việc thay thế biến"Make", mã hoá mã thông báo shell Bournemở rộng nhãn. Mỗi chuỗi trong thuộc tính này được thêm vào LINKOPTS trước khi liên kết mục tiêu nhị phân.

Mỗi phần tử của danh sách này không bắt đầu bằng $ hoặc - được coi là nhãn của một mục tiêu trong deps. Danh sách các tệp do mục tiêu đó tạo ra sẽ được thêm vào các tuỳ chọn trình liên kết. Hệ thống sẽ báo cáo lỗi nếu nhãn không hợp lệ hoặc không được khai báo trong deps.

linkstamp

Nhãn; mặc định là None

Đồng thời biên dịch và liên kết tệp nguồn C++ được chỉ định vào tệp nhị phân cuối cùng. Thủ thuật này là bắt buộc để đưa thông tin về dấu thời gian vào tệp nhị phân. Nếu chúng ta biên dịch tệp nguồn thành một tệp đối tượng theo cách thông thường thì dấu thời gian sẽ không chính xác. Quá trình biên dịch linkstamp có thể không bao gồm bất kỳ bộ cờ trình biên dịch cụ thể nào và vì vậy, không nên phụ thuộc vào bất kỳ tiêu đề, tuỳ chọn trình biên dịch hoặc biến bản dựng nào khác. Bạn chỉ nên sử dụng tuỳ chọn này trong gói base.
linkstatic

Boolean; giá trị mặc định là False

Đối với cc_binarycc_test: liên kết tệp nhị phân ở chế độ tĩnh. Đối với cc_library.linkstatic: xem bên dưới.

Theo mặc định, tuỳ chọn này được bật cho cc_binary và tắt cho các ứng dụng còn lại.

Nếu được bật và đây là tệp nhị phân hoặc kiểm thử, tuỳ chọn này sẽ yêu cầu công cụ bản dựng liên kết trong .a thay vì trong .so cho thư viện người dùng bất cứ khi nào có thể. Một số thư viện hệ thống vẫn có thể được liên kết động, tương tự như các thư viện không có thư viện tĩnh. Vì vậy, tệp thực thi thu được vẫn sẽ được liên kết động, do đó chỉ hầu hết là tệp tĩnh.

Có thực sự ba cách khác nhau để liên kết một tệp thực thi:

  • StatIC với tính năng full_static_link, trong đó mọi mục được liên kết theo phương thức tĩnh; ví dụ: "gcc -static foo.o libbar.a libbaz.a -lm".
    Chế độ này được bật bằng cách chỉ định fully_static_link trong thuộc tính features.
  • StatIC, trong đó tất cả thư viện người dùng được liên kết theo phương thức tĩnh (nếu có phiên bản tĩnh), nhưng trong trường hợp các thư viện hệ thống (ngoại trừ thư viện thời gian chạy C/C++) được liên kết động, ví dụ: "gcc foo.o libfoo.a libbaz.a -lm".
    Bạn có thể bật chế độ này bằng cách chỉ định linkstatic=True.
  • ĐỘNG, trong đó tất cả thư viện được liên kết động (nếu có phiên bản động), ví dụ: "gcc foo.o libfoo.so libbaz.so -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=False.

Thuộc tính linkstatic sẽ có ý nghĩa khác nếu được sử dụng trên quy tắc cc_library(). Đối với thư viện C++, linkstatic=True cho biết chỉ cho phép liên kết tĩnh, vì vậy sẽ không có .so nào được tạo. linkstatic=False không ngăn việc tạo thư viện tĩnh. Thuộc tính này dùng để kiểm soát việc tạo thư viện động.

Nếu là linkstatic=False, thì công cụ xây dựng sẽ tạo các đường liên kết tượng trưng đến các thư viện dùng chung phụ thuộc trong vùng *.runfiles.

local_defines

Danh sách chuỗi; mặc định là []

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Tuân theo việc thay thế biến"Make"mã hoá mã thông báo shell Bourne. Mỗi chuỗi (phải bao gồm một mã thông báo shell Bourne duy nhất,) sẽ được thêm vào trước -D và thêm vào dòng lệnh biên dịch cho mục tiêu này, nhưng không được thêm vào các phần phụ thuộc.
nocopts

Chuỗi; giá trị mặc định là ""

Xoá các tuỳ chọn trùng khớp khỏi lệnh biên dịch C++. Phải tuân theo thay thế biến"Make". Giá trị của thuộc tính này được hiểu là biểu thức chính quy. Mọi COPTS có sẵn khớp với biểu thức chính quy này (bao gồm cả các giá trị được chỉ định rõ ràng trong thuộc tính copts của quy tắc) sẽ bị xoá khỏi COPTS nhằm mục đích biên dịch quy tắc này. Thuộc tính này hiếm khi cần thiết.
strip_include_prefix

Chuỗi; giá trị mặc định là ""

Tiền tố để tách khỏi đường dẫn của các tiêu đề của quy tắc này.

Khi thiết lập, các tiêu đề trong thuộc tính hdrs của quy tắc này có thể truy cập được tại đường dẫn của chúng và tiền tố này bị cắt bớt.

Nếu đó là đường dẫn tương đối, thì đường dẫn đó được coi là đường dẫn tương đối theo gói. Nếu giá trị là một giá trị tuyệt đối, thì giá trị này được hiểu là một đường dẫn tương đối đến kho lưu trữ.

Tiền tố trong thuộc tính include_prefix sẽ được thêm sau khi xoá tiền tố.

textual_hdrs

Danh sách nhãn; mặc định là []

Danh sách các tệp tiêu đề do thư viện này xuất bản để được đưa vào bằng văn bản các nguồn trong các quy tắc phụ thuộc.

Đây là vị trí để khai báo tệp tiêu đề không thể tự biên dịch; nghĩa là các tệp nguồn khác luôn cần thêm các tệp tiêu đề này vào phương thức văn bản để tạo mã hợp lệ.

win_def_file

Nhãn; mặc định là None

Tệp Windows DEF cần được truyền đến trình liên kết.

Bạn chỉ nên sử dụng thuộc tính này khi Windows là nền tảng mục tiêu. Bạn có thể dùng công cụ này để xuất biểu tượng trong khi liên kết thư viện chia sẻ.

cc_proto_library

Xem nguồn quy tắc
cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

cc_proto_library tạo mã C++ từ các tệp .proto.

deps phải trỏ đến các quy tắc proto_library .

Ví dụ:

cc_library(
    name = "lib",
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các quy tắc proto_library để tạo mã C++.

cc_shared_library

Xem nguồn quy tắc
cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)

Tạo một thư viện dùng chung.

Ví dụ:

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

Trong ví dụ này, foo_shared liên kết tĩnh foobaz, phần sau là phần phụ thuộc bắc cầu. Thuộc tính này không liên kết với bar vì mã này đã được dynamic_dep bar_shared cung cấp một cách linh động.

foo_shared sử dụng tệp tập lệnh trình liên kết *.lds để kiểm soát biểu tượng nào nên được xuất. Logic quy tắc cc_shared_library không kiểm soát ký hiệu nào được xuất mà chỉ sử dụng những ký hiệu được giả định là sẽ xuất để đưa ra lỗi trong giai đoạn phân tích nếu hai thư viện dùng chung xuất cùng một mục tiêu.

Mọi phần phụ thuộc trực tiếp của cc_shared_library đều được giả định là được xuất. Do đó, Bazel giả định trong quá trình phân tích rằng foo đang được foo_shared xuất. Không giả định rằng baz sẽ được foo_shared xuất. Mọi mục tiêu mà exports_filter khớp với giá trị này cũng được giả định là được xuất.

Mỗi cc_library trong ví dụ này phải xuất hiện tối đa trong một cc_shared_library. Nếu muốn liên kết cả baz với bar_shared, chúng ta cần thêm tags = ["LINKABLE_MORE_THAN_ONCE"] vào baz.

Do thuộc tính shared_lib_name, tệp do bar_shared tạo ra sẽ có tên bar.so thay vì tên libbar.so theo mặc định trên Linux.

Lỗi

Two shared libraries in dependencies export the same symbols.

Điều này sẽ xảy ra bất cứ khi nào bạn tạo mục tiêu có hai phần phụ thuộc cc_shared_library khác nhau xuất cùng một mục tiêu. Để khắc phục vấn đề này, bạn cần ngăn việc xuất thư viện ở một trong các phần phụ thuộc cc_shared_library.

Điều này sẽ xảy ra bất cứ khi nào bạn tạo một cc_shared_library mới với hai phần phụ thuộc cc_shared_library khác nhau liên kết tĩnh với cùng một mục tiêu. Tương tự như lỗi xuất dữ liệu.

Có một cách để khắc phục vấn đề này là ngừng liên kết thư viện với một trong các phần phụ thuộc cc_shared_library. Đồng thời, thư viện vẫn liên kết cần xuất thư viện để ứng dụng không liên kết vẫn có thể nhìn thấy các biểu tượng. Một cách khác là lấy thư viện thứ ba xuất mục tiêu. Cách thứ ba là gắn thẻ thủ phạm cc_library bằng LINKABLE_MORE_THAN_ONCE. Tuy nhiên, cách khắc phục này hiếm khi xảy ra và bạn hoàn toàn phải đảm bảo cc_library thực sự an toàn để liên kết nhiều lần.

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

Tức là có thể truy cập vào một thư viện trong quá trình đóng bắc cầu của deps mà không cần trải qua một trong các phần phụ thuộc cc_shared_library, nhưng đã được liên kết với một cc_shared_library khác trong dynamic_deps và không được xuất.

Giải pháp cho trường hợp này là xuất dữ liệu này từ phần phụ thuộc cc_shared_library hoặc lấy cc_shared_library thứ ba xuất tệp đó.

Do not place libraries which only contain a precompiled dynamic library in deps.

Nếu bạn có một thư viện động được biên dịch trước, thì thư viện này không cần và không thể được liên kết tĩnh với mục tiêu cc_shared_library hiện tại mà bạn đang tạo. Do đó, thuộc tính này không thuộc deps của cc_shared_library. Nếu thư viện động được biên dịch trước này là phần phụ thuộc của một trong các cc_libraries của bạn, thì cc_library cần phải phụ thuộc trực tiếp vào thư viện đó.

Trying to export a library already exported by a different shared library

Bạn sẽ thấy lỗi này nếu trên quy tắc hiện tại, bạn đang xác nhận quyền sở hữu để xuất một mục tiêu đã được một trong các phần phụ thuộc động của bạn xuất.

Để khắc phục vấn đề này, hãy xoá mục tiêu khỏi deps và chỉ cần dựa vào mục tiêu đó từ phần phụ thuộc động hoặc đảm bảo rằng exports_filter không nắm bắt được mục tiêu này.

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Các thư viện cấp cao nhất sẽ được liên kết tĩnh vô điều kiện với thư viện dùng chung sau khi được lưu trữ toàn bộ.

Mọi phần phụ thuộc thư viện bắc cầu của các phần phụ thuộc trực tiếp này đều sẽ được liên kết với thư viện dùng chung này, miễn là các phần phụ thuộc đó chưa được liên kết bằng một cc_shared_library trong dynamic_deps.

Trong quá trình phân tích, việc triển khai quy tắc sẽ coi mọi mục tiêu được liệt kê trong deps là đã được thư viện dùng chung xuất để báo lỗi khi nhiều cc_shared_libraries xuất cùng một mục tiêu. Quá trình triển khai quy tắc không quan tâm đến việc thông báo cho trình liên kết về biểu tượng nào nên được đối tượng dùng chung xuất. Người dùng nên xử lý vấn đề này thông qua tập lệnh trình liên kết hoặc nội dung khai báo chế độ hiển thị trong mã nguồn.

Quá trình triển khai cũng sẽ kích hoạt lỗi bất cứ khi nào cùng một thư viện được liên kết tĩnh với nhiều cc_shared_library. Bạn có thể tránh điều này bằng cách thêm "LINKABLE_MORE_THAN_ONCE" vào cc_library.tags hoặc liệt kê "cc_library" dưới dạng tệp dữ liệu xuất của một trong những thư viện dùng chung để bạn có thể tạo một thư viện làm dynamic_dep của thư viện còn lại.

additional_linker_inputs

Danh sách nhãn; mặc định là []

Bất kỳ tệp bổ sung nào bạn muốn chuyển cho trình liên kết, ví dụ: tập lệnh trình liên kết. Bạn phải truyền riêng mọi cờ trình liên kết mà trình liên kết cần để nhận biết được tệp này. Bạn có thể thực hiện việc này thông qua thuộc tính user_link_flags.
dynamic_deps

Danh sách nhãn; mặc định là []

Đây là các phần phụ thuộc cc_shared_library khác mà mục tiêu hiện tại phụ thuộc vào.

Cách triển khai cc_shared_library sẽ sử dụng danh sách dynamic_deps (theo cách tạm thời, tức là dynamic_deps của dynamic_deps của mục tiêu hiện tại) để quyết định không nên liên kết cc_libraries nào trong deps bắc cầu vì những thuộc tính này đã được một cc_shared_library khác cung cấp.

exports_filter

Danh sách chuỗi; mặc định là []

Thuộc tính này chứa danh sách các mục tiêu được xác nhận là có thể xuất bằng thư viện chia sẻ hiện tại.

Thư viện dùng chung đã hiểu mọi deps mục tiêu đã được xuất. Bạn nên sử dụng thuộc tính này để liệt kê mọi mục tiêu mà thư viện chia sẻ xuất ra nhưng là các phần phụ thuộc bắc cầu của deps.

Lưu ý rằng thuộc tính này không thực sự thêm cạnh phần phụ thuộc vào các mục tiêu đó. Thay vào đó, cạnh phần phụ thuộc phải được tạo bằng deps. Các mục nhập trong thuộc tính này chỉ là các chuỗi. Hãy lưu ý rằng khi đặt một mục tiêu trong thuộc tính này, đây được coi là xác nhận rằng thư viện dùng chung xuất các biểu tượng từ mục tiêu đó. Logic cc_shared_library không thực sự xử lý việc cho trình liên kết biết biểu tượng nào nên được xuất.

Bạn có thể sử dụng cú pháp sau:

//foo:__package__ để tính đến mọi mục tiêu trong foo/BUILD

//foo:__subpackages__ để tính đến mọi mục tiêu trong foo/BUILD hoặc bất kỳ gói nào khác bên dưới foo/ như foo/bar/BUILD

shared_lib_name

Chuỗi; giá trị mặc định là ""

Theo mặc định, cc_shared_library sẽ sử dụng tên cho tệp đầu ra của thư viện chia sẻ dựa trên tên của mục tiêu và nền tảng. Bao gồm một phần mở rộng và đôi khi là một tiền tố. Đôi khi, bạn có thể không muốn đặt tên mặc định, ví dụ: khi tải thư viện chia sẻ C++ cho Python, tiền tố lib* mặc định thường không được mong muốn. Trong trường hợp đó, bạn có thể sử dụng thuộc tính này để chọn tên tuỳ chỉnh.

Danh sách chuỗi; mặc định là []

Mọi cờ khác mà bạn có thể muốn truyền đến trình liên kết. Ví dụ: để giúp trình liên kết biết được tập lệnh của trình liên kết được chuyển thông qua additional_linker_inputs, bạn có thể sử dụng các lệnh sau:
         cc_shared_library(
            name = "foo_shared",
            additional_linker_inputs = select({
              "//src/conditions:linux": [
                ":foo.lds",
                ":additional_script.txt",
              ],
              "//conditions:default": []}),
            user_link_flags = select({
              "//src/conditions:linux": [
                "-Wl,-rpath,kittens",
                "-Wl,--version-script=$(location :foo.lds)",
                "-Wl,--script=$(location :additional_script.txt)",
              ],
              "//conditions:default": []}),
              ...
         )
        
win_def_file

Nhãn; mặc định là None

Tệp Windows DEF cần được truyền đến trình liên kết.

Bạn chỉ nên sử dụng thuộc tính này khi Windows là nền tảng mục tiêu. Bạn có thể dùng công cụ này để xuất biểu tượng trong khi liên kết thư viện chia sẻ.

fdo_prefetch_hints

Xem nguồn quy tắc
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Đại diện cho cấu hình gợi ý tìm nạp trước FDO trong không gian làm việc hoặc tại một đường dẫn tuyệt đối được chỉ định. Ví dụ:

fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

profile

Nhãn; mặc định là None

Nhãn của hồ sơ gợi ý. Tệp gợi ý có đuôi .afdo. Nhãn cũng có thể trỏ đến quy tắc fdo_exact_path_profile.

fdo_profile

Xem nguồn quy tắc
fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Biểu thị một cấu hình FDO trong không gian làm việc hoặc tại một đường dẫn tuyệt đối được chỉ định. Ví dụ:

fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

absolute_path_profile

Chuỗi; giá trị mặc định là ""

Đường dẫn tuyệt đối đến hồ sơ FDO. Tệp FDO chỉ được có đuôi .afdo.
profile

Nhãn; mặc định là None

Nhãn của hồ sơ FDO hoặc quy tắc tạo hồ sơ FDO. Tệp FDO có thể có một trong các đuôi sau: .profraw cho hồ sơ LLVM chưa được lập chỉ mục, .profdata cho hồ sơ LLVM được lập chỉ mục, .zip chứa hồ sơ LLVM profraw, .afdo cho hồ sơ AutoFDO, .xfdo cho hồ sơ XBinary. Nhãn cũng có thể trỏ đến quy tắc fdo_ menu_path_profile.
proto_profile

Nhãn; mặc định là None

Nhãn của hồ sơ protobuf.

memprof_profile

Xem nguồn quy tắc
memprof_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Đại diện cho một cấu hình MEMPROF nằm trong không gian làm việc hoặc tại một đường dẫn tuyệt đối được chỉ định. Ví dụ:

memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

memprof_profile(
  name = "memprof_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

absolute_path_profile

Chuỗi; giá trị mặc định là ""

Đường dẫn tuyệt đối đến cấu hình MEMPROF. Tệp này chỉ được có đuôi .profdata hoặc .zip (trong đó tệp zip phải chứa tệp memprof.profdata).
profile

Nhãn; mặc định là None

Nhãn của cấu hình MEMPROF. Hồ sơ này dự kiến phải có đuôi .profdata (đối với hồ sơ memprof đã được lập chỉ mục/ký hiệu) hoặc một đuôi .zip cho một tệp zipfile chứa tệp memprof.profdata. Nhãn cũng có thể trỏ đến quy tắc fdo_ menu_path_profile.

propeller_optimize

Xem nguồn quy tắc
propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

Đại diện cho một hồ sơ tối ưu hoá Propeller trong không gian làm việc. Ví dụ:

propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

ld_profile

Nhãn; mặc định là None

Nhãn của hồ sơ được chuyển đến thao tác liên kết. Tệp này có đuôi là .txt.

cc_test

Xem nguồn quy tắc
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, link_extra_lib, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện khác được liên kết đến mục tiêu nhị phân.

Đây có thể là mục tiêu cc_library hoặc objc_library.

srcs

Danh sách nhãn; mặc định là []

Danh sách tệp C và C++ được xử lý để tạo mục tiêu. Đây là các tệp tiêu đề và tệp nguồn C/C++, không được tạo (mã nguồn thông thường) hoặc được tạo.

Tất cả tệp .cc, .c.cpp sẽ được biên dịch. Đây có thể là các tệp được tạo: nếu một tệp được đặt tên nằm trong outs của một số quy tắc khác, thì quy tắc này sẽ tự động phụ thuộc vào quy tắc khác đó.

Tệp .h sẽ không được biên dịch nhưng sẽ có thể đưa vào các nguồn trong quy tắc này. Cả tệp .cc.h đều có thể trực tiếp chứa tiêu đề được liệt kê trong srcs này hoặc trong hdrs của bất kỳ quy tắc nào được liệt kê trong đối số deps.

Tất cả tệp #include phải được đề cập trong thuộc tính srcs của quy tắc này hoặc trong thuộc tính hdrs của các cc_library() được tham chiếu. Kiểu nên dùng dành cho các tiêu đề liên kết với thư viện sẽ được liệt kê trong thuộc tính hdrs của thư viện đó và mọi tiêu đề còn lại liên kết với các nguồn của quy tắc này sẽ được liệt kê trong srcs. Hãy xem bài viết "Kiểm tra việc bao gồm tiêu đề" để biết nội dung mô tả chi tiết hơn.

Nếu tên của một quy tắc nằm trong srcs, thì quy tắc này sẽ tự động phụ thuộc vào quy tắc đó. Nếu outs của quy tắc được đặt tên là tệp nguồn C hoặc C++, thì các tệp đó sẽ được biên dịch thành quy tắc này; nếu là tệp thư viện, thì các tệp đó sẽ được liên kết.

Loại tệp srcs được phép:

  • Tệp nguồn C và C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Tệp tiêu đề C và C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Tập hợp với bộ tiền xử lý C: .S
  • Lưu trữ: .a, .pic.a
  • Thư viện "Luôn liên kết": .lo, .pic.lo
  • Thư viện chia sẻ, đã tạo phiên bản hoặc chưa tạo phiên bản: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

...và bất kỳ quy tắc nào tạo ra các tệp đó. Các tiện ích khác nhau biểu thị các ngôn ngữ lập trình khác nhau theo quy ước gcc.

additional_linker_inputs

Danh sách nhãn; mặc định là []

Truyền các tệp này vào lệnh trình liên kết C++.

Ví dụ: bạn có thể cung cấp các tệp Windows .res đã biên dịch tại đây để nhúng vào mục tiêu nhị phân.

copts

Danh sách chuỗi; mặc định là []

Thêm các tuỳ chọn này vào lệnh biên dịch C++. Áp dụng tuỳ chọn thay thế "Tạo biến"tạo mã thông báo shell Bourne.

Mỗi chuỗi trong thuộc tính này được thêm theo thứ tự nhất định vào COPTS trước khi biên dịch mục tiêu nhị phân. Cờ chỉ có hiệu lực khi biên dịch mục tiêu này chứ không phải các phần phụ thuộc của mục tiêu. Vì vậy, hãy cẩn thận với các tệp tiêu đề được đưa vào những nơi khác. Tất cả đường dẫn đều phải liên quan đến không gian làm việc chứ không phải gói hiện tại.

Nếu gói khai báo tính năng no_copts_tokenization, thì việc mã hoá mã thông báo shell Bourne sẽ chỉ áp dụng cho các chuỗi chứa một biến "Make" duy nhất.

defines

Danh sách chuỗi; mặc định là []

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Tuân theo việc thay thế biến"Make"mã hoá mã thông báo shell Bourne. Mỗi chuỗi (phải bao gồm một mã thông báo shell Bourne duy nhất,) sẽ được thêm vào trước -D và thêm vào dòng lệnh biên dịch cho mục tiêu này, cũng như vào mọi quy tắc phụ thuộc vào chuỗi đó. Hãy thật cẩn thận vì việc này có thể gây ảnh hưởng sâu sắc. Khi nghi ngờ, hãy thêm các giá trị định nghĩa vào local_defines.
includes

Danh sách chuỗi; mặc định là []

Danh sách các thư mục bao gồm sẽ được thêm vào dòng biên dịch.

Đối với sự thay thế "Tạo biến". Mỗi chuỗi được thêm vào trước -isystem và thêm vào COPTS. Không giống như COPTS, những cờ này được thêm cho quy tắc này và mọi quy tắc phụ thuộc vào quy tắc đó. (Lưu ý: không phải quy tắc mà nó phụ thuộc vào!) Hãy thật cẩn thận vì việc này có thể gây ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm cờ "-I" vào COPTS.

Bạn phải thêm tiêu đề vào src hoặc hdr, nếu không, các quy tắc phụ thuộc sẽ không sử dụng được các quy tắc phụ thuộc khi quá trình biên dịch ở dạng hộp cát (mặc định).

Nhãn; mặc định là "@bazel_tools//tools/cpp:link_extra_lib"

Kiểm soát việc liên kết thư viện bổ sung.

Theo mặc định, các tệp nhị phân C++ được liên kết với //tools/cpp:link_extra_lib mà theo mặc định, tệp nhị phân này phụ thuộc vào cờ nhãn //tools/cpp:link_extra_libs. Nếu bạn không đặt cờ này, theo mặc định, thư viện này sẽ trống. Việc đặt cờ nhãn cho phép liên kết các phần phụ thuộc không bắt buộc, chẳng hạn như cơ chế ghi đè cho các ký hiệu yếu, trình chặn đối với các hàm thư viện dùng chung hoặc thư viện thời gian chạy đặc biệt (để thay thế Malloc, hãy ưu tiên malloc hoặc --custom_malloc). Việc đặt thuộc tính này thành None sẽ tắt hành vi này.

linkopts

Danh sách chuỗi; mặc định là []

Thêm các cờ này vào lệnh trình liên kết C++. Tuân theo việc thay thế biến"Make", mã hoá mã thông báo shell Bournemở rộng nhãn. Mỗi chuỗi trong thuộc tính này được thêm vào LINKOPTS trước khi liên kết mục tiêu nhị phân.

Mỗi phần tử của danh sách này không bắt đầu bằng $ hoặc - được coi là nhãn của một mục tiêu trong deps. Danh sách các tệp do mục tiêu đó tạo ra sẽ được thêm vào các tuỳ chọn trình liên kết. Hệ thống sẽ báo cáo lỗi nếu nhãn không hợp lệ hoặc không được khai báo trong deps.

linkstatic

Boolean; giá trị mặc định là False

Đối với cc_binarycc_test: liên kết tệp nhị phân ở chế độ tĩnh. Đối với cc_library.linkstatic: xem bên dưới.

Theo mặc định, tuỳ chọn này được bật cho cc_binary và tắt cho các ứng dụng còn lại.

Nếu được bật và đây là tệp nhị phân hoặc kiểm thử, tuỳ chọn này sẽ yêu cầu công cụ bản dựng liên kết trong .a thay vì trong .so cho thư viện người dùng bất cứ khi nào có thể. Một số thư viện hệ thống vẫn có thể được liên kết động, tương tự như các thư viện không có thư viện tĩnh. Vì vậy, tệp thực thi thu được vẫn sẽ được liên kết động, do đó chỉ hầu hết là tệp tĩnh.

Có thực sự ba cách khác nhau để liên kết một tệp thực thi:

  • StatIC với tính năng full_static_link, trong đó mọi mục được liên kết theo phương thức tĩnh; ví dụ: "gcc -static foo.o libbar.a libbaz.a -lm".
    Chế độ này được bật bằng cách chỉ định fully_static_link trong thuộc tính features.
  • StatIC, trong đó tất cả thư viện người dùng được liên kết theo phương thức tĩnh (nếu có phiên bản tĩnh), nhưng trong trường hợp các thư viện hệ thống (ngoại trừ thư viện thời gian chạy C/C++) được liên kết động, ví dụ: "gcc foo.o libfoo.a libbaz.a -lm".
    Bạn có thể bật chế độ này bằng cách chỉ định linkstatic=True.
  • ĐỘNG, trong đó tất cả thư viện được liên kết động (nếu có phiên bản động), ví dụ: "gcc foo.o libfoo.so libbaz.so -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=False.

Thuộc tính linkstatic sẽ có ý nghĩa khác nếu được sử dụng trên quy tắc cc_library(). Đối với thư viện C++, linkstatic=True cho biết chỉ cho phép liên kết tĩnh, vì vậy sẽ không có .so nào được tạo. linkstatic=False không ngăn việc tạo thư viện tĩnh. Thuộc tính này dùng để kiểm soát việc tạo thư viện động.

Nếu là linkstatic=False, thì công cụ xây dựng sẽ tạo các đường liên kết tượng trưng đến các thư viện dùng chung phụ thuộc trong vùng *.runfiles.

local_defines

Danh sách chuỗi; mặc định là []

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Tuân theo việc thay thế biến"Make"mã hoá mã thông báo shell Bourne. Mỗi chuỗi (phải bao gồm một mã thông báo shell Bourne duy nhất,) sẽ được thêm vào trước -D và thêm vào dòng lệnh biên dịch cho mục tiêu này, nhưng không được thêm vào các phần phụ thuộc.
malloc

Nhãn; mặc định là "@bazel_tools//tools/cpp:malloc"

Ghi đè phần phụ thuộc mặc định trên malloc.

Theo mặc định, các tệp nhị phân C++ được liên kết với //tools/cpp:malloc (đây là một thư viện trống nên tệp nhị phân sẽ kết thúc bằng libc malloc). Nhãn này phải tham chiếu đến một cc_library. Nếu quá trình biên dịch không dành cho quy tắc không phải C++, thì tuỳ chọn này sẽ không có hiệu lực. Giá trị của thuộc tính này sẽ bị bỏ qua nếu bạn chỉ định linkshared=True.

nocopts

Chuỗi; giá trị mặc định là ""

Xoá các tuỳ chọn trùng khớp khỏi lệnh biên dịch C++. Phải tuân theo thay thế biến"Make". Giá trị của thuộc tính này được hiểu là biểu thức chính quy. Mọi COPTS có sẵn khớp với biểu thức chính quy này (bao gồm cả các giá trị được chỉ định rõ ràng trong thuộc tính copts của quy tắc) sẽ bị xoá khỏi COPTS nhằm mục đích biên dịch quy tắc này. Thuộc tính này hiếm khi cần thiết.
stamp

Số nguyên; giá trị mặc định là 0

Liệu có mã hoá thông tin bản dựng thành tệp nhị phân hay không. Có thể dùng các giá trị sau:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong các bản dựng --nostamp. Bạn nên tránh chế độ cài đặt này, vì chế độ này có thể tắt chức năng lưu vào bộ nhớ đệm từ xa đối với tệp nhị phân và mọi thao tác hạ nguồn phụ thuộc vào tệp nhị phân đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị hằng số. Điều này giúp lưu kết quả bản dựng tốt vào bộ nhớ đệm.
  • stamp = -1: Bạn có thể kiểm soát việc nhúng thông tin bản dựng bằng cờ --[no]stamp.

Tệp nhị phân đã đóng dấu không được tạo lại trừ phi các phần phụ thuộc của chúng thay đổi.

win_def_file

Nhãn; mặc định là None

Tệp Windows DEF cần được truyền đến trình liên kết.

Bạn chỉ nên sử dụng thuộc tính này khi Windows là nền tảng mục tiêu. Bạn có thể dùng công cụ này để xuất biểu tượng trong khi liên kết thư viện chia sẻ.

cc_toolchain

Xem nguồn quy tắc
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)

Đại diện cho một chuỗi công cụ C++.

Quy tắc này chịu trách nhiệm về:

  • Thu thập tất cả cấu phần phần mềm cần thiết để chạy các thao tác C++. Việc này được thực hiện bằng các thuộc tính như all_files, compiler_files, linker_files hoặc các thuộc tính khác kết thúc bằng _files). Đây thường là các nhóm tệp hoàn thành tất cả các tệp bắt buộc.
  • Tạo dòng lệnh chính xác cho các thao tác C++. Bạn có thể thực hiện việc này bằng cách sử dụng trình cung cấp CcToolchainConfigInfo (thông tin chi tiết như bên dưới).

Sử dụng thuộc tính toolchain_config để định cấu hình chuỗi công cụ C++. Xem thêm trang này để biết cấu hình chuỗi công cụ C++ chi tiết và tài liệu lựa chọn chuỗi công cụ.

Sử dụng tags = ["manual"] để ngăn việc tạo và định cấu hình chuỗi công cụ một cách không cần thiết khi gọi bazel build //...

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

all_files

Nhãn; bắt buộc

Thu thập tất cả cấu phần phần mềm cc_toolchain. Các cấu phần phần mềm này sẽ được thêm làm dữ liệu đầu vào cho tất cả thao tác liên quan đến rules_cc (ngoại trừ những thao tác đang sử dụng các nhóm cấu phần phần mềm chính xác hơn từ các thuộc tính bên dưới). Bazel giả định rằng all_files là tập mẹ của tất cả các thuộc tính khác cung cấp cấu phần phần mềm (ví dụ: quá trình biên dịch linkstamp cần cả tệp biên dịch và tệp liên kết, nên sẽ cần all_files).

Đây là nội dung trong cc_toolchain.files và được tất cả các quy tắc của Starlark sử dụng chuỗi công cụ C++.

ar_files

Nhãn; mặc định là None

Thu thập tất cả cấu phần phần mềm cc_toolchain cần thiết để lưu trữ các thao tác.

as_files

Nhãn; mặc định là None

Thu thập tất cả cấu phần phần mềm cc_toolchain cần thiết cho các thao tác tập hợp.

compiler_files

Nhãn; bắt buộc

Thu thập tất cả cấu phần phần mềm cc_toolchain cần thiết cho các thao tác biên dịch.
compiler_files_without_includes

Nhãn; mặc định là None

Thu thập tất cả cấu phần phần mềm cc_toolchain cần thiết cho các thao tác biên dịch trong trường hợp tính năng khám phá dữ liệu đầu vào được hỗ trợ (hiện chỉ có trên Google).
coverage_files

Nhãn; mặc định là None

Thu thập tất cả cấu phần phần mềm cc_toolchain cần thiết cho các thao tác liên quan đến mức độ sử dụng. Nếu không được chỉ định, hệ thống sẽ sử dụng all_files.
dwp_files

Nhãn; bắt buộc

Thu thập tất cả cấu phần phần mềm cc_toolchain cần thiết cho các thao tác dwp.
dynamic_runtime_lib

Nhãn; mặc định là None

Cấu phần phần mềm thư viện động cho thư viện thời gian chạy C++ (ví dụ: libstdc++.so).

Thuộc tính này sẽ được dùng khi bạn bật tính năng "static_link_cpp_runtimes" và chúng ta sẽ linh động liên kết các phần phụ thuộc.

exec_transition_for_inputs

Boolean; giá trị mặc định là True

Đặt thành True để tạo tất cả dữ liệu đầu vào tệp thành cc_toolchain cho nền tảng thực thi, thay vì không có chuyển đổi (tức là nền tảng mục tiêu theo mặc định).
libc_top

Nhãn; mặc định là None

Một tập hợp cấu phần phần mềm cho libc được truyền dưới dạng dữ liệu đầu vào để biên dịch/liên kết các hành động.
linker_files

Nhãn; bắt buộc

Thu thập tất cả cấu phần phần mềm cc_toolchain cần thiết cho các thao tác liên kết.
module_map

Nhãn; mặc định là None

Cấu phần phần mềm bản đồ mô-đun sẽ được dùng cho các bản dựng mô-đun.
objcopy_files

Nhãn; bắt buộc

Thu thập tất cả cấu phần phần mềm cc_toolchain cần thiết cho các thao tác objcopy.
static_runtime_lib

Nhãn; mặc định là None

Cấu phần phần mềm thư viện tĩnh cho thư viện thời gian chạy C++ (ví dụ: libstdc++.a).

Thuộc tính này sẽ được dùng khi bạn bật tính năng "static_link_cpp_runtimes" và liên kết các phần phụ thuộc theo cách tĩnh.

strip_files

Nhãn; bắt buộc

Thu thập tất cả cấu phần phần mềm cc_toolchain cần thiết cho các thao tác loại bỏ.
supports_header_parsing

Boolean; giá trị mặc định là False

Đặt thành True khi cc_toolchain hỗ trợ các thao tác phân tích cú pháp tiêu đề.
supports_param_files

Boolean; giá trị mặc định là True

Đặt thành True khi cc_toolchain hỗ trợ việc sử dụng các tệp thông số cho các hành động liên kết.
toolchain_config

Nhãn; bắt buộc

Nhãn của quy tắc cung cấp cc_toolchain_config_info.
toolchain_identifier

Chuỗi; không thể định cấu hình; giá trị mặc định là ""

Giá trị nhận dạng dùng để so khớp cc_toolchain này với crosstool_config.toolchain tương ứng.

Cho đến khi vấn đề #5380 được khắc phục, bạn nên liên kết cc_toolchain với CROSSTOOL.toolchain. Thuộc tính này sẽ được thay thế bằng thuộc tính toolchain_config (#5380).

cc_toolchain_suite

Xem nguồn quy tắc
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Đại diện cho một tập hợp chuỗi công cụ C++.

Quy tắc này chịu trách nhiệm về:

  • Thu thập tất cả chuỗi công cụ C++ có liên quan.
  • Chọn một chuỗi công cụ tuỳ thuộc vào các tuỳ chọn --cpu--compiler được truyền đến Bazel.

Xem thêm trang này để biết cấu hình chuỗi công cụ C++ chi tiết và tài liệu lựa chọn chuỗi công cụ.

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.

toolchains

Chuỗi ánh xạ từ điển đến nhãn; không thể định cấu hình; bắt buộc

Một bản đồ từ các chuỗi "<cpu>" hoặc "<cpu>|<compiler>" đến nhãn cc_toolchain. "<cpu>" sẽ được dùng khi chỉ --cpu được chuyển đến Bazel, còn "<cpu>|<compiler>" sẽ được dùng khi cả --cpu--compiler được truyền đến Bazel. Ví dụ:

          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )