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)

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

  • name.stripped (chỉ được tạo nếu có yêu cầu rõ ràng): Một bản sao phiên bản của tệp nhị phân. strip -g được chạy trên tệp nhị phân để xoá gỡ lỗi . Các tùy chọn dải bổ sung có thể được cung cấp trên dòng lệnh bằng cách sử dụng --stripopt=-foo. Kết quả này chỉ được tạo khi có yêu cầu rõ ràng.
  • name.dwp (chỉ tạo nếu được yêu cầu rõ ràng): Nếu Đã bật tính năng Fission: một bản 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: an 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 được liên kết đến mục tiêu nhị phân.

Các lựa chọn này có thể là cc_library hoặc objc_library mục tiêu.

srcs

List of labels; optional

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

Tất cả tệp .cc, .c.cpp sẽ được biên dịch. Đây có thể là các tệp được tạo: nếu một tệp được đặt tên nằm trong outs của một số quy tắc khác, 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 cho bao gồm theo nguồn trong quy tắc này. Cả .cc và Tệp .h có thể bao gồm trực tiếp 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.

Tất cả #included tệp 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 được đề xuất là dành cho các tiêu đề liên kết với thư viện được liệt kê trong thuộc tính hdrs của thư viện đó và các thuộc tính còn lại tiêu đề được liên kết với các nguồn của quy tắc này để được liệt kê trong srcs Xem phần "Kiểm tra việc bao gồm tiêu đề" để xem nội dung mô tả chi tiết hơn.

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

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

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

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

additional_linker_inputs

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 ở đây để nhúng trong 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++. Theo sự thay thế "Tạo biến"Mã hoá bằng mã thông báo shell Bourne.

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

Nếu gói khai báo tính năng này no_copts_tokenization, mã thông báo shell Bourne chỉ áp dụng cho các chuỗi có một dòng chữ "Tạo" biến.

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. Theo "Nhãn hiệu" phép thế và biến Mã hoá bằng mã thông báo shell Bourne. Mỗi chuỗi phải bao gồm một mã thông báo shell Bourne duy nhất, đượ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 quy tắc đó. Hãy thật cẩn thận vì việc này có thể có ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm giá trị định nghĩa vào local_defines.
includes

List of strings; optional

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

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

Bạn phải thêm tiêu đề vào các tệp src hoặc hdr, nếu không, các tiêu đề này sẽ không dành cho các phần phụ thuộc khi quá trình 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++. Theo "Nhãn hiệu" phép thay thế biến, Mã hoá bằng vỏ Bournemở rộng nhãn. Mỗi chuỗi trong thuộc tính này được thêm vào LINKOPTS trước liên kết mục tiêu nhị phân.

Mỗi phần tử của danh sách này mà không bắt đầu bằng $ hoặc - là giả định là nhãn của mục tiêu trong deps. Chiến lược phát hành đĩa đơn danh sách các tệp do mục tiêu đó tạo ra sẽ được thêm vào 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 là 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. Theo mặc định tuỳ chọn này đang tắt.

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

Nếu bạn chỉ định cả linkopts=['-static']linkshared=True, bạn sẽ có một đơn vị hoàn toàn độc lập. Nếu bạn chỉ định cả hai linkstatic=Truelinkshared=True, bạn sẽ nhận được một đường liên kết duy nhất, chủ yếu là một thiết bị độc lập.

linkstatic

Boolean; optional; default is True

Dành cho cc_binarycc_test: liên kết tệp nhị phân ở dạng tĩnh . Đối với cc_library.linkstatic: xem bên dưới.

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

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

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

  • StatIC với tính năng full_static_link, trong đó mọi 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 features.
  • StatIC, trong đó tất cả thư viện người dùng được liên kết theo cách tĩnh (nếu một thư viện tĩnh phiên bản có sẵn), nhưng khi 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.
  • ĐỘNG, trong đó tất cả thư viện được liên kết động (nếu phiên bản động được có sẵn), ví dụ: "gcc foo.o libfoo.so libbaz.so -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=False.

