Quy tắc C / C++

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

Quy tắc

cc_nhị phân

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, 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 bị loại bỏ của tệp nhị phân. strip -g được chạy trên hệ nhị phân để xoá các biểu tượng gỡ lỗi. Bạn có thể cung cấp các tuỳ chọn dải khác bổ sung trên dòng lệnh bằng --stripopt=-foo. Kết quả này chỉ được xây dựng nếu có yêu cầu rõ ràng.
  • name.dwp (chỉ được xây dựng 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. Khác: một tệp trống.

Đối số

Thuộc tính
name

Name; required

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

deps

List of labels; optional

Danh sách các thư viện khác sẽ đượ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 nguồn và tiêu đề C/C++ không được tạo (mã nguồn bình 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 tên nằm trong outs của một số quy tắc khác, quy tắc này sẽ tự động phụ thuộc vào quy tắc kia.

Tệp .h sẽ không được biên dịch nhưng vẫn có sẵn để đưa vào bởi 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 tiêu đề được liệt kê trong srcs này hoặc trong hdrs của bất kỳ quy tắc nào được liệt kê trong đối số deps.

Tất cả các 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 cc_library() được tham chiếu. Kiểu nên dùng là các tiêu đề 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 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 quy tắc đưa vào tiêu đề" để biết nội dung mô tả chi tiết hơn.

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

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

  • Tệp nguồn C và C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Tệp tiêu đề C và C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Bộ lắp rá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ẻ, được tạo phiên bản hoặc chưa đảo ngược: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

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

additional_linker_inputs

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 mục tiêu 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++. Tuỳ theo sự thay thế "Biến" và mã Bourne shell.

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

Nếu gói khai báo feature no_copts_tokenization, mã Bourne shell chỉ áp dụng cho các chuỗi chứa một biến "Make".

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. Tuỳ thuộc vào lựa chọn biến"Make"mã hoá shell Bourne. Mỗi chuỗi (phải bao gồm một mã shell Bourne) được thêm vào đầu -D và được thêm vào dòng lệnh biên dịch với mục tiêu này cũng như mọi quy tắc phụ thuộc vào đó. Hãy thật cẩn thận vì điều này có thể gây ảnh hưởng sâu rộng. Nếu không chắc chắn, hãy thêm giá trị xác định vào local_defines.
includes

List of strings; optional

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

Tuỳ thuộc vào sự thay thế "Biến". Mỗi chuỗi được thêm vào đầu -isystem và 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 đó. (Lưu ý: không phải các quy tắc phụ thuộc!) Hãy thật cẩn thận vì điều này có thể gây ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm cờ "-I" vào COPTS.

Bạn phải thêm tiêu đề vào src hoặc hdr, nếu không thì tiêu đề sẽ không có sẵ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++. Tuỳ thuộc vào lựa chọn biến"Biến", Mã hoá 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ử của danh sách này không bắt đầu bằng $ hoặc - sẽ đượ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 nối vào tuỳ chọn trình liên kết. Hệ thống sẽ bá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 bao gồm linkshared=True trong quy tắc của bạn. Theo mặc định, tuỳ chọn này được 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 đến gcc và thư viện chia sẻ kết quả phù hợp để tải vào, chẳng hạn như một chương trình Java. Tuy nhiên, vì mục đích xây dựng, tệp này sẽ không bao giờ được liên kết với tệp nhị phân phụ thuộc, vì các chương trình giả định rằng các thư viện dùng chung được xây dựng bằng quy tắc cc_binary sẽ chỉ được tải theo cách thủ công trong những chương trình khác. Vì vậy, bạn không nên xem thư viện đó là biện pháp thay thế cho quy tắc cc_library. Để có thể mở rộng quy mô, bạn nên tránh sử dụng phương pháp này hoàn toàn và chỉ cho phép java_library phụ thuộc vào cc_library quy tắc.

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 (chủ yếu là độc lập).

linkstatic

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

Tùy chọn này được bật theo mặc định cho cc_binary và tắt cho các mục còn lại.

Nếu được bật và ở dạng 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 vẫn có thể được liên kết động, cũng 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 tĩnh.

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

  • SỐ LIỆU THỐNG KÊ với tính năng liên kết đầy đủ tĩnh, trong đó mọi thứ đượ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.
  • SỐ LIỆU THỐNG KÊ, trong đó tất cả thư viện người dùng được liên kết tĩnh (nếu có phiên bản tĩnh), nhưng trong đó 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 động (nếu có sẵn 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ó ý nghĩa khác nếu được dùng trên 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 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 (symlink) cho 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. Tuỳ thuộc vào lựa chọn biến"Make"mã hoá shell Bourne. Mỗi chuỗi (phải bao gồm một mã shell Bourne) được thêm vào đầu -D và được thêm vào dòng lệnh biên dịch cho mục tiêu này, chứ không phải vào các phần phụ thuộc.
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, là một thư viện trống để tệp nhị phân có thể 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 một 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á các tuỳ chọn trùng khớp khỏi lệnh biên dịch C++. Tuỳ thuộc vào sự thay thế biến"Make". Giá trị của thuộc tính này được thể hiện dưới dạng cụm từ thông dụng. 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 để phục vụ mục đích biên dịch quy tắc này. Thuộc tính này ít khi cần thiết.
stamp

Integer; optional; default is -1

Xác định xem có mã hóa thông tin bản dựng thành tệp nhị phân hay không. Bạn có thể sử dụng các giá trị sau:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong các bản dựng --nostamp. Bạn nên tránh sử dụng tùy chọn cài đặt này vì tùy chọn này có thể tắt bộ nhớ đệm từ xa đối với tệp nhị phân và mọi hành động ở phần dưới phụ thuộc vào tệp đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị không đổi. Thao tác này sẽ giúp lưu kết quả vào bộ nhớ đệm một cách hiệu quả.
  • stamp = -1: Việc nhúng thông tin bản dựng sẽ do cờ --[no]stamp kiểm soát.

Các tệp nhị phân có nhãn đóng góp không được tạo lại trừ phi các phần phụ thuộc thay đổi.

win_def_file

Label; optional

Tệp Windows DEF sẽ được chuyể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 tệp 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_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)

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 thông thường:
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 chia sẻ
Trên Unix:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

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

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

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

# second will link to mylib.dll through mylib.lib
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
cc_import hỗ trợ một thuộc tính "include" (bao gồm). 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

Name; required

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

deps

List of labels; optional

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

List of labels; optional

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

Boolean; optional; default is False

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

Nếu tùy chọn Alwayslink không hoạt động với VS 2017 trên Windows, 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 dùng chung.

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 dùng chung được biên dịch trước. Bazel đảm bảo nó có sẵn cho tệp nhị phân phụ thuộc vào tệp đó 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ì nghĩa là thư viện đã chia sẻ cần có trong thời gian chạy do hệ thống cung cấp. Trong trường hợp này, bạn nên chỉ định interface_library và để trống shared_library.

cc_library

Xem nguồn quy tắc
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 bao gồm tiêu đề

Tất cả tệp tiêu đề dùng trong bản dựng đều phải khai báo trong quy tắc hdrs hoặc srcs của cc_*. Lệnh này được thực thi.

Đối với 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 từ cả 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 cc_* quy tắc liệt kê thư viện trong deps. Bạn chỉ được đưa trực tiếp tiêu đề vào srcs từ 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 của 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 với mức hiển thị từ public đến private 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, do đó, chúng cũng không có thuộc tính hdrs. Bạn phải liệt kê tất cả tiêu đề thuộc về tệp nhị phân hoặc chương trình kiểm thử trong srcs.

Để minh họa các quy tắc này, hãy xem ví dụ sau đây.

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"],
)

Bao gồm trực tiếp được phé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 bao gồm baz.h.

Bao gồm tệpBao gồm được phép
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

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

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

Đối số

Thuộc tính
name

Name; required

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

deps

List of labels; optional

Danh sách các thư viện khác sẽ đượ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 nguồn và tiêu đề C/C++ không được tạo (mã nguồn bình 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 tên nằm trong outs của một số quy tắc khác, quy tắc này sẽ tự động phụ thuộc vào quy tắc kia.

Tệp .h sẽ không được biên dịch nhưng vẫn có sẵn để đưa vào bởi 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 tiêu đề được liệt kê trong srcs này hoặc trong hdrs của bất kỳ quy tắc nào được liệt kê trong đối số deps.

Tất cả các 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 cc_library() được tham chiếu. Kiểu nên dùng là các tiêu đề 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 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 quy tắc đưa vào tiêu đề" để biết nội dung mô tả chi tiết hơn.

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

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

  • Tệp nguồn C và C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Tệp tiêu đề C và C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Bộ lắp rá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ẻ, được tạo phiên bản hoặc chưa đảo ngược: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

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

hdrs

List of labels; optional

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

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

Boolean; optional; default is False

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

Nếu tùy chọn Alwayslink không hoạt động với VS 2017 trên Windows, 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++. Tuỳ theo sự thay thế "Biến" và mã Bourne shell.

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

Nếu gói khai báo feature no_copts_tokenization, mã Bourne shell chỉ áp dụng cho các chuỗi chứa một biến "Make".

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. Tuỳ thuộc vào lựa chọn biến"Make"mã hoá shell Bourne. Mỗi chuỗi (phải bao gồm một mã shell Bourne) được thêm vào đầu -D và được thêm vào dòng lệnh biên dịch với mục tiêu này cũng như mọi quy tắc phụ thuộc vào đó. Hãy thật cẩn thận vì điều này có thể gây ảnh hưởng sâu rộng. Nếu không chắc chắn, hãy thêm 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 mục tiêu phụ thuộc. 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 phần phụ thuộc 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 đó. Các thư viện được chỉ định bằng implementation_deps vẫn được liên kết trong các mục tiêu nhị phân phụ thuộc vào thư viện này.

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

include_prefix

String; optional

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

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

Tuỳ thuộc vào sự thay thế "Biến". Mỗi chuỗi được thêm vào đầu -isystem và 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 đó. (Lưu ý: không phải các quy tắc phụ thuộc!) Hãy thật cẩn thận vì điều này có thể gây ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm cờ "-I" vào COPTS.

Bạn phải thêm tiêu đề vào src hoặc hdr, nếu không thì tiêu đề sẽ không có sẵ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++. Tuỳ thuộc vào lựa chọn biến"Biến", Mã hoá 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ử của danh sách này không bắt đầu bằng $ hoặc - sẽ đượ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 nối vào tuỳ chọn trình liên kết. Hệ thống sẽ bá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

Biên dịch đồng thời và liên kết tệp nguồn C++ được chỉ định thành tệp nhị phân cuối cùng. Cần có thủ thuật này để đư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 một tệp đối tượng theo cách thông thường, thì dấu thời gian đó sẽ không chính xác. Một quy trình biên dịch tem liên kết có thể không bao gồm bất kỳ bộ cờ trình biên dịch cụ thể nào, vì vậy, không nên phụ thuộc vào bất kỳ tiêu đề, tùy chọn trình biên dịch cụ thể nào hoặc biến thể bản dựng khác. Chỉ cần tuỳ chọn này trong gói base.
linkstatic

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

Tùy chọn này được bật theo mặc định cho cc_binary và tắt cho các mục còn lại.

Nếu được bật và ở dạng 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 vẫn có thể được liên kết động, cũng 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 tĩnh.

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

  • SỐ LIỆU THỐNG KÊ với tính năng liên kết đầy đủ tĩnh, trong đó mọi thứ đượ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.
  • SỐ LIỆU THỐNG KÊ, trong đó tất cả thư viện người dùng được liên kết tĩnh (nếu có phiên bản tĩnh), nhưng trong đó 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 động (nếu có sẵn 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ó ý nghĩa khác nếu được dùng trên 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 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 (symlink) cho 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. Tuỳ thuộc vào lựa chọn biến"Make"mã hoá shell Bourne. Mỗi chuỗi (phải bao gồm một mã shell Bourne) được thêm vào đầu -D và được thêm vào dòng lệnh biên dịch cho mục tiêu này, chứ không phải vào các phần phụ thuộc.
nocopts

String; optional

Xoá các tuỳ chọn trùng khớp khỏi lệnh biên dịch C++. Tuỳ thuộc vào sự thay thế biến"Make". Giá trị của thuộc tính này được thể hiện dưới dạng cụm từ thông dụng. 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 để phục vụ mục đích biên dịch quy tắc này. Thuộc tính này ít khi cần thiết.
strip_include_prefix

String; optional

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

Khi bạn đặ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 các tiêu đề đó.

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

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

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 để bao gồm văn bản của các nguồn trong các quy tắc phụ thuộc.

Đây là vị trí để 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 sẽ được chuyể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 tệp 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_protolibrary

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ừ .proto tệp.

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

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 duy nhất 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++.

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 sẽ 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, phần sau là phần phụ thuộc bắc cầu. Hàm này không liên kết bar vì đã được dynamic_dep bar_shared cung cấp động.

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

Mỗi cc_library trong ví dụ phải xuất hiện tối đa trong một cc_shared_library. Nếu cũng muốn liên kết baz vào bar_shared, chúng ta sẽ phải 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 bar.so chứ không phải tên libbar.so như tên 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 với hai phần phụ thuộc cc_shared_library khác nhau xuất ra cùng một mục tiêu. Để khắc phục vấn đề này, bạn cần dừng xuất các thư viện ở một trong các phần phụ thuộc cc_shared_library.

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

Bạn có thể khắc phục vấn đề này bằng cách ngừng liên kết thư viện với một trong các phần phụ thuộc cc_shared_library. Đồng thời, thư viện vẫn liên kết thư viện cần phải xuất thư viện để thư viện không liên kết sẽ vẫn hiển thị các biểu tượng. Một cách khác là kéo thư viện thứ ba xuất mục tiêu. Cách thứ ba là gắn thẻ thủ phạm cc_library bằng LINKABLE_MORE_THAN_ONCE. Tuy nhiên, cách khắc phục này rất hiếm và bạn phải đảm bảo 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à bạn có thể truy cập vào một thư viện trong quá trình đóng bắc cầu của deps mà không cần đi qua một trong các phần phụ thuộc cc_shared_library nhưng đã được liên kết với một cc_shared_library khác trong dynamic_deps và không được xuất.

Giải pháp cho vấn đề này là xuất dự án từ phần phụ thuộc cc_shared_library hoặc lấy cc_shared_library thứ ba để xuất.

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

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

Bạn sẽ gặp lỗi này nếu trong quy tắc hiện tại mà bạn đang xác nhận xuất một mục tiêu mà một trong các phần phụ thuộc động của bạn đang xuất.

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

Đối số

Thuộc tính
name

Name; required

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

deps

List of labels; optional

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

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

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

additional_linker_inputs

List of labels; optional

Bất kỳ tệp bổ sung nào mà bạn muốn chuyển tới trình liên kết, ví dụ: tập lệnh trình liên kết. Bạn phải chuyển riêng từng 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

List of labels; optional

Đâ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.

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

exports_filter

List of strings; optional

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

Bất kỳ mục tiêu deps nào cũng đã được thư viện chia sẻ xuất. Bạn nên sử dụng thuộc tính này để liệt kê mọi mục tiêu do thư viện chia sẻ xuất ra, nhưng lại là 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 cạnh phụ thuộc vào các mục tiêu đó, thay vào đó, cạnh phần phụ thuộc sẽ do deps tạo.Các mục nhập trong thuộc tính này chỉ là chuỗi. Xin lưu ý rằng khi đặt một mục tiêu vào thuộc tính này, đây được coi là một tuyên bố mà thư viện chia sẻ sẽ xuất các biểu tượng từ mục tiêu đó. Logic cc_shared_library không thực sự xử lý việc cho trình liên kết biết cần xuất biểu tượng nào.

Được phép sử dụng cú pháp sau:

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

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

shared_lib_name

String; optional

Theo mặc định, cc_shared_library sẽ sử dụng tên cho tệp đầu ra của thư viện dùng chung dựa trên tên của mục tiêu và nền tảng. Điều này bao gồm một tiện ích mở rộng và đôi khi là một tiền tố. Đôi khi, bạn có thể không muốn sử dụng tên mặc định (ví dụ: khi tải các thư viện chia sẻ C++ dành 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.

List of strings; optional

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

Label; optional

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

fdo_fetch_hint

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

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

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

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

Đối số

Thuộc tính
name

Name; required

Tên duy nhất 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.

tiểu sử fdo

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)

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

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

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

Đối số

Thuộc tính
name

Name; required

Tên duy nhất 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 chỉ có thể có đuôi .afdo.
profile

Label; optional

Nhãn của hồ sơ FDO hoặc quy tắc tạo hồ sơ này. Tệp FDO có thể có một trong các phần mở rộng sau: .profraw cho cấu hình LLVM chưa được lập chỉ mục, .profdata cho cấu hình LLVM đã được lập chỉ mục, .zip chứa cấu hình LLVM được xử lý, .afdo cho cấu hình AutoFDO, .xfdo cho cấu hình XBinary. Nhãn 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

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á 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 duy nhất cho mục tiêu này.

ld_profile

Label; optional

Nhãn của hồ sơ đã chuyển tới hành động 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, 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 duy nhất cho mục tiêu này.

deps

List of labels; optional

Danh sách các thư viện khác sẽ đượ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 nguồn và tiêu đề C/C++ không được tạo (mã nguồn bình 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 tên nằm trong outs của một số quy tắc khác, quy tắc này sẽ tự động phụ thuộc vào quy tắc kia.

Tệp .h sẽ không được biên dịch nhưng vẫn có sẵn để đưa vào bởi 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 tiêu đề được liệt kê trong srcs này hoặc trong hdrs của bất kỳ quy tắc nào được liệt kê trong đối số deps.

Tất cả các 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 cc_library() được tham chiếu. Kiểu nên dùng là các tiêu đề 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 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 quy tắc đưa vào tiêu đề" để biết nội dung mô tả chi tiết hơn.

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

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

  • Tệp nguồn C và C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Tệp tiêu đề C và C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Bộ lắp rá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ẻ, được tạo phiên bản hoặc chưa đảo ngược: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

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

additional_linker_inputs

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 mục tiêu 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++. Tuỳ theo sự thay thế "Biến" và mã Bourne shell.

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

Nếu gói khai báo feature no_copts_tokenization, mã Bourne shell chỉ áp dụng cho các chuỗi chứa một biến "Make".

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. Tuỳ thuộc vào lựa chọn biến"Make"mã hoá shell Bourne. Mỗi chuỗi (phải bao gồm một mã shell Bourne) được thêm vào đầu -D và được thêm vào dòng lệnh biên dịch với mục tiêu này cũng như mọi quy tắc phụ thuộc vào đó. Hãy thật cẩn thận vì điều này có thể gây ảnh hưởng sâu rộng. Nếu không chắc chắn, hãy thêm giá trị xác định vào local_defines.
includes

List of strings; optional

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

Tuỳ thuộc vào sự thay thế "Biến". Mỗi chuỗi được thêm vào đầu -isystem và 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 đó. (Lưu ý: không phải các quy tắc phụ thuộc!) Hãy thật cẩn thận vì điều này có thể gây ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm cờ "-I" vào COPTS.

Bạn phải thêm tiêu đề vào src hoặc hdr, nếu không thì tiêu đề sẽ không có sẵ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++. Tuỳ thuộc vào lựa chọn biến"Biến", Mã hoá 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ử của danh sách này không bắt đầu bằng $ hoặc - sẽ đượ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 nối vào tuỳ chọn trình liên kết. Hệ thống sẽ bá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: liên kết tệp nhị phân ở chế độ tĩnh. Đối với cc_library.linkstatic: xem bên dưới.

Tùy chọn này được bật theo mặc định cho cc_binary và tắt cho các mục còn lại.

Nếu được bật và ở dạng 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 vẫn có thể được liên kết động, cũng 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 tĩnh.

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

  • SỐ LIỆU THỐNG KÊ với tính năng liên kết đầy đủ tĩnh, trong đó mọi thứ đượ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.
  • SỐ LIỆU THỐNG KÊ, trong đó tất cả thư viện người dùng được liên kết tĩnh (nếu có phiên bản tĩnh), nhưng trong đó 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 động (nếu có sẵn 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ó ý nghĩa khác nếu được dùng trên 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 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 (symlink) cho 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. Tuỳ thuộc vào lựa chọn biến"Make"mã hoá shell Bourne. Mỗi chuỗi (phải bao gồm một mã shell Bourne) được thêm vào đầu -D và được thêm vào dòng lệnh biên dịch cho mục tiêu này, chứ không phải vào các phần phụ thuộc.
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, là một thư viện trống để tệp nhị phân có thể 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 một 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á các tuỳ chọn trùng khớp khỏi lệnh biên dịch C++. Tuỳ thuộc vào sự thay thế biến"Make". Giá trị của thuộc tính này được thể hiện dưới dạng cụm từ thông dụng. 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 để phục vụ mục đích biên dịch quy tắc này. Thuộc tính này ít khi cần thiết.
stamp

Integer; optional; default is 0

Xác định xem có mã hóa thông tin bản dựng thành tệp nhị phân hay không. Bạn có thể sử dụng các giá trị sau:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong các bản dựng --nostamp. Bạn nên tránh sử dụng tùy chọn cài đặt này vì tùy chọn này có thể tắt bộ nhớ đệm từ xa đối với tệp nhị phân và mọi hành động ở phần dưới phụ thuộc vào tệp đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị không đổi. Thao tác này sẽ giúp lưu kết quả vào bộ nhớ đệm một cách hiệu quả.
  • stamp = -1: Việc nhúng thông tin bản dựng sẽ do cờ --[no]stamp kiểm soát.

Các tệp nhị phân có nhãn đóng góp không được tạo lại trừ phi các phần phụ thuộc thay đổi.

win_def_file

Label; optional

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

chuỗi công cụ cc

Xem nguồn quy tắc
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++. Bạn có thể thực hiện việc này 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 là các nhóm tệp phổ biến nhất khi phát hiện 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++. Ngoài ra, hãy xem trang này để biết tài liệu về chuỗi công cụ C++ phức tạp và tài liệu lựa chọn chuỗi công cụ.

Sử dụng tags = ["manual"] để ngăn việc xây dựng và định cấu hình chuỗi công cụ khi không gọi bazel build //...

Đối số

Thuộc tính
name

Name; required

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

all_files

Label; required

Bộ sưu tậ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 thao tác liên quan đến rules_cc (ngoại trừ các thao tác đang sử dụng nhóm 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à 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ụ: quá trình biên dịch tem liên kết cần cả tệp biên dịch và liên kết, vì vậy phải có all_files).

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

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 cần thiết cho các hành động lắp ráp.

compiler

String; optional; nonconfigurable

Không dùng nữa. Thay vào đó, hãy sử dụng thuộc tính toolchain_identifier. Đó sẽ là dấu hiệu sau CROSSTOOL chuyển sang Starlark và sẽ bị #7075 xóa.

Khi được thiết lập, giá trị này sẽ được dùng để thực hiện lựa chọn crosstool_config.toolchain. Phương thức này sẽ được ưu tiên hơn tùy chọn --cpu Bazel.

compiler_files

Label; required

Tập hợp tất cả cấu phần phần mềm chuỗi cc_tool cần thiết cho các hành động 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á đầ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 chuỗi cc_tool cần thiết cho các hành động liên quan đến phạm vi áp dụng. Nếu không được chỉ định, hệ thống sẽ sử dụng all_files.
cpu

String; optional; nonconfigurable

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

Khi được thiết lập, giá trị này sẽ được dùng để thực hiện lựa chọn crosstool_config.toolchain. Phương thức này sẽ được ưu tiên hơn tùy 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 cần thiết cho các hành động dwp.
dynamic_runtime_lib

Label; optional

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

Giá trị này sẽ được sử dụng khi bạn bật tính năng 'static_link_cpp_runtimes' và chúng tôi đang tự động liên kết các phần phụ thuộc.

exec_transition_for_inputs

Boolean; optional; default is True

Đặt thành True để tạo tất cả dữ liệu đầu vào của tệp thành 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

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

Label; required

Tập hợp tất cả cấu phần phần mềm cc_toolchain cần thiết cho liên kết hành động.
module_map

Label; optional

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

Label; required

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 objcopy.
static_runtime_lib

Label; optional

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

Giá trị này sẽ được dùng khi bật tính năng 'static_link_cpp_runtimes' và chúng tôi đang liên kết tĩnh các phần phụ thuộc.

strip_files

Label; required

Bộ sưu tập tất cả cấu phần phần mềm cc_toolchain cần thiết cho các hành động dải.
supports_header_parsing

Boolean; optional; default is False

Đặt thành True khi chuỗi cc_tool 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 Đúng khi cc_toolchain hỗ trợ sử dụng tệp tham số cho liên kết tác vụ.
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 cc_toolchain này với crosstool_config.toolchain tương ứng.

Bạn nên liên kết cc_toolchain với CROSSTOOL.toolchain cho đến khi sự cố #5380 được khắc phục. 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 tập hợp các 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 tuỳ chọn --cpu--compiler được chuyển đến Bazel.

Ngoài ra, hãy xem trang này để biết tài liệu về chuỗi công cụ C++ phức tạp và tài liệu lựa chọn chuỗi công cụ.

Đối số

Thuộc tính
name

Name; required

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

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

Ánh xạ từ các chuỗi "<cpu>" hoặc "<cpu>|<compiler>" tới một nhãn cc_toolchain. "<cpu>" sẽ được sử dụng khi chỉ --cpu được truyền vào Bazel và "<cpu>|<compiler>" sẽ được sử 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",
            },
          )