Quy tắc C / C++

Báo cáo sự cố Xem nguồn Hằng đêm · 7,3 · 7.2 · 7.1 · 7,0 · 6,5

Quy tắc

cc_binary

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

Tệp này tạo ra một tệp nhị phân có thể thực thi.


name của mục tiêu phải giống với tên của tệp nguồn là điểm truy cập chính của ứng dụng (trừ phần mở rộng). Ví dụ: nếu điểm truy cập của bạn nằm trong main.cc, thì tên của bạn sẽ main.

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

Tên; bắt buộc

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

deps

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

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

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

Cũng được phép đặt các tập lệnh trình liên kết (.lds) vào phần phụ thuộc và tham chiếu chúng trong linkopts.
srcs

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

Danh sách các tệp C và C++ được xử lý để tạo mục tiêu thư viện. Đâ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, cc_library này sẽ tự động phụ thuộc vào quy tắc khác đó.

Các tệp tập hợp thuần tuý (.s, .asm) không được xử lý trước và thường được tạo bằng tập hợp. Các tệp tập hợp đã xử lý trước (.S) được xử lý trước và thường được tạo bằng cách sử dụng trình biên dịch C/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 các srcs này hoặc trong hdrs của quy tắc này hoặc bất kỳ quy tắc được liệt kê trong đối số deps.

Tất cả #included tệp phải được đề cập trong Thuộc tính hdrs của thuộc tính này hoặc cc_library được tham chiếu hoặc được liệt kê trong srcs nếu là riêng tư vào thư viện này. Xem phần "Kiểm tra việc bao gồm tiêu đề" để bản mô tả chi tiết hơn.

Các tệp .so, .lo.a là các tệp được biên dịch trước. Thư viện của bạn có thể có những tên này dưới dạng srcs nếu trang web sử dụng mã của bên thứ ba mà chúng tôi không có mã nguồn.

Nếu thuộc tính srcs bao gồm nhãn của một quy tắc khác, cc_library sẽ sử dụng các tệp đầu ra của quy tắc đó làm tệp nguồn để biên dịch. Điều này hữu ích khi tạo mã nguồn một lần (đôi khi bạn nên triển khai lớp quy tắc Starlark và sử dụng cc_common API)

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 đó (ví dụ: cc_embed_data). 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.

data

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

Danh sách các tệp mà thư viện này cần trong thời gian chạy. Xem nhận xét chung về data tại Các thuộc tính điển hình được xác định bởi hầu hết các quy tắc xây dựng.

Nếu data là tên của một tệp đã tạo, thì đây là Quy tắc cc_library tự động phụ thuộc vào phương thức tạo .

Nếu data là tên quy tắc, thì đây là Quy tắc cc_library tự động phụ thuộc vào quy tắc đó và outs của quy tắc đó sẽ tự động được thêm vào tệp dữ liệu của cc_library này.

Mã C++ của bạn có thể truy cập vào các tệp dữ liệu này như sau:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

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

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

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

copts

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

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ả đường dẫn phải liên quan đến không gian làm việc, chứ không phải gói hiện tại. Không cần thiết phải có thuộc tính này bên ngoài third_party.

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

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

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

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

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

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

hdrs_check

String; giá trị mặc định là ""

Không được dùng nữa, không hoạt động.
includes

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

Danh sách các thư mục bao gồm sẽ được thêm vào dòng biên dịch. Đối với sự thay thế "Tạo biến". Mỗi chuỗi được thêm vào trước bằng đường dẫn gói và được truyền đến chuỗi công cụ C++ cho mở rộng thông qua "include_paths" tính năng CROSSTOOL. Chuỗi công cụ chạy trên hệ thống POSIX với các định nghĩa tính năng điển hình sẽ tạo ra -isystem path_to_package/include_entry. Bạn chỉ nên sử dụng trình điều khiển này cho các thư viện của bên thứ ba không tuân theo kiểu viết của Google trong câu lệnh #include. 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.

Các đường dẫn include được thêm vào sẽ bao gồm các tệp đã tạo cũng như trong cây nguồn.

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

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

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