Thuộc tính linkstatic sẽ có ý nghĩa khác nếu được sử dụng trên 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ụ xây dựng sẽ tạo các đường liên kết tượng trưng đến phụ thuộc vào các thư viện dùng chung trong vùng *.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. Theo "Nhãn hiệu" phép thế và biến Mã hoá bằng mã thông báo shell Bourne. Mỗi chuỗi phải bao gồm một mã thông báo shell Bourne duy nhất, đượ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 phép cho các thành viê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 nên tệp nhị phân sẽ kết thúc bằng libc Malloc. Nhãn này phải tham chiếu đến cc_library. Nếu quá trình biên dịch không phải là C++ , thì tùy 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 Đã 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++. Theo "Nhãn hiệu" biến. Giá trị của thuộc tính này được hiểu là biểu thức chính quy. Bất kỳ COPTS nào có trước đó khớp với biểu thức chính quy này (bao gồm các giá trị được chỉ định rõ ràng trong thuộc tính copts của quy tắc) sẽ bị xóa khỏi COPTS để 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 thành tệp nhị phân hay không. Các giá trị có thể có:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong --nostamp bản dựng. Chiến dịch này nên tránh cài đặt, vì nó có thể tắt chức năng lưu vào bộ nhớ đệm từ xa đối với tệp nhị phân và mọi thao tác hạ nguồn phụ thuộc vào mã đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị hằng số. Chiến dịch này cho phép lưu kết quả bản dựng tốt vào bộ nhớ đệm.
  • stamp = -1: Bạn có thể kiểm soát việc nhúng thông tin bản dựng bằng Cờ --[no]stamp.

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

win_def_file

Label; optional

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

