Quy tắc C / C++

Quy tắc

cc_binary

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, 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): 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 --stripopt=-foo. Kết quả này chỉ được tạo khi có 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 bật tính năng Phân hạch: 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

Name; required

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

deps

List of labels; optional

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

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

srcs

List of labels; optional

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 tiêu đề và tệp nguồn C/C++, có thể không được tạo (mã nguồn thông thường) hoặ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 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ó sẵn để đưa vào theo các nguồn trong quy tắc này. Cả tệp .cc.h đều có thể trực tiếp bao gồm các 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.

Mọi tệp #included 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 đề xuất là 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. 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à các 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 này sẽ được liên kết.

Các loại tệp srcs được phép:

  • Các 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 kết 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 được 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 phần mở rộng 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

List of labels; optional

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 đích nhị phân.

copts

List of strings; optional

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

Mỗi chuỗi trong thuộc tính này được thêm vào COPTS theo thứ tự nhất định trước khi biên dịch mục tiêu nhị phân. Các cờ này chỉ có hiệu lực để 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 đề nằm ở nơi khác. Tất cả đường dẫn phải tương ứng với 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ì hoạt động mã hoá shell Bourne chỉ áp dụng cho các chuỗi chứa một biến "Make" duy nhất.

defines

List of strings; optional

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

List of strings; optional

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

Phải thay thế "Tạo biến". Mỗi chuỗi sẽ đượ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 các quy tắc mà nó phụ thuộc vào!) Hãy hết sức cẩn trọng vì việc này có thể gây ra những ảnh hưởng rất lớn. Khi không chắc chắn, hãy thêm cờ "-I" vào COPTS.

Bạn phải thêm tiêu đề vào srcs hoặc hdr, nếu không, các tiêu đề sẽ không xuất hiện cho các quy tắc phụ thuộc khi biên dịch được đặt trong hộp cát (mặc định).

linkopts

List of strings; optional

Thêm các cờ này vào lệnh trình liên kết C++. Có thể thay thế biến"Make", mã hoá 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 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 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; optional; nonconfigurable; default is 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 được 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 xảy ra với cờ -shared với gcc và thư viện chia sẻ kết quả phù hợp để tải vào, ví dụ như một chương trình Java. Tuy nhiên, để phục vụ cho mục đích xây dựng, mã này sẽ không bao giờ được liên kết với tệp nhị phân phụ thuộc, vì mặc đị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 thủ công. Vì vậy, tệp này không nên được coi là giải pháp thay thế cho quy tắc cc_library. Để có thể mở rộng, bạn nên tránh hoàn toàn phương pháp này và chỉ nê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ẽ có một đơn vị hoàn toàn độc lập. Nếu chỉ định cả linkstatic=Truelinkshared=True, bạn sẽ có một đơn vị duy nhất, hầu hết độc lập.

linkstatic

Boolean; optional; default is True

Đối với cc_binarycc_test: hãy 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 sẽ bật đối với cc_binary và tắt đối với các ứng dụng còn lại.

Nếu được bật và đây là một tệp nhị phân hoặc kiểm thử, tuỳ chọn này sẽ yêu cầu công cụ xây dựng liên kết trong .a thay vì .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 có thể vẫn đượ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 sẽ vẫn được liên kết động, do đó chỉ chủ yếu ở dạng tĩnh.

Thực ra, có ba cách để liên kết một tệp thực thi:

  • THỐNG KÊ với tính năng đường liên kết hoàn_tĩnh, trong đó mọi thứ được liên kết tĩnh; ví dụ: "gcc -static foo.o libbar.a libbaz.a -lm".
    Bạn có thể bật chế độ này bằng cách chỉ định fully_static_link trong thuộc tính features.
  • THỐNG KÊ, 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 trong trường hợp 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.
  • LINH ĐỘNG, trong đó tất cả cá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 còn có ý nghĩa khác nếu được sử dụng trong quy tắc cc_library(). Đối với thư viện C++, linkstatic=True cho biết rằng 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, công cụ 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

List of strings; optional

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Có thể thay thế biến"Make"mã thông báo shell shell. Mỗi chuỗi (phải bao gồm một mã thông báo shell Bourne) đượ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 của mục tiêu này.
malloc

Label; optional; default is @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 cuối cùng sử dụng libc malloc. Nhãn này phải tham chiếu đến cc_library. Nếu quá trình biên dịch 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

String; optional