linkopts

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

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; giá trị mặc định là False

Tạo thư viện chia sẻ. Để bật thuộc tính này, hãy thêm linkshared=True vào quy tắc của bạn. 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; giá trị mặc định là 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.link_static: 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ể. Các thư viện hệ thống như libc (nhưng không phải là thư viện thời gian chạy C/C++, xem bên dưới) 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.

Nếu thuộc tính linkstatic hoặc fully_static_link trong features được dùng bên ngoài //third_party vui lòng bao gồm nhận xét gần quy tắc để giải thích lý do.

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.

Có rất ít mã được xây dựng bằng linkstatic=False trong phiên bản chính thức. 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

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

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

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

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

Theo mặc định, các tệp nhị phân C++ được liên kết với //tools/cpp:malloc, đó 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.

module_interfaces

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

Danh sách tệp được coi là Giao diện mô-đun C++20.

Tiêu chuẩn C++ không có hạn chế về đuôi tệp giao diện mô-đun

  • Clang sử dụng cppm
  • GCC có thể dùng mọi đuôi tệp nguồn
  • MSVC sử dụng ixx

Hoạt động sử dụng này được cờ bảo vệ --experimental_cpp_modules.

nocopts

String; giá trị mặc định là ""

Xoá các tuỳ chọn trùng khớp khỏi lệnh biên dịch C++. 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ị xoá khỏi COPTS nhằm mục đích biên dịch quy tắc này. Không cần thiết hoặc sử dụng thuộc tính này bên ngoài third_party. Các giá trị không được xử lý trước theo bất kỳ cách nào khác ngoài nhãn "Tạo" thay thế biến.
reexport_deps

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

stamp

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

Liệu có mã hoá thông tin bản dựng thành tệp nhị phân hay không. Cá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

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

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

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

cc_import

Xem nguồn quy tắc
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, 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

Trên Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # libmylib.ifso is an interface library for libmylib.so which will be passed to linker
  interface_library = "libmylib.ifso",
  # libmylib.so will be available for runtime
  shared_library = "libmylib.so",
)

Trê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 điểm. Liên kết thư viện chia sẻ với system_provided=True

Trên Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
  # libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
  # This indicates that Bazel is not responsible for making libmylib.so available.
  system_provided = 1,
)

Trê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 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",
)

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

Phần còn lại giống nhau trên Unix và Windows:


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

# second will link to libmylib.so (or libmylib.lib)
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)

cc_import hỗ trợ thuộc tính "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

Tên; bắt buộc

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

deps

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

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

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

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; giá trị mặc định là False

Nếu là 1, bất kỳ tệp nhị phân nào phụ thuộc (trực tiếp hoặc gián tiếp) vào 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.

includes

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

Danh sách các thư mục bao gồm sẽ được thêm vào dòng biên dịch. Đối với sự thay thế "Tạo biến". Mỗi chuỗi được thêm vào trước bằng đường dẫn gói và được truyền đến chuỗi công cụ C++ cho mở rộng thông qua "include_paths" tính năng CROSSTOOL. Chuỗi công cụ chạy trên hệ thống POSIX với các định nghĩa tính năng điển hình sẽ tạo ra -isystem path_to_package/include_entry. Bạn chỉ nên sử dụng trình điều khiển này cho các thư viện của bên thứ ba không tuân theo kiểu viết của Google trong câu lệnh #include. 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.

Đường dẫn include mặc định không bao gồm những đường dẫn đã tạo tệp. Nếu bạn cần #include một tiêu đề đã tạo hãy liệt kê tệp đó trong srcs.

interface_library

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

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

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

linkopts

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

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.

objects

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

pic_objects

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

pic_static_library

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

shared_library

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

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

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

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; giá trị mặc định là False

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

cc_library

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

Sử dụng cc_library() cho các thư viện được biên dịch C++. Kết quả sẽ là .so, .lo hoặc .a, tuỳ thuộc vào yêu cầu.

Nếu bạn tạo thứ gì đó bằng liên kết tĩnh phụ thuộc vào cc_library, đầu ra của quy tắc thư viện phụ thuộc là tệp .a. Nếu bạn chỉ định alwayslink=True, bạn sẽ nhận được tệp .lo.