Bạn chỉ nên sử dụng thuộc tính này khi Windows là nền tảng mục tiêu. Bạn có thể dùng mã này để xuất các biểu tượng trong khi 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 chia sẻ (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Liên kết thư viện chia sẻ 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 điểm. Liên kết một thư viện chia sẻ 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 điểm. 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 duy nhất cho mục tiêu này.

hdrs

List of labels; optional

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

Boolean; optional; default is False

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

Nếu Alwayslink không hoạt động với VS 2017 trên Windows, đó là do lỗi vấn đề đã biết, vui lòng nâng cấp phiên bản VS 2017 của bạn 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ẻ.

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 rằng công cụ này được cung cấp cho phụ thuộc vào mã đó trong thời gian chạy.

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.

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

system_provided

Boolean; optional; default is False

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

cc_library

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

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

Bạn phải khai báo tất cả tệp tiêu đề dùng trong bản dựng trong hdrs hoặc srcs/cc_* quy tắc. Yêu cầu 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 vào cả hai tệp trong hdrssrcs của chính thư viện cũng như từ các tệp trong hdrssrcs/cc_* quy tắc liệt kê thư viện trong deps tương ứng. Chỉ được đưa trực tiếp tiêu đề trong srcs vào các tệp trong hdrssrcs của chính thư viện. Khi quyết định xem có đặt tiêu đề vào hdrs hoặc srcs, bạn nên hỏi xem bạn có muốn sử dụng thư viện này không trực tiếp đưa dữ liệu đó vào. Đây gần như là một quyết định giống như giữa Chế độ hiển thị publicprivate trong các ngôn ngữ lập trình.

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

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

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

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

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

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

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

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

Rất tiếc, Bazel hiện không thể phân biệt giữa trực tiếp và bắc cầu nên tính năng này không thể phát hiện các trường hợp lỗi trong đó một tệp có chứa mà 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ụ nêu trên về foo.cc trực tiếp bao gồm baz.h. Đây là nội dung bất hợp pháp vì foo không phụ thuộc trực tiếp vào baz. Hiện không xảy ra lỗi nào trong trường hợp đó, nhưng sau này chúng tôi có thể thêm chức năng kiểm tra lỗi đó.

Đố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 được liên kết đến mục tiêu nhị phân.

Các lựa chọn này có thể là cc_library hoặc objc_library mục tiêu.

srcs

List of labels; optional

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

Tất cả tệp .cc, .c.cpp sẽ được biên dịch. Đây có thể là các tệp được tạo: nếu một tệp được đặt tên nằm trong outs của một số quy tắc khác, 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 cho bao gồm theo nguồn trong quy tắc này. Cả .cc và Tệp .h có thể bao gồm trực tiếp 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.

Tất cả #included tệp 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 được đề xuất là dành cho các tiêu đề liên kết với thư viện được liệt kê trong thuộc tính hdrs của thư viện đó và các thuộc tính còn lại tiêu đề được liên kết với các nguồn của quy tắc này để được liệt kê trong srcs Xem phần "Kiểm tra việc bao gồm tiêu đề" để xem nội dung mô tả chi tiết hơn.

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

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

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

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

hdrs

List of labels; optional

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

Đây là vị trí được ưu tiên dùng để khai báo tệp tiêu đề mô tả giao diện cho thư viện. Các tiêu đề này sẽ được tạo có thể đư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. Tiêu đề không dành cho ứng dụng khách của thư viện này phải được đượ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 "Bao gồm tiêu đề đang kiểm tra" để biết nội dung mô tả chi tiết hơn.

additional_compiler_inputs

List of labels; optional

Mọi tệp bổ sung mà bạn có thể muốn truyền đến dòng lệnh của trình biên dịch, chẳng hạn như trình dọn dẹp danh sách bỏ qua. Sau đó, bạn có thể dùng các tệp được chỉ định ở đây trong thông tin đăng nhập có hàm $(location).
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 ở đây để nhúng trong mục tiêu nhị phân.

Boolean; optional; default is False

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

Nếu Alwayslink không hoạt động với VS 2017 trên Windows, đó là do lỗi vấn đề đã biết, vui lòng nâng cấp phiên bản VS 2017 của bạn 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++. Theo sự thay thế "Tạo biến"Mã hoá bằng mã thông báo shell Bourne.

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

Nếu gói khai báo tính năng này no_copts_tokenization, mã thông báo shell Bourne chỉ áp dụng cho các chuỗi có một dòng chữ "Tạo" biến.

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. Theo "Nhãn hiệu" phép thế và biến Mã hoá bằng mã thông báo shell Bourne. Mỗi chuỗi phải bao gồm một mã thông báo shell Bourne duy nhất, đượ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 quy tắc đó. Hãy thật cẩn thận vì việc này có thể có ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm giá trị định nghĩa 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 phụ thuộc vào. Ngừng thích với deps, tiêu đề và bao gồm đường dẫn của các thư viện này (cũng như tất cả các đường dẫn Phần phụ thuộc bắc cầu) 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 mã đó. Các thư viện được chỉ định với 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ố để thêm vào đường dẫn của các tiêu đề của quy tắc này.

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

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

includes

List of strings; optional

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

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

Bạn phải thêm tiêu đề vào các tệp src hoặc hdr, nếu không, các tiêu đề này sẽ không dành cho các phần phụ thuộc khi quá trình 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++. Theo "Nhãn hiệu" phép thay thế biến, Mã hoá bằng vỏ Bournemở rộng nhãn. Mỗi chuỗi trong thuộc tính này được thêm vào LINKOPTS trước liên kết mục tiêu nhị phân.

Mỗi phần tử của danh sách này mà không bắt đầu bằng $ hoặc - là giả định là nhãn của mục tiêu trong deps. Chiến lược phát hành đĩa đơn danh sách các tệp do mục tiêu đó tạo ra sẽ được thêm vào 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 là 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++ được chỉ định vào tệp cuối cùng nhị phân. Thủ thuật này là bắt buộc để đưa ra dấu thời gian thông tin vào tệp nhị phân; nếu chúng tôi đã biên dịch tệp nguồn thành theo cách thông thường, thì dấu thời gian sẽ không chính xác. Quá trình biên dịch linkstamp có thể không bao gồm bất kỳ tập hợp cụ thể nào cờ của trình biên dịch, do đó không nên phụ thuộc vào bất kỳ cờ cụ thể nào tiêu đề, tuỳ chọn trình biên dịch hoặc biến thể bản dựng khác. Lựa chọn này chỉ cần thiết trong Gói base.
linkstatic

Boolean; optional; default is False

Dành cho cc_binarycc_test: liên kết tệp nhị phân ở dạng tĩnh . Đối với cc_library.linkstatic: xem bên dưới.

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

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

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

  • StatIC với tính năng full_static_link, trong đó mọi 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 features.
  • StatIC, trong đó tất cả thư viện người dùng được liên kết theo cách tĩnh (nếu một thư viện tĩnh phiên bản có sẵn), nhưng khi 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.
  • ĐỘNG, trong đó tất cả thư viện được liên kết động (nếu phiên bản động được có sẵn), ví dụ: "gcc foo.o libfoo.so libbaz.so -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=False.

Thuộc tính linkstatic sẽ có ý nghĩa khác nếu được sử dụng trên 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ụ xây dựng sẽ tạo các đường liên kết tượng trưng đến phụ thuộc vào các thư viện dùng chung trong vùng *.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. Theo "Nhãn hiệu" phép thế và biến Mã hoá bằng mã thông báo shell Bourne. Mỗi chuỗi phải bao gồm một mã thông báo shell Bourne duy nhất, đượ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 phép cho các thành viê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++. Theo "Nhãn hiệu" biến. Giá trị của thuộc tính này được hiểu là biểu thức chính quy. Bất kỳ COPTS nào có trước đó khớp với biểu thức chính quy này (bao gồm các giá trị được chỉ định rõ ràng trong thuộc tính copts của quy tắc) sẽ bị xóa khỏi COPTS để 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ố để tách khỏi đường dẫn của các tiêu đề của quy tắc này.

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

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

Tiền tố trong thuộc tính include_prefix được thêm sau tiền tố này là bị phá hoại.

textual_hdrs

List of labels; optional

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

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

win_def_file

Label; optional

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

Bạn chỉ nên sử dụng thuộc tính này khi Windows là nền tảng mục tiêu. Bạn có thể dùng mã này để xuất các biểu tượng trong khi 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 các quy tắc proto_library .

Ví dụ:

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

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

proto_library(
    name = "foo_proto",
)

Đối số

Thuộc tính
name

Name; required

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

deps

List of labels; optional

Danh sách 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 cấu hình gợi ý tìm nạp trước FDO trong không gian làm việc hoặc tại một giá trị được chỉ định đường dẫn tuyệt đối. 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_ menu_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)

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

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

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