Xoá tuỳ chọn so khớp khỏi lệnh biên dịch C++. Phải thay thế biến"Make". Giá trị của thuộc tính này được hiểu là một 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

Integer; optional; default is -1

Liệu có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Có thể là những giá trị sau đây:
  • 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 sử dụng chế độ cài đặt này, vì chế độ cài đặt này có thể tắt hoạt động lưu vào bộ nhớ đệm từ xa đối với tệp nhị phân và mọi thao tác xuôi dòng phụ thuộc vào chế độ cài đặt này.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị không đổi. Chức năng này lưu kết quả bản dựng vào bộ nhớ đệm tốt.
  • stamp = -1: Việc nhúng thông tin bản dựng chịu sự kiểm soát của cờ --[no]stamp.

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

win_def_file

Label; optional

Tệp Windows DEF cần được chuyển tới trình liên kết.

Bạn chỉ nên 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 tệp này để xuất các biểu tượng trong quá trình liên kết thư viện chia sẻ.

cc_import

cc_import(name, 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 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 a 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,
)

Đối số

Thuộc tính
name

Name; required

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

hdrs

List of labels; optional

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

Boolean; optional; default is 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 sẵn 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 các ký hiệu mà tệp nhị phân tham chiếu. Điều này sẽ hữu ích nếu mã của bạn 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 một số dịch vụ cung cấp.

Nếu đường liên kết luôn không hoạt động với VS 2017 trên Windows, 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

Label; optional

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

Label; optional

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

Label; optional

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; optional; default is False

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

cc_library

cc_library(name, deps, srcs, data, hdrs, 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 tiêu đề vào

Mọi tệp tiêu đề dùng trong bản dựng đều phải được khai báo trong hdrs hoặc srcs của 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, có thể được đưa trực tiếp vào cả các tệp trong hdrssrcs trong 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. Bạn chỉ được đưa trực tiếp các 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 muốn người dùng sử dụng thư viện này có thể trực tiếp đưa tiêu đề vào hay không. Đây là quyết định gần 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 để xuất nên cũng không có thuộc tính hdrs. Tất cả tiêu đề thuộc tệp nhị phân hoặc tệp 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"],
)

Trong ví dụ này, các trang tham gia trực tiếp được phép sử dụng được liệt kê trong bảng dưới đây. Ví dụ: foo.cc được phép trực tiếp thêm foo.hbar.h, nhưng không được phép trực tiếp thêm baz.h.

Đang bao gồm tệpBao gồm được phép
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-hệ.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 trang đưa vào trực tiếp. Trong ví dụ trên, foo.cc được phép đưa vào bar.h, có thể bao gồm baz.h, nhưng lại được phép đưa baz-impl.h vào. Về mặt kỹ thuật, việc biên dịch tệp .cc có thể bắc cầu mọi tệp tiêu đề trong hdrs hoặc srcs vào bất kỳ cc_library nào trong phần đó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, baz phải được thêm vào deps của foo.

Rất tiếc, Bazel hiện không thể phân biệt được bao gồm trực tiếp và bắc cầu, vì vậy, không thể phát hiện các trường hợp lỗi trong đó một tệp trực tiếp chứa một tiêu đề chỉ được phép đưa vào theo cách bắc cầu. Ví dụ: Bazel sẽ không khiếu nại nếu trong ví dụ trên, foo.cc trực tiếp bao gồm baz.h. Điều này là bất hợp pháp vì foo không phụ thuộc trực tiếp vào baz. Hiện tại, không có lỗi nào được tạo ra trong trường hợp đó, nhưng hoạt động kiểm tra lỗi đó có thể sẽ được thêm vào trong tương lai.

Đối số

Thuộc tính
name

Name; required

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

deps

List of labels; optional

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

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

srcs

List of labels; optional

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 tiêu đề và tệp nguồn C/C++, có thể không được tạo (mã nguồn thông thường) hoặ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 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ó sẵn để đưa vào theo các nguồn trong quy tắc này. Cả tệp .cc.h đều có thể trực tiếp bao gồm các 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.

Mọi tệp #included 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 đề xuất là 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. 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à các 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 này sẽ được liên kết.

Các loại tệp srcs được phép:

  • Các 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 kết 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 được 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 phần mở rộng khác nhau biểu thị các ngôn ngữ lập trình khác nhau theo quy ước gcc.

hdrs

List of labels; optional

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

Đây là vị trí nên được ưu tiên để 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 để đưa vào theo 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 phải do ứng dụng của thư viện này đưa vào nên được liệt kê trong thuộc tính srcs, ngay cả khi chúng có trong tiêu đề đã xuất bản. 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.