Tên tệp đầu ra thực tế là libfoo.so cho thư viện chia sẻ, trong đó foo là tên của quy tắc. Chiến lược phát hành đĩa đơn các loại thư viện khác kết thúc bằng .lo.a, . Nếu bạn cần một tên cụ thể của thư viện chia sẻ, cho ví dụ: để xác định một mô-đun Python, hãy dùng quy tắc gen để sao chép thư viện thành tên mong muốn.

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 trong số các quy tắc cc_*. 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ừ các tệp trong hdrssrcs của thư viện cũng như từ các tệp trong hdrssrcs trên cc_* quy tắc liệt kê thư viện trong deps của chú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. Thời gian quyết định xem đặt tiêu đề vào hdrs hay srcs, bạn nên hỏi xem bạn có muốn người dùng thư viện này có thể trực tiếp đưa vào đó. Đây gần như là quyết định giống với giữa chế độ hiển thị publicprivate trong ngôn ngữ lập trình.

Các quy tắc cc_binarycc_test chưa xuất tệp nên 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 phép thử trực tiếp nên đượ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 bao gồm foo.hbar.h, nhưng không bao gồm 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.

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

Ví dụ


cc_library(
    name = "ast_inspector_lib",
    srcs = ["ast_inspector_lib.cc"],
    hdrs = ["ast_inspector_lib.h"],
    visibility = ["//visibility:public"],
    deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
    # alwayslink as we want to be able to call things in this library at
    # debug time, even if they aren't used anywhere in the code.
    alwayslink = 1,
)

Ví dụ sau lấy từ third_party/python2_4_3/BUILD. Một số mã sử dụng thư viện dl (để tải một thư viện động khác), vì vậy quy tắc chỉ định tùy chọn liên kết -ldl để liên kết Thư viện dl.


cc_library(
    name = "python2_4_3",
    linkopts = [
        "-ldl",
        "-lutil",
    ],
    deps = ["//third_party/expat"],
)

Ví dụ sau đây lấy từ third_party/kde/BUILD. Chúng tôi lưu giữ các tệp .so dựng sẵn trong kho. Các tệp tiêu đề nằm trong thư mục con có tên là include.


cc_library(
    name = "kde",
    srcs = [
        "lib/libDCOP.so",
        "lib/libkdesu.so",
        "lib/libkhtml.so",
        "lib/libkparts.so",
        ...more .so files...,
    ],
    includes = ["include"],
    deps = ["//third_party/X11"],
)

Ví dụ sau đây lấy từ third_party/gles/BUILD. Mã của bên thứ ba thường cần một số defineslinkopts.


cc_library(
    name = "gles",
    srcs = [
        "GLES/egl.h",
        "GLES/gl.h",
        "ddx.c",
        "egl.c",
    ],
    defines = [
        "USE_FLOAT",
        "__GL_FLOAT",
        "__GL_COMMON",
    ],
    linkopts = ["-ldl"],  # uses dlopen(), dl library
    deps = [
        "es",
        "//third_party/X11",
    ],
)

Đối số

Thuộc tính
name

Tên; bắt buộc

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

deps

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

Danh sách các thư viện khác mà thư viện nhắm đến phụ thuộc vào.

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

Xem nhận xét chung về deps tại Các thuộc tính điển hình được xác định bởi hầu hết các quy tắc xây dựng.

Đây phải là tên của các quy tắc của thư viện C++. Khi bạn tạo tệp nhị phân liên kết thư viện của quy tắc này, bạn cũng sẽ liên kết các thư viện trong deps.

Mặc dù có "dep" không phải tất cả ứng dụng khách của thư viện này thuộc về đây. Các phần phụ thuộc dữ liệu trong thời gian chạy thuộc data. Các tệp nguồn do các quy tắc khác tạo ra sẽ thuộc srcs.

Để liên kết trong một thư viện của bên thứ ba được biên dịch trước, hãy thêm tên của thư viện vào srcs thay thế.