Đối số

Thuộc tính
name

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 có đuôi .afdo.
profile

Label; optional

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

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á Propeller trong không gian làm việc. Ví dụ:

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

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

Đối số

Thuộc tính
name

Name; required

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

ld_profile

Label; optional

Nhãn của hồ sơ được chuyển đến thao tác 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 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 được liên kết đến mục tiêu nhị phân.

Các lựa chọn này có thể là cc_library hoặc objc_library mục tiêu.

srcs

List of labels; optional

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

Tất cả tệp .cc, .c.cpp sẽ được biên dịch. Đây có thể là các tệp được tạo: nếu một tệp được đặt tên nằm trong outs của một số quy tắc khác, 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 cho bao gồm theo nguồn trong quy tắc này. Cả .cc và Tệp .h có thể bao gồm trực tiếp 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.

Tất cả #included tệp 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 được đề xuất là dành cho các tiêu đề liên kết với thư viện được liệt kê trong thuộc tính hdrs của thư viện đó và các thuộc tính còn lại tiêu đề được liên kết với các nguồn của quy tắc này để được liệt kê trong srcs Xem phần "Kiểm tra việc bao gồm tiêu đề" để xem nội dung mô tả chi tiết hơn.

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

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

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

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

additional_linker_inputs

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 ở đây để nhúng trong 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++. Theo sự thay thế "Tạo biến"Mã hoá bằng mã thông báo shell Bourne.

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

Nếu gói khai báo tính năng này no_copts_tokenization, mã thông báo shell Bourne chỉ áp dụng cho các chuỗi có một dòng chữ "Tạo" biến.

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. Theo "Nhãn hiệu" phép thế và biến Mã hoá bằng mã thông báo shell Bourne. Mỗi chuỗi phải bao gồm một mã thông báo shell Bourne duy nhất, đượ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 quy tắc đó. Hãy thật cẩn thận vì việc này có thể có ảnh hưởng sâu rộng. Khi nghi ngờ, hãy thêm giá trị định nghĩa vào local_defines.
includes

List of strings; optional

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

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

Bạn phải thêm tiêu đề vào các tệp src hoặc hdr, nếu không, các tiêu đề này sẽ không dành cho các phần phụ thuộc khi quá trình 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++. Theo "Nhãn hiệu" phép thay thế biến, Mã hoá bằng vỏ Bournemở rộng nhãn. Mỗi chuỗi trong thuộc tính này được thêm vào LINKOPTS trước liên kết mục tiêu nhị phân.

Mỗi phần tử của danh sách này mà không bắt đầu bằng $ hoặc - là giả định là nhãn của mục tiêu trong deps. Chiến lược phát hành đĩa đơn danh sách các tệp do mục tiêu đó tạo ra sẽ được thêm vào 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 là không được khai báo trong deps.

linkstatic

Boolean; optional; default is False

Dành cho cc_binarycc_test: liên kết tệp nhị phân ở dạng tĩnh . Đối với cc_library.linkstatic: xem bên dưới.

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

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

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

  • StatIC với tính năng full_static_link, trong đó mọi 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 features.
  • StatIC, trong đó tất cả thư viện người dùng được liên kết theo cách tĩnh (nếu một thư viện tĩnh phiên bản có sẵn), nhưng khi 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.
  • ĐỘNG, trong đó tất cả thư viện được liên kết động (nếu phiên bản động được có sẵn), ví dụ: "gcc foo.o libfoo.so libbaz.so -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=False.