Boolean; optional; default is 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 đều sẽ liên kết trong mọi 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 các ký hiệu mà tệp nhị phân tham chiếu. Điều này sẽ hữu ích nếu mã của bạn 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 một số dịch vụ cung cấp.

Nếu đường liên kết luôn không hoạt động với VS 2017 trên Windows, 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

List of strings; optional

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

Mỗi chuỗi trong thuộc tính này được thêm vào COPTS theo thứ tự nhất định trước khi biên dịch mục tiêu nhị phân. Các cờ này chỉ có hiệu lực để 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 đề nằm ở nơi khác. Tất cả đường dẫn phải tương ứng với 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ì hoạt động mã hoá shell Bourne chỉ áp dụng cho các chuỗi chứa một biến "Make" duy nhất.

defines

List of strings; optional

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

List of labels; optional

Danh sách các thư viện khác mà thư viện nhắm đến. Không giống như deps, tiêu đề và đường dẫn của những thư viện này (và mọi 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 và không dùng 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 những 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_library và được bảo vệ bằng cờ --experimental_cc_implementation_deps.

include_prefix

String; optional

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

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

List of strings; optional

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

Phải thay thế "Tạo biến". Mỗi chuỗi sẽ đượ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 các quy tắc mà nó phụ thuộc vào!) Hãy hết sức cẩn trọng vì việc này có thể gây ra những ảnh hưởng rất lớn. Khi không chắc chắn, hãy thêm cờ "-I" vào COPTS.

Bạn phải thêm tiêu đề vào srcs hoặc hdr, nếu không, các tiêu đề sẽ không xuất hiện cho các quy tắc phụ thuộc khi biên dịch được đặt trong hộp cát (mặc định).

linkopts

List of strings; optional

Thêm các cờ này vào lệnh trình liên kết C++. Có thể thay thế biến"Make", mã hoá 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 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 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

Label; optional

Đồ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à bắt buộc để đưa thông tin 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 vào 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. Một 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. Do đó, bạn 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 cụ thể nào khác. Tuỳ chọn này chỉ nên có trong gói base.
linkstatic

Boolean; optional; default is False

Đối với cc_binarycc_test: hãy 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 sẽ bật đối với cc_binary và tắt đối với các ứng dụng còn lại.

Nếu được bật và đây là một tệp nhị phân hoặc kiểm thử, tuỳ chọn này sẽ yêu cầu công cụ xây dựng liên kết trong .a thay vì .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 có thể vẫn đượ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 sẽ vẫn được liên kết động, do đó chỉ chủ yếu ở dạng tĩnh.

Thực ra, có ba cách để liên kết một tệp thực thi:

  • THỐNG KÊ với tính năng đường liên kết hoàn_tĩnh, trong đó mọi thứ được liên kết tĩnh; ví dụ: "gcc -static foo.o libbar.a libbaz.a -lm".
    Bạn có thể bật chế độ này bằng cách chỉ định fully_static_link trong thuộc tính features.
  • THỐNG KÊ, 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 trong trường hợp 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.
  • LINH ĐỘNG, trong đó tất cả cá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 còn có ý nghĩa khác nếu được sử dụng trong quy tắc cc_library(). Đối với thư viện C++, linkstatic=True cho biết rằng 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, công cụ 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

List of strings; optional

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Có thể thay thế biến"Make"mã thông báo shell shell. Mỗi chuỗi (phải bao gồm một mã thông báo shell Bourne) đượ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 của mục tiêu này.
nocopts

String; optional

Xoá tuỳ chọn so khớp khỏi lệnh biên dịch C++. Phải thay thế biến"Make". Giá trị của thuộc tính này được hiểu là một 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

String; optional

Tiền tố cần xoá khỏi đường dẫn của tiêu đề của 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 đường dẫn của chúng với tiền tố này bị cắt bỏ.

Nếu đó là đường dẫn tương đối, thì đường dẫn đó được xem là đường dẫn tương đối theo gói. Nếu đó là giá trị tuyệt đối, thì URL đó được hiểu là đường dẫn tương đối với 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ị xoá.

textual_hdrs

List of labels; optional

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

Đây là nơi để khai báo các tệp tiêu đề không thể tự biên dịch; nghĩa là chúng 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

Label; optional

Tệp Windows DEF cần được chuyển tới trình liên kết.