Để phụ thuộc vào nội dung nào đó mà không cần liên kết nội dung đó với thư viện này, hãy thêm nội dung đó thành data.

srcs

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

Danh sách các tệp C và C++ được xử lý để tạo mục tiêu thư viện. Đâ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, cc_library này sẽ tự động phụ thuộc vào quy tắc khác đó.

Các tệp tập hợp thuần tuý (.s, .asm) không được xử lý trước và thường được tạo bằng tập hợp. Các tệp tập hợp đã xử lý trước (.S) được xử lý trước và thường được tạo bằng cách sử dụng trình biên dịch C/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 các srcs này hoặc trong hdrs của quy tắc này hoặc bất kỳ quy tắc được liệt kê trong đối số deps.

Tất cả #included tệp phải được đề cập trong Thuộc tính hdrs của thuộc tính này hoặc cc_library được tham chiếu hoặc được liệt kê trong srcs nếu là riêng tư vào thư viện này. Xem phần "Kiểm tra việc bao gồm tiêu đề" để bản mô tả chi tiết hơn.

Các tệp .so, .lo.a là các tệp được biên dịch trước. Thư viện của bạn có thể có những tên này dưới dạng srcs nếu trang web sử dụng mã của bên thứ ba mà chúng tôi không có mã nguồn.

Nếu thuộc tính srcs bao gồm nhãn của một quy tắc khác, cc_library sẽ sử dụng các tệp đầu ra của quy tắc đó làm tệp nguồn để biên dịch. Điều này hữu ích khi tạo mã nguồn một lần (đôi khi bạn nên triển khai lớp quy tắc Starlark và sử dụng cc_common API)

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 đó (ví dụ: cc_embed_data). 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.

data

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

Danh sách các tệp mà thư viện này cần trong thời gian chạy. Xem nhận xét chung về data tại Các thuộc tính điển hình được xác định bởi hầu hết các quy tắc xây dựng.

Nếu data là tên của một tệp đã tạo, thì đây là Quy tắc cc_library tự động phụ thuộc vào phương thức tạo .

Nếu data là tên quy tắc, thì đây là Quy tắc cc_library tự động phụ thuộc vào quy tắc đó và outs của quy tắc đó sẽ tự động được thêm vào tệp dữ liệu của cc_library này.

Mã C++ của bạn có thể truy cập vào các tệp dữ liệu này như sau:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
hdrs

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

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.

Loại tệp headers được phép: .h, .hh, .hpp, .hxx.

additional_compiler_inputs

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

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

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

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

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

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

Nếu là 1, bất kỳ tệp nhị phân nào phụ thuộc (trực tiếp hoặc gián tiếp) vào 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

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

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ả đường dẫn phải liên quan đến không gian làm việc, chứ không phải gói hiện tại. Không cần thiết phải có thuộc tính này bên ngoài third_party.

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

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

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

String; giá trị mặc định là ""

Không được dùng nữa, không hoạt động.
implementation_deps

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

Danh sách các thư viện khác mà thư viện nhắm đến phụ thuộc vào. 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; giá trị mặc định là ""

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

Khi đặt 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ố.

Thuộc tính này chỉ hợp pháp theo third_party.

includes

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

Danh sách các thư mục bao gồm sẽ được thêm vào dòng biên dịch. Đối với sự thay thế "Tạo biến". Mỗi chuỗi được thêm vào trước bằng đường dẫn gói và được truyền đến chuỗi công cụ C++ cho mở rộng thông qua "include_paths" tính năng CROSSTOOL. Chuỗi công cụ chạy trên hệ thống POSIX với các định nghĩa tính năng điển hình sẽ tạo ra -isystem path_to_package/include_entry. Bạn chỉ nên sử dụng trình điều khiển này cho các thư viện của bên thứ ba không tuân theo kiểu viết của Google trong câu lệnh #include. 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.

Các đường dẫn include được thêm vào sẽ bao gồm các tệp đã tạo cũng như trong cây nguồn.

linkopts

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

