Quy tắc C / C++

Báo cáo vấn đề Xem nguồn Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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)

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): Một phiên bản nhị phân đã được loại bỏ. 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 các lựa chọn bổ sung cho lệnh strip trên dòng lệnh bằng cách sử dụng --stripopt=-foo. Đầu ra này chỉ được tạo nếu bạn yêu cầu rõ ràng.
  • name.dwp (chỉ được tạo nếu có yêu cầu rõ ràng): Nếu Fission được bật: 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. Nếu không: một tệp trống.

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng 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 sẽ được liên kết vào 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 các tệp C và C++ được xử lý để tạo mục tiêu. Đây là các tệp nguồn và tệp tiêu đề C/C++, không được tạo (mã nguồn thông thường) hoặc được tạo.

Tất cả cá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ên nằm trong outs của một 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ó sẵn để các nguồn trong quy tắc này đưa vào. Cả tệp .cc.h đều có thể trực tiếp bao gồm các tiêu đề có trong srcs hoặc trong hdrs của bất kỳ quy tắc nào có trong đối số deps.

Tất cả các tệp #include đều 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 cc_library() được tham chiếu. Kiểu được đề xuất là các tiêu đề được liên kết với một 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 được 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 phần "Kiểm tra việc đưa tiêu đề vào" để 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ì chúng sẽ được biên dịch thành quy tắc này; nếu là tệp thư viện, thì chúng sẽ được liên kết.

Các loại tệp srcs được cho 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
  • Trình hợp ngữ có trình 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 dùng chung, có phiên bản hoặc không có phiên bản: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

...và mọi quy tắc tạo ra những tệp đó. Các đuôi 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 đến lệnh trình liên kết C++.

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

copts

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

Thêm các lựa chọn này vào lệnh biên dịch C++. Chịu sự thay thế "Tạo biến"phân tích cú pháp Bourne shell.

Mỗi chuỗi trong thuộc tính này được thêm theo thứ tự đã cho vào COPTS trước khi biên dịch đích nhị phân. Các 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ề các tệp tiêu đề được đưa vào ở nơi khác. Tất cả các đường dẫn phải tương ứng với không gian làm việc, chứ không phải với gói hiện tại.

Nếu gói khai báo feature no_copts_tokenization, thì quá trình mã hoá thành mã thông báo Bourne shell chỉ áp dụng cho các chuỗi bao gồm một biến "Make" duy nhất.

defines

Danh sách các 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ỳ thuộc vào việc thay thế biến"Make"phân tích cú pháp Bourne shell. Mỗi chuỗi (phải bao gồm một mã thông báo Bourne shell duy nhất) sẽ được thêm tiền tố -D và được thêm vào dòng lệnh biên dịch cho mục tiêu này, cũng như cho mọi quy tắc phụ thuộc vào mục tiêu đó. Hãy hết sức thận trọng vì điều này có thể gây ra những ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm các giá trị xác định vào local_defines.
includes

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

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