Bạn chỉ nên 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 tệp này để xuất các biểu tượng trong quá trình liên kết thư viện chia sẻ.

cc_proto_library

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 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

Name; required

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

deps

List of labels; optional

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

fdo_prefetch_hints

fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Đại diện cho 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 đườ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

Name; required

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

profile

Label; optional

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_absolute_path_profile.

fdo_profile

fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Đại diện cho hồ sơ FDO nằm trong không gian làm việc hoặc tại đườ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

Name; required

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

absolute_path_profile

String; optional

Đường dẫn tuyệt đối đến 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 một hồ sơ LLVM profraw hoặc .afdo cho hồ sơ AutoFDO.
profile

Label; optional

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 một hồ sơ LLVM profraw, .afdo cho hồ sơ AutoFDO, .xfdo cho hồ sơ XBinary. Nhãn này cũng có thể trỏ đến quy tắc fdo_absolute_path_profile.
proto_profile

Label; optional

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

propeller_optimize

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á Cánh quạt 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

Name; required

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

ld_profile

Label; optional

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

cc_test

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, 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

Name; required

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

deps

List of labels; optional

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

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

srcs

List of labels; optional

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 tiêu đề và tệp nguồn C/C++, có thể không được tạo (mã nguồn thông thường) hoặ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 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ó sẵn để đưa vào theo các nguồn trong quy tắc này. Cả tệp .cc.h đều có thể trực tiếp bao gồm các 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.

Mọi tệp #included 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 đề xuất là 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. 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à các 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 này sẽ được liên kết.

Các loại tệp srcs được phép:

  • Các 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 kết 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 được 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 phần mở rộng 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

List of labels; optional

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 đích nhị phân.

copts

List of strings; optional

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

Mỗi chuỗi trong thuộc tính này được thêm vào COPTS theo thứ tự nhất định trước khi biên dịch mục tiêu nhị phân. Các cờ này chỉ có hiệu lực để 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 đề nằm ở nơi khác. Tất cả đường dẫn phải tương ứng với 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ì hoạt động mã hoá shell Bourne chỉ áp dụng cho các chuỗi chứa một biến "Make" duy nhất.

defines

List of strings; optional

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

List of strings; optional

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

Phải thay thế "Tạo biến". Mỗi chuỗi sẽ đượ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 các quy tắc mà nó phụ thuộc vào!) Hãy hết sức cẩn trọng vì việc này có thể gây ra những ảnh hưởng rất lớn. Khi không chắc chắn, hãy thêm cờ "-I" vào COPTS.

Bạn phải thêm tiêu đề vào srcs hoặc hdr, nếu không, các tiêu đề sẽ không xuất hiện cho các quy tắc phụ thuộc khi biên dịch được đặt trong hộp cát (mặc định).

linkopts

List of strings; optional

Thêm các cờ này vào lệnh trình liên kết C++. Có thể thay thế biến"Make", mã hoá 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 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 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; optional; default is False

Đối với cc_binarycc_test: hãy 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 sẽ bật đối với cc_binary và tắt đối với các ứng dụng còn lại.

Nếu được bật và đây là một tệp nhị phân hoặc kiểm thử, tuỳ chọn này sẽ yêu cầu công cụ xây dựng liên kết trong .a thay vì .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 có thể vẫn đượ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 sẽ vẫn được liên kết động, do đó chỉ chủ yếu ở dạng tĩnh.

Thực ra, có ba cách để liên kết một tệp thực thi:

  • THỐNG KÊ với tính năng đường liên kết hoàn_tĩnh, trong đó mọi thứ được liên kết tĩnh; ví dụ: "gcc -static foo.o libbar.a libbaz.a -lm".
    Bạn có thể bật chế độ này bằng cách chỉ định fully_static_link trong thuộc tính features.
  • THỐNG KÊ, 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 trong trường hợp 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.
  • LINH ĐỘNG, trong đó tất cả cá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 còn có ý nghĩa khác nếu được sử dụng trong quy tắc cc_library(). Đối với thư viện C++, linkstatic=True cho biết rằng 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, công cụ 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

List of strings; optional

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Có thể thay thế biến"Make"mã thông báo shell shell. Mỗi chuỗi (phải bao gồm một mã thông báo shell Bourne) đượ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 của mục tiêu này.
malloc

Label; optional; default is @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 cuối cùng sử dụng libc malloc. Nhãn này phải tham chiếu đến cc_library. Nếu quá trình biên dịch 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

String; optional