Hãy xem cc_binary.linkopts. Thuộc tính linkopts cũng được áp dụng cho mọi mục tiêu phụ thuộc, trực tiếp hay gián tiếp, vào thư viện này thông qua deps (hoặc qua các thuộc tính khác được xử lý tương tự: malloc của cc_binary). Phần phụ thuộc Các chế độ liên kết được ưu tiên so với các chế độ liên kết phụ thuộc (tức là các chế độ liên kết phụ thuộc xuất hiện sau trong dòng lệnh). Liên kết được chỉ định trong --linkopt được ưu tiên hơn việc chọn liên kết quy tắc.

Xin lưu ý rằng thuộc tính linkopts chỉ áp dụng khi tạo tệp .so hoặc tệp thực thi, chứ không phải khi tạo tệp .a hoặc .lo. Vì vậy, nếu thuộc tính linkstatic=True được đặt, Thuộc tính linkopts không ảnh hưởng đến việc tạo thư viện này, chỉ trên các mục tiêu khác phụ thuộc vào thư viện này.

Ngoài ra, điều quan trọng cần lưu ý là "-Wl,-soname" hoặc "-Xlinker -soname" không được hỗ trợ và không được chỉ định trong thuộc tính này.

Các tệp .so do cc_library tạo không được liên kết với thư viện mà chúng phụ thuộc vào . Nếu bạn đang cố tạo một thư viện dùng chung để sử dụng bên ngoài kho lưu trữ chính, ví dụ: để sử dụng theo cách thủ công với dlopen() hoặc LD_PRELOAD, bạn nên dùng quy tắc cc_binary bằng thuộc tính linkshared=True. Hãy xem cc_binary.linkshared.

linkstamp

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

Đồng thời biên dịch và liên kết tệp nguồn C++ được chỉ định vào tệp 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; giá trị mặc định là 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.link_static: 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ể. Các thư viện hệ thống như libc (nhưng không phải là thư viện thời gian chạy C/C++, xem bên dưới) 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.

Nếu thuộc tính linkstatic hoặc fully_static_link trong features được dùng bên ngoài //third_party vui lòng bao gồm nhận xét gần quy tắc để giải thích lý do.

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.

Có rất ít mã được xây dựng bằng linkstatic=False trong phiên bản chính thức. 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

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

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

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

Danh sách tệp được coi là Giao diện mô-đun C++20.

Tiêu chuẩn C++ không có hạn chế về đuôi tệp giao diện mô-đun

  • Clang sử dụng cppm
  • GCC có thể dùng mọi đuôi tệp nguồn
  • MSVC sử dụng ixx

Hoạt động sử dụng này được cờ bảo vệ --experimental_cpp_modules.

strip_include_prefix

String; giá trị mặc định là ""

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

Khi đặ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.

Thuộc tính này chỉ hợp pháp theo third_party.

textual_hdrs

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

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

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

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

Bạn chỉ nên sử dụng thuộc tính này khi Windows là nền tảng mục tiêu. Bạn có thể dùng 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

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

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

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

Ví dụ:


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

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

proto_library(
    name = "foo_proto",
)

Đối số

Thuộc tính
name

Tên; bắt buộc

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

deps

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

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

cc_shared_library

Xem nguồn quy tắc
cc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)

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

Ví dụ:

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

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

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

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

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

Do thuộc tính shared_lib_name, tệp được tạo bởi bar_shared sẽ có tên là bar.so, trái ngược với thành tên libbar.so mà hệ thống sẽ đặt theo mặc định trên Linux.

Lỗi

Two shared libraries in dependencies export the same symbols.

Điều này sẽ xảy ra bất cứ khi nào bạn tạo mục tiêu có hai Các phần phụ thuộc cc_shared_library xuất cùng mục tiêu. Để khắc phục vấn đề này bạn cần dừng xuất thư viện ở một trong 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 các phần phụ thuộc cc_shared_library khác nhau liên kết với cùng một mục tiêu theo cách tĩnh. Tương tự như lỗi xuất dữ liệu.

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

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

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

Giải pháp cho việc này là xuất tệp từ phần phụ thuộc cc_shared_library hoặc lấy ra cc_shared_library thứ ba xuất dữ liệu này.

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