Chịu sự thay thế "Tạo biến". Mỗi chuỗi được thêm tiền tố -isystem và được thêm vào COPTS. Không giống như COPTS, các 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 này. (Lưu ý: không phải là các quy tắc mà nó phụ thuộc vào!) Hãy hết sức thận trọng vì điều này có thể gây ra những ả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 srcs hoặc hdrs, nếu không, các tiêu đề này sẽ không có sẵn cho các quy tắc phụ thuộc khi quá trình biên dịch được giới hạn trong hộp cát (theo 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 các 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, theo mặc định phụ thuộc vào cờ nhãn //tools/cpp:link_extra_libs. Nếu không đặt cờ, 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ư ghi đè cho các biểu tượng yếu, các trình chặn cho các hàm thư viện dùng chung hoặc cá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 các chuỗi; mặc định là []

Thêm các cờ này vào lệnh của trình liên kết C++. Tuỳ thuộc vào việc thay thế biến"Make", phân tích cú pháp Bourne shellmở 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ử trong danh sách này không bắt đầu bằng $ hoặc - được giả định 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 lựa chọn của trình liên kết. Một lỗi sẽ được báo cáo 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; mặc định là False

Tạo thư viện dùng chung. Để bật thuộc tính này, hãy thêm linkshared=True vào quy tắc của bạn. Theo mặc định, lựa chọn này sẽ tắt.

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

Nếu được bật và đây là một tệp nhị phân hoặc thử nghiệm, thì lựa chọn này sẽ yêu cầu công cụ tạo liên kết trong .a thay vì .so cho các 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 một cách linh động, cũng như các thư viện không có thư viện tĩnh. Do đó, tệp thực thi kết quả vẫn sẽ được liên kết động, do đó chỉ hầu hết là tĩnh.

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

  • STATIC có tính năng fully_static_link, trong đó mọi thứ đều được liên kết 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 đều được liên kết tĩnh (nếu có phiên bản tĩnh), nhưng các thư viện hệ thống (không bao gồm 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".
    Chế độ này được bật bằng cách chỉ định linkstatic=True.
  • DYNAMIC, trong đó tất cả các thư viện đều được liên kết một cách linh động (nếu có phiên bản linh độ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 có ý nghĩa khác nếu được dùng theo quy tắc cc_library(). Đối với một thư viện C++, linkstatic=True cho biết rằng chỉ được 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 linkstatic=False, thì công cụ tạo bản 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 khu vực *.runfiles.

local_defines

Danh sách các 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ỳ thuộc vào việc thay thế biến"Make"phân tích cú pháp Bourne shell. Mỗi chuỗi (phải bao gồm một mã thông báo Bourne shell duy nhất) được thêm tiền tố -D và được 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 mục tiêu phụ thuộc của mục tiêu này.
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ẽ sử dụng libc malloc. Nhãn này phải đề cập đến một cc_library. Nếu quá trình biên dịch là cho một quy tắc không phải C++, thì lựa 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 lựa chọn trùng khớp khỏi lệnh biên dịch C++. Có thể thay thế bằng biến "Make" (Thực hiện). Giá trị của thuộc tính này được diễn giải dưới dạng một biểu thức chính quy. Mọi COPTS hiện có 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 cho mục đích biên dịch quy tắc này. Bạn hiếm khi cần đến thuộc tính này.
stamp

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

Có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Các giá trị có thể sử dụng là:
  • 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ể loại bỏ tính năng lưu vào bộ nhớ đệm từ xa cho tệp nhị phân và mọi thao tác tiếp theo 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 vào bộ nhớ đệm kết quả của bản dựng một cách hiệu quả.
  • stamp = -1: Việc nhúng thông tin bản dựng được kiểm soát bằng cờ --[no]stamp.

Các tệp nhị phân được đóng dấu sẽ 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 DEF của Windows sẽ đượ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 tuỳ chọn này để xuất các biểu tượng trong quá trình liên kết một thư viện dùng chung.

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)

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

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 dùng chung (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 dùng chung
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ợ một 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 riêng 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 vào. Xem các nhận xét chung về deps tại Các thuộc tính điển hình do hầu hết các quy tắc xây dựng xác định.
hdrs

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

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

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

Nếu là 1, mọi tệp nhị phân 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 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 mà tệp nhị phân tham chiếu. Điều này hữu ích nếu mã của bạn không được mã trong tệp nhị phân gọi một cách rõ ràng, ví dụ: nếu mã của bạn đăng ký nhận một số lệnh gọi lại do một số dịch vụ cung cấp.

Nếu alwayslink không hoạt động với VS 2017 trên Windows, thì đó là do một 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 dùng chung.

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 dùng chung được biên dịch sẵn duy nhất. Bazel đảm bảo rằng tệp nhị phân phụ thuộc vào tệp này có sẵn 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 sẵn.

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 là 1, tức là hệ thống cung cấp thư viện dùng chung bắt buộc trong thời gian chạy. Trong trường hợp này, bạn phải chỉ định interface_libraryshared_library phải để trống.

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 bao gồm tiêu đề

Tất cả các tệp tiêu đề được dùng trong bản dựng đều phải được khai báo trong hdrs hoặc srcs của các quy tắc cc_*. Quy tắc 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. Tiêu đề trong srcs chỉ được đưa trực tiếp từ các tệp trong hdrssrcs của chính thư viện. Khi quyết định có nên đặt một tiêu đề vào hdrs hay srcs, bạn nên hỏi xem bạn có muốn người dùng thư viện này có thể trực tiếp thêm tiêu đề đó hay không. Đây gần như là quyết định tương tự như giữa khả năng 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, nên chúng cũng không có thuộc tính hdrs. Tất cả các tiêu đề thuộc về 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"],
)

Các mục được phép đưa vào trực tiếp trong ví dụ này được liệt kê trong bảng bên dưới. Ví dụ: foo.cc được phép trực tiếp bao gồm foo.hbar.h, nhưng không được bao gồm baz.h.

Bao gồm cả tệpNội dung đượ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 các trường hợp đư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, đến lượt baz.h được phép bao gồm baz-impl.h. Về mặt kỹ thuật, quá trình biên dịch tệp .cc có thể bao gồm bất kỳ tệp tiêu đề nào trong hdrs hoặc srcs trong bất kỳ cc_library nào trong bao đó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 thực hiện việc đó, bạn phải thêm baz vào deps của foo.

Bazel phụ thuộc vào khả 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. Công cụ phải hỗ trợ tính năng layering_check và được yêu cầu một cách 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 riêng 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 sẽ được liên kết vào 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 các tệp C và C++ được xử lý để tạo mục tiêu. Đây là các tệp nguồn và tệp tiêu đề C/C++, không được tạo (mã nguồn thông thường) hoặc được tạo.

Tất cả cá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ên nằm trong outs của một 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ó sẵn để các nguồn trong quy tắc này đưa vào. Cả tệp .cc.h đều có thể trực tiếp bao gồm các tiêu đề có trong srcs hoặc trong hdrs của bất kỳ quy tắc nào có trong đối số deps.

Tất cả các tệp #include đều 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 cc_library() được tham chiếu. Kiểu được đề xuất là các tiêu đề được liên kết với một 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 được 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 phần "Kiểm tra việc đưa tiêu đề vào" để 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ì chúng sẽ được biên dịch thành quy tắc này; nếu là tệp thư viện, thì chúng sẽ được liên kết.

Các loại tệp srcs được cho 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
  • Trình hợp ngữ có trình 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 dùng chung, có phiên bản hoặc không có phiên bản: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

...và mọi quy tắc tạo ra những tệp đó. Các đuôi 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 trong các quy tắc phụ thuộc trực tiếp đưa vào.

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

additional_compiler_inputs

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

Mọi tệp bổ sung mà bạn có thể muốn truyền đến dòng lệnh của trình biên dịch, chẳng hạn như danh sách bỏ qua trình dọn dẹp. Sau đó, bạn có thể dùng các tệp được chỉ định ở đây trong copts 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 đến lệnh trình liên kết C++.

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

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

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

Nếu alwayslink không hoạt động với VS 2017 trên Windows, thì đó là do một 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 các chuỗi; mặc định là []

Thêm các lựa chọn này vào lệnh biên dịch C++. Chịu sự thay thế "Tạo biến"phân tích cú pháp Bourne shell.

Mỗi chuỗi trong thuộc tính này được thêm theo thứ tự đã cho vào COPTS trước khi biên dịch đích nhị phân. Các 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ề các tệp tiêu đề được đưa vào ở nơi khác. Tất cả các đường dẫn phải tương ứng với không gian làm việc, chứ không phải với gói hiện tại.

Nếu gói khai báo feature no_copts_tokenization, thì quá trình mã hoá thành mã thông báo Bourne shell chỉ áp dụng cho các chuỗi bao gồm một biến "Make" duy nhất.

defines

Danh sách các 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ỳ thuộc vào việc thay thế biến"Make"phân tích cú pháp Bourne shell. Mỗi chuỗi (phải bao gồm một mã thông báo Bourne shell duy nhất) sẽ được thêm tiền tố -D và được thêm vào dòng lệnh biên dịch cho mục tiêu này, cũng như cho mọi quy tắc phụ thuộc vào mục tiêu đó. Hãy hết sức thận trọng vì điều này có thể gây ra những ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm các giá trị xác định 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à mục tiêu thư viện phụ thuộc vào. Không giống như deps, các tiêu đề và đường dẫn bao gồm của các thư viện này (và tất cả các deps bắc cầu của chúng) 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 này. 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 bị 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ố cần thêm vào đường dẫn của tiêu đề trong quy tắc này.

Khi được đặt, 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 tiền tố này được thêm vào.

includes

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

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

Chịu sự thay thế "Tạo biến". Mỗi chuỗi được thêm tiền tố -isystem và được thêm vào COPTS. Không giống như COPTS, các 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 này. (Lưu ý: không phải là các quy tắc mà nó phụ thuộc vào!) Hãy hết sức thận trọng vì điều này có thể gây ra những ả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 srcs hoặc hdrs, nếu không, các tiêu đề này sẽ không có sẵn cho các quy tắc phụ thuộc khi quá trình biên dịch được giới hạn trong hộp cát (theo mặc định).

linkopts

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

Thêm các cờ này vào lệnh của trình liên kết C++. Tuỳ thuộc vào việc thay thế biến"Make", phân tích cú pháp Bourne shellmở 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ử trong danh sách này không bắt đầu bằng $ hoặc - được giả định 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 lựa chọn của trình liên kết. Một lỗi sẽ được báo cáo 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++ đã chỉ định vào tệp nhị phân cuối cùng. Thủ thuật này là cần thiết để đưa thông tin dấu thời gian vào các tệp nhị phân; nếu chúng ta biên dịch tệp nguồn thành tệp đối tượng theo cách thông thường, 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ỳ tập hợp cờ trình biên dịch cụ thể nào và do đó, không nên phụ thuộc vào bất kỳ tiêu đề, lựa chọn trình biên dịch hoặc biến bản dựng cụ thể nào. Bạn chỉ cần lựa 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 thiết bị còn lại.

Nếu được bật và đây là một tệp nhị phân hoặc thử nghiệm, thì lựa chọn này sẽ yêu cầu công cụ tạo liên kết trong .a thay vì .so cho các 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 một cách linh động, cũng như các thư viện không có thư viện tĩnh. Do đó, tệp thực thi kết quả vẫn sẽ được liên kết động, do đó chỉ hầu hết là tĩnh.

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

  • STATIC có tính năng fully_static_link, trong đó mọi thứ đều được liên kết 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 đều được liên kết tĩnh (nếu có phiên bản tĩnh), nhưng các thư viện hệ thống (không bao gồm 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".
    Chế độ này được bật bằng cách chỉ định linkstatic=True.
  • DYNAMIC, trong đó tất cả các thư viện đều được liên kết một cách linh động (nếu có phiên bản linh độ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 có ý nghĩa khác nếu được dùng theo quy tắc cc_library(). Đối với một thư viện C++, linkstatic=True cho biết rằng chỉ được 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 linkstatic=False, thì công cụ tạo bản 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 khu vực *.runfiles.

local_defines

Danh sách các 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ỳ thuộc vào việc thay thế biến"Make"phân tích cú pháp Bourne shell. Mỗi chuỗi (phải bao gồm một mã thông báo Bourne shell duy nhất) được thêm tiền tố -D và được 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 mục tiêu phụ thuộc của mục tiêu này.
nocopts

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

Xoá các lựa chọn trùng khớp khỏi lệnh biên dịch C++. Có thể thay thế bằng biến "Make" (Thực hiện). Giá trị của thuộc tính này được diễn giải dưới dạng một biểu thức chính quy. Mọi COPTS hiện có 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 cho mục đích biên dịch quy tắc này. Bạn hiếm khi cần đến thuộc tính này.
strip_include_prefix

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

Tiền tố cần loại bỏ khỏi đường dẫn của tiêu đề trong quy tắc này.

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

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

Tiền tố trong thuộc tính include_prefix được thêm vào sau khi tiền tố này bị loại bỏ.

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ác nguồn trong các quy tắc phụ thuộc đưa vào dưới dạng văn bản.

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

win_def_file

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

Tệp DEF của Windows sẽ đượ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 tuỳ chọn này để xuất các biểu tượng trong quá trình liên kết một thư viện dùng chung.

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 riêng 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)

Thao tác này tạo ra 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ụ foo_shared liên kết tĩnh foobaz, baz là phần phụ thuộc bắc cầu. Thư viện này không liên kết bar vì thư viện này đã được dynamic_dep bar_shared cung cấp linh hoạt.

foo_shared sử dụng tệp *.lds của tập lệnh trình liên kết để kiểm soát những biểu tượng cần được xuất. Logic quy tắc cc_shared_library không kiểm soát những biểu tượng nào được xuất, mà chỉ sử dụng những gì được giả định là được 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à đã xuất. Do đó, trong quá trình phân tích, Bazel giả định rằng foo đang được foo_shared xuất. baz không được giả định là do foo_shared xuất. Mọi mục tiêu được exports_filter so khớp cũng được giả định là đã xuất.

Mỗi cc_library trong ví dụ chỉ được xuất hiện tối đa trong một cc_shared_library. Nếu muốn liên kết baz vào 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 sẽ có tên là 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ột mục tiêu có 2 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 các thư viện được xuất trong 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 có 2 phần phụ thuộc cc_shared_library khác nhau liên kết cùng một mục tiêu một cách tĩnh. Tương tự như lỗi khi xuất.

Một cách để khắc phục vấn đề này là ngừng liên kết thư viện vào 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 với thư viện đó cần xuất thư viện để thư viện không liên kết với thư viện đó vẫn có thể nhìn thấy các biểu tượng. Một cách khác là trích xuất một thư viện thứ ba xuất mục tiêu. Cách thứ ba là gắn thẻ cc_library gây ra vấn đề bằng LINKABLE_MORE_THAN_ONCE nhưng bạn hiếm khi cần dùng cách khắc phục này và bạn phải hoàn toàn chắc chắn rằng 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`

Điều này có nghĩa là một thư viện trong bao đóng bắc cầu của deps có thể truy cập được mà không cần thông qua một trong các phần phụ thuộc cc_shared_library nhưng đã được liên kết vào một cc_shared_library khác trong dynamic_deps và không được xuất.

Giải pháp là xuất thành phần đó từ phần phụ thuộc cc_shared_library hoặc kéo phần phụ thuộc cc_shared_library thứ ba xuất thành phần đó ra.

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

Nếu có một thư viện động được biên dịch trước, thì bạn không cần và không thể liên kết tĩnh thư viện này vào mục tiêu cc_shared_library hiện tại mà bạn đang tạo. Do đó, nó không thuộc deps của cc_shared_library. Nếu thư viện động được biên dịch sẵn này là một phần phụ thuộc của một trong các cc_libraries, 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 theo quy tắc hiện tại, bạn đang yêu cầu xuất một mục tiêu đã được xuất bởi một trong các phần phụ thuộc động của bạn.

Để khắc phục vấn đề này, hãy xoá mục tiêu khỏi deps và chỉ 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 mục tiêu này.

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng 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ào thư viện dùng chung sau khi được lưu trữ toàn bộ.

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

Trong quá trình phân tích, quá trình triển khai quy tắc sẽ coi mọi mục tiêu được liệt kê trong deps là do thư viện dùng chung xuất để đưa ra lỗi khi nhiều cc_shared_libraries xuất cùng một mục tiêu. Việc triển khai quy tắc không đảm bảo việc thông báo cho trình liên kết về những biểu tượng mà đối tượng dùng chung sẽ xuất. Người dùng nên xử lý việc này thông qua các tập lệnh liên kết hoặc khai báo khả năng 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 bằng cách liệt kê "cc_library" dưới dạng một mục xuất của một trong các thư viện dùng chung để có thể tạo dynamic_dep cho thư viện còn lại.

additional_linker_inputs

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

Mọi tệp bổ sung mà bạn có thể muốn truyền đến trình liên kết, chẳng hạn như 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 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.

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

exports_filter

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

Thuộc tính này chứa danh sách các mục tiêu được khai báo là do thư viện dùng chung hiện tại xuất.

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

Xin lưu ý rằng thuộc tính này không thực sự thêm một cạnh phụ thuộc vào các mục tiêu đó, thay vào đó, cạnh phụ thuộc phải được tạo bởi deps.Các mục trong thuộc tính này chỉ là các chuỗi. Xin lưu ý rằng khi đặt một mục tiêu trong thuộc tính này, điều này được coi là một tuyên bố 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 thực sự không xử lý việc cho trình liên kết biết những biểu tượng nào sẽ đượ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ẽ dùng tên cho tệp đầu ra của thư viện dùng chung dựa trên tên và nền tảng của mục tiêu. Tên này 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 dùng tên mặc định, chẳng hạn như khi tải các thư viện dùng chung 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ể dùng thuộc tính này để chọn tên tuỳ chỉnh.

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

Mọi cờ bổ sung mà bạn có thể muốn truyền đến trình liên kết. Ví dụ: để trình liên kết nhận biết một tập lệnh liên kết được truyền qua additional_linker_inputs, bạn có thể sử dụng 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 DEF của Windows sẽ đượ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 tuỳ chọn này để xuất biểu tượng trong quá trình liên kết một thư viện dùng chung.

cc_static_library

Xem nguồn quy tắc
cc_static_library(name, deps, tags)
Tạo một thư viện tĩnh từ danh sách các mục tiêu và các phần phụ thuộc bắc cầu của chúng.

Thư viện tĩnh kết quả chứa các tệp đối tượng của những mục tiêu được liệt kê trong deps cũng như các phần phụ thuộc bắc cầu của chúng, trong đó các đối tượng PIC được ưu tiên.

Nhóm đầu ra

linkdeps

Một tệp văn bản chứa nhãn của những phần phụ thuộc bắc cầu của các mục tiêu được liệt kê trong deps không đóng góp bất kỳ tệp đối tượng nào cho thư viện tĩnh, nhưng cung cấp ít nhất một thư viện tĩnh, động hoặc giao diện. Thư viện tĩnh thu được có thể yêu cầu các thư viện này phải có sẵn tại thời điểm liên kết.

linkopts

Một tệp văn bản chứa linkopts do người dùng cung cấp của tất cả các phần phụ thuộc bắc cầu của các mục tiêu có trong deps.

Ký hiệu trùng lặp

Theo mặc định, quy tắc cc_static_library sẽ kiểm tra để đảm bảo thư viện tĩnh kết quả không chứa bất kỳ biểu tượng trùng lặp nào. Nếu có, bản dựng sẽ không thành công và xuất hiện thông báo lỗi liệt kê các biểu tượng trùng lặp và tệp đối tượng chứa các biểu tượng đó.

Bạn có thể tắt chế độ kiểm tra này cho mỗi mục tiêu hoặc mỗi gói bằng cách đặt features = ["-symbol_check"] hoặc trên toàn cục thông qua --features=-symbol_check.

Hỗ trợ chuỗi công cụ cho symbol_check

Các chuỗi công cụ C++ được định cấu hình tự động đi kèm với Bazel hỗ trợ tính năng symbol_check trên mọi nền tảng. Chuỗi công cụ tuỳ chỉnh có thể thêm hỗ trợ cho chuỗi công cụ đó theo một trong hai cách:

  • Triển khai thao tác ACTION_NAMES.validate_static_library và bật thao tác này bằng tính năng symbol_check. Tập hợp công cụ trong thao tác được gọi bằng 2 đối số, thư viện tĩnh để kiểm tra các biểu tượng trùng lặp và đường dẫn của một tệp phải được tạo nếu quá trình kiểm tra thành công.
  • Tính năng symbol_check có thêm các cờ lưu trữ khiến thao tác tạo thư viện tĩnh không thành công trên các biểu tượng trùng lặp.

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.

deps

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

Danh sách các mục tiêu cần kết hợp thành một thư viện tĩnh, bao gồm tất cả các phần phụ thuộc chuyển đổi của chúng.

Các phần phụ thuộc không cung cấp bất kỳ tệp đối tượng nào sẽ không được đưa vào thư viện tĩnh, nhưng nhãn của các phần phụ thuộc đó sẽ được thu thập trong tệp do nhóm đầu ra linkdeps cung cấp.

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)

Biểu thị một hồ sơ gợi ý tìm nạp trước FDO 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ụ:

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 riêng 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 một quy tắc fdo_absolute_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 hồ sơ FDO 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ụ:

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 riêng 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ó thể 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 ra hồ sơ đó. Tệp FDO có thể có một trong các phần mở rộng 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 này cũng có thể trỏ đến một quy tắc fdo_absolute_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 hồ sơ 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 riêng 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ơ MEMPROF. Tệp chỉ có thể 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 hồ sơ MEMPROF. Hồ sơ dự kiến sẽ có đuôi .profdata (đối với hồ sơ memprof được lập chỉ mục/biểu thị bằng ký hiệu) hoặc đuôi .zip đối với tệp zip chứa tệp memprof.profdata. Nhãn này cũng có thể trỏ đến một quy tắc fdo_absolute_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 riêng cho mục tiêu này.

ld_profile

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

Nhãn của trang doanh nghiệp được truyền đến thao tác liên kết. Tệp này có đuôi .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 riêng 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 sẽ được liên kết vào 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 các tệp C và C++ được xử lý để tạo mục tiêu. Đây là các tệp nguồn và tệp tiêu đề C/C++, không được tạo (mã nguồn thông thường) hoặc được tạo.

Tất cả cá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ên nằm trong outs của một 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ó sẵn để các nguồn trong quy tắc này đưa vào. Cả tệp .cc.h đều có thể trực tiếp bao gồm các tiêu đề có trong srcs hoặc trong hdrs của bất kỳ quy tắc nào có trong đối số deps.

Tất cả các tệp #include đều 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 cc_library() được tham chiếu. Kiểu được đề xuất là các tiêu đề được liên kết với một 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 được 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 phần "Kiểm tra việc đưa tiêu đề vào" để 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ì chúng sẽ được biên dịch thành quy tắc này; nếu là tệp thư viện, thì chúng sẽ được liên kết.

Các loại tệp srcs được cho 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
  • Trình hợp ngữ có trình 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 dùng chung, có phiên bản hoặc không có phiên bản: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

...và mọi quy tắc tạo ra những tệp đó. Các đuôi 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 đến lệnh trình liên kết C++.

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

copts

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

Thêm các lựa chọn này vào lệnh biên dịch C++. Chịu sự thay thế "Tạo biến"phân tích cú pháp Bourne shell.

Mỗi chuỗi trong thuộc tính này được thêm theo thứ tự đã cho vào COPTS trước khi biên dịch đích nhị phân. Các 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ề các tệp tiêu đề được đưa vào ở nơi khác. Tất cả các đường dẫn phải tương ứng với không gian làm việc, chứ không phải với gói hiện tại.

Nếu gói khai báo feature no_copts_tokenization, thì quá trình mã hoá thành mã thông báo Bourne shell chỉ áp dụng cho các chuỗi bao gồm một biến "Make" duy nhất.

defines

Danh sách các 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ỳ thuộc vào việc thay thế biến"Make"phân tích cú pháp Bourne shell. Mỗi chuỗi (phải bao gồm một mã thông báo Bourne shell duy nhất) sẽ được thêm tiền tố -D và được thêm vào dòng lệnh biên dịch cho mục tiêu này, cũng như cho mọi quy tắc phụ thuộc vào mục tiêu đó. Hãy hết sức thận trọng vì điều này có thể gây ra những ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm các giá trị xác định vào local_defines.
includes

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

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

Chịu sự thay thế "Tạo biến". Mỗi chuỗi được thêm tiền tố -isystem và được thêm vào COPTS. Không giống như COPTS, các 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 này. (Lưu ý: không phải là các quy tắc mà nó phụ thuộc vào!) Hãy hết sức thận trọng vì điều này có thể gây ra những ả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 srcs hoặc hdrs, nếu không, các tiêu đề này sẽ không có sẵn cho các quy tắc phụ thuộc khi quá trình biên dịch được giới hạn trong hộp cát (theo 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 các 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, theo mặc định phụ thuộc vào cờ nhãn //tools/cpp:link_extra_libs. Nếu không đặt cờ, 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ư ghi đè cho các biểu tượng yếu, các trình chặn cho các hàm thư viện dùng chung hoặc cá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 các chuỗi; mặc định là []

Thêm các cờ này vào lệnh của trình liên kết C++. Tuỳ thuộc vào việc thay thế biến"Make", phân tích cú pháp Bourne shellmở 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ử trong danh sách này không bắt đầu bằng $ hoặc - được giả định 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 lựa chọn của trình liên kết. Một lỗi sẽ được báo cáo 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 thiết bị còn lại.

Nếu được bật và đây là một tệp nhị phân hoặc thử nghiệm, thì lựa chọn này sẽ yêu cầu công cụ tạo liên kết trong .a thay vì .so cho các 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 một cách linh động, cũng như các thư viện không có thư viện tĩnh. Do đó, tệp thực thi kết quả vẫn sẽ được liên kết động, do đó chỉ hầu hết là tĩnh.

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

  • STATIC có tính năng fully_static_link, trong đó mọi thứ đều được liên kết 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 đều được liên kết tĩnh (nếu có phiên bản tĩnh), nhưng các thư viện hệ thống (không bao gồm 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".
    Chế độ này được bật bằng cách chỉ định linkstatic=True.
  • DYNAMIC, trong đó tất cả các thư viện đều được liên kết một cách linh động (nếu có phiên bản linh độ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 có ý nghĩa khác nếu được dùng theo quy tắc cc_library(). Đối với một thư viện C++, linkstatic=True cho biết rằng chỉ được 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 linkstatic=False, thì công cụ tạo bản 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 khu vực *.runfiles.

local_defines

Danh sách các 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ỳ thuộc vào việc thay thế biến"Make"phân tích cú pháp Bourne shell. Mỗi chuỗi (phải bao gồm một mã thông báo Bourne shell duy nhất) được thêm tiền tố -D và được 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 mục tiêu phụ thuộc của mục tiêu này.
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ẽ sử dụng libc malloc. Nhãn này phải đề cập đến một cc_library. Nếu quá trình biên dịch là cho một quy tắc không phải C++, thì lựa 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 lựa chọn trùng khớp khỏi lệnh biên dịch C++. Có thể thay thế bằng biến "Make" (Thực hiện). Giá trị của thuộc tính này được diễn giải dưới dạng một biểu thức chính quy. Mọi COPTS hiện có 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 cho mục đích biên dịch quy tắc này. Bạn hiếm khi cần đến thuộc tính này.
stamp

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

Có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Các giá trị có thể sử dụng là:
  • 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ể loại bỏ tính năng lưu vào bộ nhớ đệm từ xa cho tệp nhị phân và mọi thao tác tiếp theo 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 vào bộ nhớ đệm kết quả của bản dựng một cách hiệu quả.
  • stamp = -1: Việc nhúng thông tin bản dựng được kiểm soát bằng cờ --[no]stamp.

Các tệp nhị phân được đóng dấu sẽ 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 DEF của Windows sẽ đượ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 tuỳ chọn này để xuất các biểu tượng trong quá trình liên kết một thư viện dùng chung.

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á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 globbing 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 nhà cung cấp CcToolchainConfigInfo (xem thông tin chi tiết bên dưới).

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

Sử dụng tags = ["manual"] để ngăn các chuỗi công cụ được tạo và định cấu hình 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 riêng cho mục tiêu này.

all_files

Nhãn; bắt buộc

Tập hợp tất cả cá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ả các thao tác liên quan đến rules_cc (ngoại trừ những thao tác đang sử dụng các tập hợp 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à một siêu tập hợp của tất cả các thuộc tính cung cấp cấu phần phần mềm khác (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, vì vậy, quá trình này sẽ lấy all_files).

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

ar_files

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

Tập hợp tất cả các cấu phần phần mềm cc_toolchain cần thiết cho các thao tác lưu trữ.

as_files

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

Tập hợp tất cả các cấu phần phần mềm cc_toolchain cần thiết cho các thao tác lắp ráp.

compiler_files

Nhãn; bắt buộc

Tập hợp tất cả cá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

Tập hợp tất cả cá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 được hỗ trợ tính năng khám phá dữ liệu đầu vào (hiện chỉ có Google).
coverage_files

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

Tập hợp tất cả các cấu phần phần mềm cc_toolchain cần thiết cho các thao tác về mức độ phù hợp. Nếu bạn không chỉ định, thì tất cả các tệp sẽ được dùng.
dwp_files

Nhãn; bắt buộc

Tập hợp tất cả cá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).

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

exec_transition_for_inputs

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

Đặt thành True để tạo tất cả các tệp đầu vào cho cc_toolchain cho nền tảng exec, thay vì không có quá trình 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ác 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 thao tác.
linker_files

Nhãn; bắt buộc

Tập hợp tất cả cá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 theo mô-đun.
objcopy_files

Nhãn; bắt buộc

Tập hợp tất cả cá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).

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

strip_files

Nhãn; bắt buộc

Tập hợp tất cả các cấu phần phần mềm cc_toolchain cần thiết cho các thao tác xoá.
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 tệp tham số cho các thao tác 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; 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, đây là cách bạn nên dùng để 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 bộ sưu tậ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ả cá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 lựa chọn --cpu--compiler được truyền đến Bazel.

Bạn cũng có thể xem trang này để biết tài liệu chi tiết về cấu hình chuỗi công cụ C++ và lựa chọn chuỗi công cụ.

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng 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 truyền đến Bazel và "<cpu>|<compiler>" sẽ được dùng khi cả --cpu--compiler đều đượ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",
            },
          )