Thuộc tính linkstatic sẽ có ý nghĩa khác nếu được sử dụng trên 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ụ xây dựng sẽ tạo các đường liên kết tượng trưng đến phụ thuộc vào các thư viện dùng chung trong vùng *.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. Theo "Nhãn hiệu" phép thế và biến Mã hoá bằng mã thông báo shell Bourne. Mỗi chuỗi phải bao gồm một mã thông báo shell Bourne duy nhất, đượ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 phép cho các thành viê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 nên tệp nhị phân sẽ kết thúc bằng libc Malloc. Nhãn này phải tham chiếu đến cc_library. Nếu quá trình biên dịch không phải là C++ , thì tùy 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 Đã 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++. Theo "Nhãn hiệu" biến. Giá trị của thuộc tính này được hiểu là biểu thức chính quy. Bất kỳ COPTS nào có trước đó khớp với biểu thức chính quy này (bao gồm các giá trị được chỉ định rõ ràng trong thuộc tính copts của quy tắc) sẽ bị xóa khỏi COPTS để 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 thành tệp nhị phân hay không. Các giá trị có thể có:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong --nostamp bản dựng. Chiến dịch này nên tránh cài đặt, vì nó có thể tắt chức năng lưu vào bộ nhớ đệm từ xa đối với tệp nhị phân và mọi thao tác hạ nguồn phụ thuộc vào mã đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị hằng số. Chiến dịch này cho phép lưu kết quả bản dựng tốt vào bộ nhớ đệm.
  • stamp = -1: Bạn có thể kiểm soát việc nhúng thông tin bản dựng bằng Cờ --[no]stamp.

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

win_def_file

Label; optional

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

Bạn chỉ nên sử dụng thuộc tính này khi Windows là nền tảng mục tiêu. Bạn có thể dùng mã này để xuất các biểu tượng trong khi 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 thao tác C++. Việc này được thực hiện bằng 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à thường gặp nhất là các nhóm tệp sao chép tất cả các tệp được yêu cầu.
  • Tạo dòng lệnh chính xác cho các thao tác C++. Việc này được thực hiện bằng Nhà cung cấp CcToolchainConfigInfo (thông tin chi tiết như bên dưới).

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

Sử dụng tags = ["manual"] để ngăn hoạt động tạo và định cấu hình chuỗi công cụ không cần thiết khi 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

Thu thập tất cả cấu phần phần mềm cc_toolchain. Các cấu phần phần mềm này sẽ được thêm làm dữ liệu đầu vào cho tất cả 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 chính xác hơn cấu phần phần mềm từ các thuộc tính bên dưới). Bazel giả định 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 linkstamp), cả hai đều phải được biên dịch và tệp đường liên kết, nên sẽ cần all_files).

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

ar_files

Label; optional

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

as_files

Label; optional

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

compiler

String; optional; nonconfigurable

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

Khi bạn đặt chính sách này, giá trị này sẽ được dùng để lựa chọn crosstool_config.toolchain. Sẽ mất khoảng thời gian ưu tiên hơn tuỳ chọn --cpu Bazel.

compiler_files

Label; required

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

Label; optional

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

Label; optional

Thu thập tất cả cấu phần phần mềm cc_toolchain cần thiết cho các thao tác liên quan đến mức độ sử dụng. Nếu không được chỉ định, all_files đều đượ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 strings_identifier. Sau đó sẽ là một noop Di chuyển CROSSTOOL sang Starlark và sẽ bị xoá trước #7075.

Khi bạn đặt chính sách này, giá trị này sẽ được dùng để lựa chọn crosstool_config.toolchain. Sẽ mất khoảng thời gian ưu tiên hơn tuỳ chọn --cpu Bazel.

dwp_files

Label; required

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

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

Giá trị này sẽ được dùng khi thuộc tính "static_link_cpp_runtimes" đã bật và chúng tôi đang liên kết một cách linh động.

exec_transition_for_inputs

Boolean; optional; default is True

Đặt thành True để tạo tất cả dữ liệu đầu vào tệp thành cc_toolchain cho nền tảng thực thi, thay vì không 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

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

Label; optional

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

Label; required

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

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

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

strip_files

Label; required

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

Boolean; 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 các tệp thông 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 cc_toolchain này với giá trị nhận dạng tương ứng crosstool_config.toolchain.

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 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 lựa chọn --cpu--compiler được truyền đến Bazel.

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

Đối số

Thuộc tính
name

Name; required

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

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

Một bản đồ từ "<cpu>" hoặc "<cpu>|<compiler>" chuỗi đến nhãn cc_toolchain. "<cpu>" sẽ được dùng khi chỉ --cpu được chuyển đến 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",
            },
          )