Nếu bạn có một thư viện động được biên dịch trước, thì bạn không nhất thiết và không thể được liên kết tĩnh với mục tiêu cc_shared_library hiện tại mà bạn đang có hiện đang tạo. Do đó, mục 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 của cc_libraries, thì cc_library cần phụ thuộc vào phương thức đó trực tiếp.

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

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

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

Đối số

Thuộc tính
name

Tên; bắt buộc

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

deps

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

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

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

Trong quá trình phân tích, việc triển khai quy tắc sẽ xem xét mọi mục tiêu được liệt kê trong deps đang được thư viện chia sẻ xuất để đưa ra lỗi khi nhiều cc_shared_libraries xuất cùng một mục tiêu. Triển khai quy tắc không quan tâm đến việc thông báo cho trình liên kết về biểu tượng nào nên được trình liên kết xuất đối tượng dùng chung. Người dùng nên giải quyết vấn đề này thông qua tập lệnh trình liên kết hoặc chế độ hiển thị các khai báo 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ào nhiều cc_shared_library. Bạn có thể tránh điều này bằng cách thêm "LINKABLE_MORE_THAN_ONCE" đến cc_library.tags hoặc thông qua trang thông tin "cc_library" dưới dạng tệp xuất của một trong các thư viện dùng chung để bạn có thể tạo một dynamic_dep ứng dụng khác.

additional_linker_inputs

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

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

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

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

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

experimental_disable_topo_sort_do_not_use_remove_before_7_0

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

exports_filter

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

Thuộc tính này chứa danh sách các mục tiêu được tuyên bố là xuất bởi thư viện chia sẻ.

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

Lưu ý rằng thuộc tính này không thực sự thêm cạnh phụ thuộc vào các mục tiêu đó, cạnh phần phụ thuộc phải được tạo bằng deps.Các mục trong này chỉ là các chuỗi. Xin lưu ý rằng khi đặt một mục tiêu trong thuộc tính này, đây được coi là xác nhận rằng thư viện dùng chung xuất các ký hiệu 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 được xuất.

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

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

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

roots

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

shared_lib_name

String; giá trị mặc định là ""

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

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

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

Mọi cờ khác mà bạn có thể muốn truyền đến trình liên kết. Ví dụ: để làm cho trình liên kết nhận biết được tập lệnh trình liên kết được chuyển thông qua additional_linker_inputs, bạn có thể sử dụng sau:

 cc_shared_library(
    name = "foo_shared",
    additional_linker_inputs = select({
      "//src/conditions:linux": [
        ":foo.lds",
        ":additional_script.txt",
      ],
      "//conditions:default": []}),
    user_link_flags = select({
      "//src/conditions:linux": [
        "-Wl,-rpath,kittens",
        "-Wl,--version-script=$(location :foo.lds)",
        "-Wl,--script=$(location :additional_script.txt)",
      ],
      "//conditions:default": []}),
      ...
 )
win_def_file

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

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

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

cc_static_library

Xem nguồn quy tắc
cc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Tạo một thư viện tĩnh từ danh sách các mục tiêu và các phần phụ thuộc bắc cầu của các mục tiêu đó.

Thư viện tĩnh thu được chứa các tệp đối tượng của các mục tiêu được liệt kê trong deps cũng như các phần phụ thuộc bắc cầu của các phần phụ thuộc này, được ưu tiên là Đối tượng PIC.

Nhóm đầu ra

linkdeps

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

linkopts

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

Biểu tượng trùng lặp

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

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

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

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

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

Đối số

Thuộc tính
name

Tên; bắt buộc

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

deps

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

Danh sách các mục tiêu cần kết hợp thành một thư viện tĩnh, bao gồm tất cả các mục tiêu bắc cầu phần phụ thuộc.

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

cc_test

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

Quy tắc cc_test() biên dịch một hoạt động kiểm thử. Ở đây, một phép kiểm thử là một trình bao bọc nhị phân xung quanh một số mã kiểm thử.