Xoá tuỳ chọn so khớp khỏi lệnh biên dịch C++. Phải thay thế biến"Make". Giá trị của thuộc tính này được hiểu là một 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

Integer; optional; default is 0

Liệu có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Có thể là những giá trị sau đây:
  • 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 sử dụng chế độ cài đặt này, vì chế độ cài đặt này có thể tắt hoạt động lưu vào bộ nhớ đệm từ xa đối với tệp nhị phân và mọi thao tác xuôi dòng phụ thuộc vào chế độ cài đặt này.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị không đổi. Chức năng này lưu kết quả bản dựng vào bộ nhớ đệm tốt.
  • stamp = -1: Việc nhúng thông tin bản dựng chịu sự kiểm soát của cờ --[no]stamp.

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

win_def_file

Label; optional

Tệp Windows DEF cần được chuyển tới trình liên kết.

Bạn chỉ nên 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 tệp này để xuất các biểu tượng trong quá trình liên kết thư viện chia sẻ.

cc_toolchain

cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler, compiler_files, compiler_files_without_includes, coverage_files, cpu, 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 hành động C++. Việc này được thực hiện bởi 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 là các nhóm tệp phổ biến nhất, bao gồm tất cả các tệp bắt buộc.
  • Tạo dòng lệnh chính xác cho 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 (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++. Ngoài ra, hãy xem trang này để biết cấu hình chuỗi công cụ C++ và tài liệu lựa chọn chuỗi công cụ chi tiết.

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

Name; required

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

all_files

Label; required

Tập hợ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ả các hành động có liên quan đến rules_cc (ngoại trừ các hành động đ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 dưới đây). Bazel giả định rằng all_files là một tập mẹ 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ụ: việc biên dịch linkstamp cần cả tệp biên dịch lẫn tệp liên kết, vì vậy cần có all_files).

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

ar_files

Label; optional

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

as_files

Label; optional

Tập hợp tất cả cấu phần phần mềm cc_toolchain bắt buộc cho các thao tác tập hợp.

compiler

String; optional; nonconfigurable

Không dùng nữa. Thay vào đó, hãy dùng thuộc tính toolchain_identifier. Tính năng này sẽ bị xoá sau khi di chuyển CROSSTOOL sang Starlark và sẽ bị xoá vào #7075.

Khi được đặt, thuộc tính này sẽ được dùng để thực hiện lựa chọn crosstool_config.toolchain. Chế độ này sẽ được ưu tiên hơn lựa chọn --cpu Bazel.

compiler_files

Label; required

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

Label; optional

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

Label; optional

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

String; optional; nonconfigurable

Không dùng nữa. Thay vào đó, hãy sử dụng thuộc tính toolchain_identifier. Giá trị này sẽ bị xoá sau khi di chuyển CROSSTOOL sang Starlark và sẽ bị xoá vào #7075.

Khi được đặt, thuộc tính này sẽ được dùng để thực hiện lựa chọn crosstool_config.toolchain. Chế độ này sẽ được ưu tiên hơn lựa chọn --cpu Bazel.

dwp_files

Label; required

Tập hợp tất cả cấu phần phần mềm cc_toolchain bắt buộc cho các hành động dwp.
dynamic_runtime_lib

Label; optional

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).

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

exec_transition_for_inputs

Boolean; optional; default is True

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

Label; optional

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

Label; required

Tập hợp tất cả cấu phần phần mềm cc_toolchain bắt buộc để liên kết các hành động.
module_map

Label; optional

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

Label; required

Tập hợp tất cả cấu phần phần mềm cc_toolchain bắt buộc cho các hành động objcopy.
static_runtime_lib

Label; optional

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).

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

strip_files

Label; required

Tập hợp tất cả các cấu phần phần mềm cc_toolchain bắt buộc cho các thao tác loại bỏ.
supports_header_parsing

Boolean; optional; default is 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; optional; default is True

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

Label; required

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

String; optional; nonconfigurable

Giá trị nhận dạng dùng để so khớp chuỗi cc_toolchain này với chuỗ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

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.

Ngoài ra, hãy xem trang này để biết cấu hình chuỗi công cụ C++ và tài liệu lựa chọn chuỗi công cụ chi tiết.

Đối số

Thuộc tính
name

Name; required

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

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

Bản đồ liên kết từ các chuỗi "<cpu>" hoặc "<cpu>|<compiler>" đến một nhãn cc_toolchain. "<cpu>" sẽ được dùng khi chỉ truyền --cpu đế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",
            },
          )