Theo mặc định, các chương trình kiểm thử C++ được liên kết một cách linh động.
Để liên kết tĩnh một bài kiểm thử đơn vị, hãy chỉ định linkstatic=True. Bạn có thể nêu rõ lý do cần kiểm thử linkstatic; điều này có lẽ không rõ ràng.

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

Hãy xem các đối số cc_binary(), ngoại trừ theo mặc định đối số stamp được đặt thành 0 để kiểm thử và cc_test có thêm thuộc tính chung cho mọi quy tắc kiểm thử (*_test).

Đối số

Thuộc tính
name

Tên; bắt buộc

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

deps

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

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

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

Cũng được phép đặt các tập lệnh trình liên kết (.lds) vào phần phụ thuộc và tham chiếu chúng trong linkopts.
srcs

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

Danh sách các tệp C và C++ được xử lý để tạo mục tiêu thư viện. Đâ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, cc_library này sẽ tự động phụ thuộc vào quy tắc khác đó.

Các tệp tập hợp thuần tuý (.s, .asm) không được xử lý trước và thường được tạo bằng tập hợp. Các tệp tập hợp đã xử lý trước (.S) được xử lý trước và thường được tạo bằng cách sử dụng trình biên dịch C/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 các srcs này hoặc trong hdrs của quy tắc này hoặc bất kỳ quy tắc được liệt kê trong đối số deps.

Tất cả #included tệp phải được đề cập trong Thuộc tính hdrs của thuộc tính này hoặc cc_library được tham chiếu hoặc được liệt kê trong srcs nếu là riêng tư vào thư viện này. Xem phần "Kiểm tra việc bao gồm tiêu đề" để bản mô tả chi tiết hơn.

Các tệp .so, .lo.a là các tệp được biên dịch trước. Thư viện của bạn có thể có những tên này dưới dạng srcs nếu trang web sử dụng mã của bên thứ ba mà chúng tôi không có mã nguồn.

Nếu thuộc tính srcs bao gồm nhãn của một quy tắc khác, cc_library sẽ sử dụng các tệp đầu ra của quy tắc đó làm tệp nguồn để biên dịch. Điều này hữu ích khi tạo mã nguồn một lần (đôi khi bạn nên triển khai lớp quy tắc Starlark và sử dụng cc_common API)

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 đó (ví dụ: cc_embed_data). 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.

data

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

Danh sách các tệp mà thư viện này cần trong thời gian chạy. Xem nhận xét chung về data tại Các thuộc tính điển hình được xác định bởi hầu hết các quy tắc xây dựng.

Nếu data là tên của một tệp đã tạo, thì đây là Quy tắc cc_library tự động phụ thuộc vào phương thức tạo .

Nếu data là tên quy tắc, thì đây là Quy tắc cc_library tự động phụ thuộc vào quy tắc đó và outs của quy tắc đó sẽ tự động được thêm vào tệp dữ liệu của cc_library này.

Mã C++ của bạn có thể truy cập vào các tệp dữ liệu này như sau:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

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

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

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

copts

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

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ả đường dẫn phải liên quan đến không gian làm việc, chứ không phải gói hiện tại. Không cần thiết phải có thuộc tính này bên ngoài third_party.

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

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

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

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

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

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

hdrs_check

String; giá trị mặc định là ""

Không được dùng nữa, không hoạt động.
includes

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

Danh sách các thư mục bao gồm sẽ được thêm vào dòng biên dịch. Đối với sự thay thế "Tạo biến". Mỗi chuỗi được thêm vào trước bằng đường dẫn gói và được truyền đến chuỗi công cụ C++ cho mở rộng thông qua "include_paths" tính năng CROSSTOOL. Chuỗi công cụ chạy trên hệ thống POSIX với các định nghĩa tính năng điển hình sẽ tạo ra -isystem path_to_package/include_entry. Bạn chỉ nên sử dụng trình điều khiển này cho các thư viện của bên thứ ba không tuân theo kiểu viết của Google trong câu lệnh #include. 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.

Các đường dẫn include được thêm vào sẽ bao gồm các tệp đã tạo cũng như trong cây nguồn.

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

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

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

linkopts

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

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; giá trị mặc định là False

Tạo thư viện chia sẻ. Để bật thuộc tính này, hãy thêm linkshared=True vào quy tắc của bạn. 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; giá trị mặc định là 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.link_static: 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ể. Các thư viện hệ thống như libc (nhưng không phải là thư viện thời gian chạy C/C++, xem bên dưới) 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.

Nếu thuộc tính linkstatic hoặc fully_static_link trong features được dùng bên ngoài //third_party vui lòng bao gồm nhận xét gần quy tắc để giải thích lý do.

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.

Có rất ít mã được xây dựng bằng linkstatic=False trong phiên bản chính thức. 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

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

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

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

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

Theo mặc định, các tệp nhị phân C++ được liên kết với //tools/cpp:malloc, đó 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.

module_interfaces

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

Danh sách tệp được coi là Giao diện mô-đun C++20.

Tiêu chuẩn C++ không có hạn chế về đuôi tệp giao diện mô-đun

  • Clang sử dụng cppm
  • GCC có thể dùng mọi đuôi tệp nguồn
  • MSVC sử dụng ixx

Hoạt động sử dụng này được cờ bảo vệ --experimental_cpp_modules.

nocopts

String; giá trị mặc định là ""

Xoá các tuỳ chọn trùng khớp khỏi lệnh biên dịch C++. 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ị xoá khỏi COPTS nhằm mục đích biên dịch quy tắc này. Không cần thiết hoặc sử dụng thuộc tính này bên ngoài third_party. Các giá trị không được xử lý trước theo bất kỳ cách nào khác ngoài nhãn "Tạo" thay thế biến.
reexport_deps

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

stamp

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

Liệu có mã hoá thông tin bản dựng thành tệp nhị phân hay không. Cá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

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

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

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

cc_toolchain

Xem nguồn quy tắc
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, 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

Tên; bắt buộc

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

all_files

Nhãn; bắt buộc

Thu thập tất cả cấu phần phần mềm cc_toolchain. Các cấu phần phần mềm này sẽ được thêm làm dữ liệu đầu vào cho tất cả 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

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

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

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

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

Nhãn; bắt buộc

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

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

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

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

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

Nhãn; bắt buộc

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

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

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

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; giá trị mặc định là False

Không dùng nữa. Không hoạt động.
libc_top

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

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

Nhãn; bắt buộc

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

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

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

Nhãn; bắt buộc

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

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

static_runtime_lib

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

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

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

Nhãn; bắt buộc

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

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

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

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

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

Nhãn; bắt buộc

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

String; giá trị mặc định là ""

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

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)

Không dùng nữa: quy tắc không hoạt động và sẽ bị xoá.

Đối số

Thuộc tính
name

Tên; bắt buộc

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

fdo_prefetch_hints

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

Đại diện cho hồ sơ gợi ý tìm nạp trước FDO trong không gian làm việc. Ví dụ:


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

Đối số

Thuộc tính
name

Tên; bắt buộc

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

profile

Nhãn; bắt buộc

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

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

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


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

Đối số

Thuộc tính
name

Tên; bắt buộc

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

memprof_profile

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

Nhãn của hồ sơ MemProf. Hồ sơ dự kiến sẽ có hoặc đuôi .profdata (đối với memprof được lập chỉ mục/ký hiệu profile) hoặc đuôi .zip cho tệp zip chứa memprof.profdata .
profile

Nhãn; bắt buộc

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

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

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

memprof_profile

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

Đại diện cho một cấu hình MEMPROF trong không gian làm việc. Ví dụ:


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

Đối số

Thuộc tính
name

Tên; bắt buộc

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

profile

Nhãn; bắt buộc

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

propeller_optimize

Xem nguồn quy tắc
propeller_optimize(name, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, 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"
)

Đối số

Thuộc tính
name

Tên; bắt buộc

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

cc_profile

Nhãn; bắt buộc

Nhãn của hồ sơ được truyền đến nhiều thao tác biên dịch. Tệp này có đuôi .txt.
ld_profile

Nhãn; bắt buộc

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.