Quy tắc C / C++

Báo cáo vấn đề Xem nguồn Nightly · 8.0 7.4 . 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, conlyopts, copts, cxxopts, 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)

Công cụ 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 đuôi). 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 phải là main.

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

  • name.stripped (chỉ được tạo nếu được yêu cầu rõ ràng): Phiên bản nhị phân đã loại bỏ. strip -g được chạy trên tệp nhị phân để xoá các biểu tượng gỡ lỗi. Bạn có thể cung cấp các tuỳ chọn khác cho tính năng loại bỏ trên dòng lệnh bằng cách sử dụng --stripopt=-foo.
  • name.dwp (chỉ được tạo nếu được yêu cầu rõ ràng): Nếu bạn bật Fission: tệp gói thông tin gỡ lỗi phù hợp để gỡ lỗi các tệp nhị phân được triển khai từ xa. Nếu không: một tệp trống.

Đối số

Thuộc tính
name

Tên; bắt buộc

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

deps

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

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

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

Bạn cũng có thể đặt tập lệnh trình liên kết (.lds) vào phần phụ thuộc và tham chiếu các tập lệnh đó trong linkopts.
srcs

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

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

Các tệp trình tập hợp thuần tuý (.s, .asm) không được xử lý trước và thường được tạo bằng trình tập hợp. Các tệp tập hợp được xử lý trước (.S) được xử lý trước và thường được tạo bằ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 để các nguồn đưa vào theo quy tắc này. Cả tệp .cc.h đều có thể trực tiếp bao gồm các tiêu đề được liệt kê trong srcs này hoặc trong hdrs của quy tắc này hoặc bất kỳ quy tắc nào được liệt kê trong đối số deps.

Tất cả tệp #included phải được đề cập trong thuộc tính hdrs của quy tắc này hoặc quy tắc cc_library được tham chiếu, hoặc phải được liệt kê trong srcs nếu là tệp riêng tư đối với thư viện này. Hãy xem phần "Kiểm tra việc đưa tiêu đề vào" để biết thêm thông tin chi tiết.

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ó các tệp này dưới dạng srcs nếu thư viện đó 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, thì 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 cho việc tạo mã nguồn một lần (để sử dụng nhiều hơn một lần, bạn nên triển khai lớp quy tắc Starlark và sử dụng API cc_common)

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

  • Tệp nguồn C và C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Tệp tiêu đề C và C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Trình tập hợp có trình tiền xử lý C: .S
  • Lưu trữ: .a, .pic.a
  • Thư viện "Luôn liên kết": .lo, .pic.lo
  • Thư viện dùng chung, có phiên bản hoặc không có phiên bản: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

... và mọi quy tắc tạo ra 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; mặc định là []

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

Nếu data là tên của tệp được tạo, thì quy tắc cc_library này sẽ tự động phụ thuộc vào quy tắc tạo.

Nếu data là tên quy tắc, thì quy tắc cc_library này sẽ 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; mặc định là []

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

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

conlyopts

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

Thêm các tuỳ chọn này vào lệnh biên dịch C. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.
copts

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

Thêm các tuỳ chọn này vào lệnh biên dịch C/C++. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.

Mỗi chuỗi trong thuộc tính này được thêm theo thứ tự đã cho vào COPTS trước khi biên dịch mục tiêu tệp nhị phân. Các cờ này chỉ có hiệu lực khi biên dịch mục tiêu này, chứ không phải các phần phụ thuộc của mục tiêu. Vì vậy, hãy cẩn thận với các tệp tiêu đề có trong nơi khác. Tất cả đường dẫn phải tương ứng với không gian làm việc, chứ không phải với gói hiện tại. Bạn không cần thuộc tính này bên ngoài third_party.

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

cxxopts

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

Thêm các tuỳ chọn này vào lệnh biên dịch C++. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.
defines

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

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Chịu sự thay thế của biến"Make"tạo 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, được thêm vào đầu bằng -D và thêm vào dòng lệnh biên dịch cho mục tiêu này, cũng như cho mọi quy tắc phụ thuộc vào mục tiêu này. Hãy cẩn thận vì việc này có thể ảnh hưởng sâu rộng. Khi không chắc chắn, hãy thêm các giá trị xác định vào local_defines.
dynamic_deps

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

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

Việc triển khai cc_shared_library sẽ sử dụng danh sách dynamic_deps (mang tính bắc cầu, 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 deps mang tính bắc cầu không được liên kết vì các cc_libraries đó đã được cung cấp bởi một cc_shared_library khác.

hdrs_check

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

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

Danh sách chuỗi; 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. Chịu sự thay thế của "Tạo biến". Mỗi chuỗi được thêm vào đầu bằng đường dẫn gói và được chuyển đến chuỗi công cụ C++ để mở rộng thông qua tính năng CROSSTOOL "include_paths". Một chuỗi công cụ chạy trên hệ thống POSIX với các định nghĩa tính năng thông thường sẽ tạo ra -isystem path_to_package/include_entry. Bạn chỉ nên sử dụng phương thức này cho các thư viện bên thứ ba không tuân thủ kiểu viết câu lệnh #include của Google. Không giống như COPTS, các cờ này được thêm vào quy tắc này và mọi quy tắc phụ thuộc vào quy tắc này. (Lưu ý: không phải là các quy tắc mà nó phụ thuộc vào!) Hãy cực kỳ cẩn thận vì việc này có thể gây ra những hậu quả sâu rộng. Khi không chắc chắn, hãy thêm cờ "-I" vào COPTS.

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

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

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

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

linkopts

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

Thêm các cờ này vào lệnh của trình liên kết C++. Chịu sự thay thế của biến"Make", tạo mã thông báo Bourne shellmở rộng nhãn. Mỗi chuỗi trong thuộc tính này được thêm vào LINKOPTS trước khi liên kết mục tiêu tệp nhị phân.

Mỗi phần tử của danh sách này không bắt đầu bằng $ hoặc - được giả định là nhãn của một mục tiêu trong deps. Danh sách tệp do mục tiêu đó tạo ra sẽ được thêm vào các tuỳ chọn của trình liên kết. Hệ thống sẽ báo lỗi nếu nhãn không hợp lệ hoặc không được khai báo trong deps.

linkshared

Boolean; mặc định là False

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

Việc có cờ này có nghĩa là việc liên kết sẽ xảy ra với cờ -shared với gcc và thư viện dùng chung thu được sẽ phù hợp để tải vào ví dụ: một chương trình Java. Tuy nhiên, đối với mục đích xây dựng, thư viện này sẽ không bao giờ được liên kết vào tệp nhị phân phụ thuộc, vì giả định rằng các thư viện dùng chung được tạo bằng quy tắc cc_binary chỉ được các chương trình khác tải theo cách thủ công, vì vậy, bạn không nên coi thư viện này là thay thế cho quy tắc cc_library. Để có khả năng mở rộng, bạn nên tránh hoàn toàn phương pháp này và chỉ để java_library phụ thuộc vào các quy tắc cc_library.

Nếu chỉ định cả linkopts=['-static']linkshared=True, bạn sẽ nhận được một đơn vị hoàn toàn độc lập. Nếu chỉ định cả linkstatic=Truelinkshared=True, bạn sẽ nhận được một đơn vị duy nhất, hầu hết là tự chứa.

linkstatic

Boolean; mặc định là True

Đối với cc_binarycc_test: liên kết tệp nhị phân ở chế độ tĩnh. Đối với cc_library.link_static: hãy xem bên dưới.

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

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

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

  • STATIC với tính năng fully_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 thuộc tính features.
  • STATIC, trong đó tất cả thư viện người dùng được liên kết tĩnh (nếu có phiên bản tĩnh), nhưng thư viện hệ thống (ngoại trừ thư viện thời gian chạy C/C++) được liên kết động, ví dụ: "gcc foo.o libfoo.a libbaz.a -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=True.
  • DYNAMIC, trong đó tất cả thư viện được liên kết động (nếu có phiên bản động), ví dụ: "gcc foo.o libfoo.so libbaz.so -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=False.

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

Thuộc tính linkstatic có ý nghĩa khác nếu được sử dụng trên quy tắc cc_library(). Đối với thư viện C++, linkstatic=True cho biết rằng chỉ cho phép liên kết tĩnh, vì vậy sẽ không tạo ra .so. 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.

Sẽ có rất ít mã được tạo bằng linkstatic=False trong bản phát hành chính thức. Nếu là linkstatic=False, thì công cụ bản dựng sẽ tạo các đường liên kết tượng trưng đến thư viện dùng chung phụ thuộc trong vùng *.runfiles.

local_defines

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

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Chịu sự thay thế của biến"Make"tạo 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) được thêm vào đầu bằng -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 thêm vào các phần phụ thuộc của mục tiêu.
malloc

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

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

Theo mặc định, các tệp nhị phân C++ được liên kết với //tools/cpp:malloc, là một thư viện trống nên tệp nhị phân sẽ sử dụng libc malloc. Nhãn này phải tham chiếu đến cc_library. Nếu quá trình biên dịch là cho một quy tắc không phải C++, thì tuỳ chọn này sẽ không có hiệu lực. Giá trị của thuộc tính này sẽ bị bỏ qua nếu bạn chỉ định linkshared=True.

module_interfaces

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

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

C++ Standard không có quy định hạn chế về đuôi tệp giao diện mô-đun

  • Clang sử dụng cppm
  • GCC có thể sử dụng bất kỳ đuôi tệp nguồn nào
  • MSVC sử dụng ixx

Việc sử dụng được bảo vệ bằng cờ --experimental_cpp_modules.

nocopts

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

Xoá các tuỳ chọn trùng khớp khỏi lệnh biên dịch C++. Chịu sự thay thế của biến"Make". Giá trị của thuộc tính này được diễn giải dưới dạng biểu thức chính quy. Mọi COPTS có sẵn khớp với biểu thức chính quy này (bao gồm cả các giá trị được chỉ định rõ ràng trong thuộc tính copts của quy tắc) sẽ bị xoá khỏi COPTS cho mục đích biên dịch quy tắc này. Bạn không cần thiết phải 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 việc thay thế biến "Make".
reexport_deps

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

stamp

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

Có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Các giá trị có thể là:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong các bản dựng --nostamp. Bạn nên tránh chế độ cài đặt này vì chế độ này có thể huỷ kích hoạt tính năng lưu vào bộ nhớ đệm từ xa cho tệp nhị phân và mọi thao tác tiếp theo phụ thuộc vào tệp nhị phân đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị không đổi. Điều này giúp lưu kết quả bản dựng vào bộ nhớ đệm hiệu quả.
  • stamp = -1: Việc nhúng thông tin bản dựng được kiểm soát bằng cờ --[no]stamp.

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

win_def_file

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

Tệp DEF của Windows sẽ được chuyển đến trình liên kết.

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

cc_import

Xem nguồn quy tắc
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, 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)

Quy tắc cc_import cho phép người dùng nhập thư viện C/C++ được biên dịch trước.

Sau đây là các trường hợp sử dụng thông thường:
1. Liên kết thư viện tĩnh


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = True,
)
2. Liên kết thư viện dùng chung (Unix)

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Liên kết thư viện dùng chung với thư viện giao diện

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. Liên kết thư viện dùng chung 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 = True,
)

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 = True,
)
5. Liên kết đến thư viện tĩnh hoặc thư viện dùng chung

Trên Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

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 = True, # default value
)

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

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; mặc định là []

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

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

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

Boolean; mặc định là False

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

Nếu alwayslink không hoạt động với VS 2017 trên Windows, thì đó là do một lỗi đã biết. Vui lòng nâng cấp VS 2017 lên phiên bản mới nhất.

includes

Danh sách chuỗi; 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. Chịu sự thay thế của "Tạo biến". Mỗi chuỗi được thêm vào đầu bằng đường dẫn gói và được chuyển đến chuỗi công cụ C++ để mở rộng thông qua tính năng CROSSTOOL "include_paths". Một chuỗi công cụ chạy trên hệ thống POSIX với các định nghĩa tính năng thông thường sẽ tạo ra -isystem path_to_package/include_entry. Bạn chỉ nên sử dụng phương thức này cho các thư viện bên thứ ba không tuân thủ kiểu viết câu lệnh #include của Google. Không giống như COPTS, các cờ này được thêm vào quy tắc này và mọi quy tắc phụ thuộc vào quy tắc này. (Lưu ý: không phải là các quy tắc mà nó phụ thuộc vào!) Hãy cực kỳ cẩn thận vì việc này có thể gây ra những hậu quả sâu rộng. Khi không chắc chắn, hãy thêm cờ "-I" vào COPTS.

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

interface_library

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

Một thư viện giao diện duy nhất để liên kết thư viện dùng chung.

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

linkopts

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

Thêm các cờ này vào lệnh của trình liên kết C++. Chịu sự thay thế của biến"Make", tạo mã thông báo Bourne shellmở rộng nhãn. Mỗi chuỗi trong thuộc tính này được thêm vào LINKOPTS trước khi liên kết mục tiêu tệp nhị phân.

Mỗi phần tử của danh sách này không bắt đầu bằng $ hoặc - được giả định là nhãn của một mục tiêu trong deps. Danh sách tệp do mục tiêu đó tạo ra sẽ được thêm vào các tuỳ chọn của trình liên kết. Hệ thống sẽ báo lỗi nếu nhãn không hợp lệ hoặc không được khai báo trong deps.

objects

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

pic_objects

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

pic_static_library

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

shared_library

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

Một thư viện dùng chung được biên dịch trước. Bazel đảm bảo rằng tệp này có sẵn cho tệp nhị phân phụ thuộc vào tệp đó trong thời gian chạy.

Các loại tệp được phép: .so, .dll hoặc .dylib

static_library

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

Một thư viện tĩnh được biên dịch trước.

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

system_provided

Boolean; mặc định là False

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

cc_library

Xem nguồn quy tắc
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, conlyopts, copts, cxxopts, 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 bằng C++. Kết quả là .so, .lo hoặc .a, tuỳ thuộc vào nhu cầu.

Nếu bạn tạo một nội dung nào đó bằng tính năng liên kết tĩnh phụ thuộc vào cc_library, thì kết quả của quy tắc thư viện phụ thuộc sẽ là tệp .a. Nếu 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 dùng chung, trong đó foo là tên của quy tắc. Các loại thư viện khác kết thúc bằng .lo.a tương ứng. Nếu bạn cần một tên thư viện dùng chung cụ thể, chẳng hạn như để xác định một mô-đun Python, hãy sử dụng genrule để sao chép thư viện sang tên mong muốn.

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

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

Đối với các quy tắc cc_library, tiêu đề trong hdrs bao gồm giao diện công khai của thư viện và có thể được đưa trực tiếp vào cả các tệp trong hdrssrcs của chính thư viện cũng như từ các tệp trong hdrssrcs của các quy tắc cc_* liệt kê thư viện trong deps. Bạn chỉ được đưa tiêu đề trong srcs trực tiếp từ các tệp trong hdrssrcs của chính thư viện. Khi quyết định đặt tiêu đề vào hdrs hay srcs, bạn nên tự hỏi liệu bạn có muốn người dùng thư viện này có thể trực tiếp đưa tiêu đề vào hay không. Quyết định này gần giống với quyết định về chế độ hiển thị publicprivate trong ngôn ngữ lập trình.

Quy tắc cc_binarycc_test không có giao diện được xuất, do đó, các quy tắc này 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 kiểm thử trực tiếp phải được liệt kê trong srcs.

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


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

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

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

Các 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 không được đưa baz.h vào.

Bao gồm tệpNội dung được phép đưa vào
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

Quy tắc kiểm tra việc đưa vào chỉ áp dụng cho các trường hợp đưa vào trực tiếp. Trong ví dụ trên, foo.cc được phép chứa bar.h, có thể chứa baz.h, và baz.h lại được phép chứa baz-impl.h. Về mặt kỹ thuật, quá trình biên dịch tệp .cc có thể bao gồm bất kỳ tệp tiêu đề nào trong hdrs hoặc srcs trong bất kỳ cc_library nào trong phạm vi đóng deps bắc cầu. Trong trường hợp này, trình biên dịch có thể đọc baz.hbaz-impl.h khi biên dịch foo.cc, nhưng foo.cc không được chứa #include "baz.h". Để được phép, bạn phải thêm baz vào deps của 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. Chuỗi công cụ phải hỗ trợ tính năng layering_check và yêu cầu một cách rõ ràng, chẳng hạn như thông qua cờ dòng lệnh --features=layering_check hoặc tham số features của hàm package. Chuỗi công cụ do Bazel cung cấp chỉ hỗ trợ tính năng này với 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 đây đến 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 này chỉ định tuỳ 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 đến từ third_party/kde/BUILD. Chúng tôi lưu giữ các tệp .so tạo sẵn trong kho lưu trữ. Các tệp tiêu đề nằm trong một 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 đến 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; mặc định là []

Danh sách các thư viện khác mà mục tiêu thư viện phụ thuộc vào.

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

Xem các nhận xét chung về deps tại phần Các thuộc tính thông thường do hầu hết các quy tắc bản dựng xác định.

Đây phải là tên của các quy tắc thư viện C++. Khi tạo một tệp nhị phân liên kết với 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ó tên là "phần phụ thuộc", nhưng không phải tất cả ứng dụng của thư viện này đều thuộc về thư mục này. Các phần phụ thuộc dữ liệu trong thời gian chạy thuộc về data. Các tệp nguồn do các quy tắc khác tạo ra thuộc srcs.

Để liên kết trong thư viện 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.

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

srcs

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

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

Các tệp trình tập hợp thuần tuý (.s, .asm) không được xử lý trước và thường được tạo bằng trình tập hợp. Các tệp tập hợp được xử lý trước (.S) được xử lý trước và thường được tạo bằ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 để các nguồn đưa vào theo quy tắc này. Cả tệp .cc.h đều có thể trực tiếp bao gồm các tiêu đề được liệt kê trong srcs này hoặc trong hdrs của quy tắc này hoặc bất kỳ quy tắc nào được liệt kê trong đối số deps.

Tất cả tệp #included phải được đề cập trong thuộc tính hdrs của quy tắc này hoặc quy tắc cc_library được tham chiếu, hoặc phải được liệt kê trong srcs nếu là tệp riêng tư đối với thư viện này. Hãy xem phần "Kiểm tra việc đưa tiêu đề vào" để biết thêm thông tin chi tiết.

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ó các tệp này dưới dạng srcs nếu thư viện đó 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, thì 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 cho việc tạo mã nguồn một lần (để sử dụng nhiều hơn một lần, bạn nên triển khai lớp quy tắc Starlark và sử dụng API cc_common)

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

  • Tệp nguồn C và C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Tệp tiêu đề C và C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Trình tập hợp có trình tiền xử lý C: .S
  • Lưu trữ: .a, .pic.a
  • Thư viện "Luôn liên kết": .lo, .pic.lo
  • Thư viện dùng chung, có phiên bản hoặc không có phiên bản: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

... và mọi quy tắc tạo ra 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; mặc định là []

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

Nếu data là tên của tệp được tạo, thì quy tắc cc_library này sẽ tự động phụ thuộc vào quy tắc tạo.

Nếu data là tên quy tắc, thì quy tắc cc_library này sẽ 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; mặc định là []

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

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

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

additional_compiler_inputs

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

Mọi tệp bổ sung mà bạn có thể muốn truyền đến dòng lệnh trình biên dịch, chẳng hạn như danh sách bỏ qua trình dọn dẹp. Sau đó, bạn có thể sử dụng các tệp được chỉ định tại đây trong copts bằng hàm $(location).
additional_linker_inputs

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

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

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

Boolean; mặc định là False

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

Nếu alwayslink không hoạt động với VS 2017 trên Windows, thì đó là do một lỗi đã biết. Vui lòng nâng cấp VS 2017 lên phiên bản mới nhất.

conlyopts

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

Thêm các tuỳ chọn này vào lệnh biên dịch C. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.
copts

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

Thêm các tuỳ chọn này vào lệnh biên dịch C/C++. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.

Mỗi chuỗi trong thuộc tính này được thêm theo thứ tự đã cho vào COPTS trước khi biên dịch mục tiêu tệp nhị phân. Các cờ này chỉ có hiệu lực khi biên dịch mục tiêu này, chứ không phải các phần phụ thuộc của mục tiêu. Vì vậy, hãy cẩn thận với các tệp tiêu đề có trong nơi khác. Tất cả đường dẫn phải tương ứng với không gian làm việc, chứ không phải với gói hiện tại. Bạn không cần thuộc tính này bên ngoài third_party.

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

cxxopts

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

Thêm các tuỳ chọn này vào lệnh biên dịch C++. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.
defines

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

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Chịu sự thay thế của biến"Make"tạo 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, được thêm vào đầu bằng -D và thêm vào dòng lệnh biên dịch cho mục tiêu này, cũng như cho mọi quy tắc phụ thuộc vào mục tiêu này. Hãy cẩn thận vì việc này có thể ảnh hưởng sâu rộng. Khi không chắc chắn, hãy thêm các giá trị xác định vào local_defines.
hdrs_check

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

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

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

Danh sách các thư viện khác mà mục tiêu thư viện phụ thuộc vào. Không giống như deps, các tiêu đề và đường dẫn bao gồm của các thư viện này (và tất cả phần phụ thuộc bắc cầu của chúng) chỉ được dùng để biên dịch thư viện này chứ không phải các thư viện phụ thuộc vào thư viện này. Các thư viện được chỉ định bằng implementation_deps vẫn được liên kết trong các mục tiêu nhị phân phụ thuộc vào thư viện này.
include_prefix

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

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

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

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

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

includes

Danh sách chuỗi; 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. Chịu sự thay thế của "Tạo biến". Mỗi chuỗi được thêm vào đầu bằng đường dẫn gói và được chuyển đến chuỗi công cụ C++ để mở rộng thông qua tính năng CROSSTOOL "include_paths". Một chuỗi công cụ chạy trên hệ thống POSIX với các định nghĩa tính năng thông thường sẽ tạo ra -isystem path_to_package/include_entry. Bạn chỉ nên sử dụng phương thức này cho các thư viện bên thứ ba không tuân thủ kiểu viết câu lệnh #include của Google. Không giống như COPTS, các cờ này được thêm vào quy tắc này và mọi quy tắc phụ thuộc vào quy tắc này. (Lưu ý: không phải là các quy tắc mà nó phụ thuộc vào!) Hãy cực kỳ cẩn thận vì việc này có thể gây ra những hậu quả sâu rộng. Khi không chắc chắn, hãy thêm cờ "-I" vào COPTS.

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

linkopts

Danh sách chuỗi; 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 hoặc gián tiếp vào thư viện này thông qua các thuộc tính deps (hoặc thông qua các thuộc tính khác được xử lý tương tự: thuộc tính malloc của cc_binary). Các tuỳ chọn liên kết phần phụ thuộc sẽ được ưu tiên hơn các tuỳ chọn liên kết phần phụ thuộc (tức là các tuỳ chọn liên kết phần phụ thuộc sẽ xuất hiện sau trong dòng lệnh). Các linkopts được chỉ định trong --linkopt sẽ được ưu tiên hơn các linkopts của 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 áp dụng khi tạo tệp .a hoặc .lo. Vì vậy, nếu bạn đặt thuộc tính linkstatic=True, thì thuộc tính linkopts sẽ không ảnh hưởng đến việc tạo thư viện này, mà chỉ ảnh hưởng đế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à các tuỳ chọn "-Wl,-soname" hoặc "-Xlinker -soname" không được hỗ trợ và không bao giờ được chỉ định trong thuộc tính này.

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

linkstamp

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

Đồng thời biên dịch và liên kết tệp nguồn C++ đã chỉ định vào tệp nhị phân cuối cùng. Thủ thuật này là cần thiết để đưa thông tin dấu thời gian vào tệp nhị phân; nếu chúng ta biên dịch tệp nguồn thành tệp đối tượng theo cách thông thường, thì dấu thời gian sẽ không chính xác. Quá trình biên dịch dấu vết liên kết không được bao gồm bất kỳ tập hợp cờ trình biên dịch cụ thể nào và do đó không được phụ thuộc vào bất kỳ tiêu đề, tuỳ chọn trình biên dịch hoặc biến bản dựng nào khác. Bạn chỉ cần tuỳ chọn này trong gói base.
linkstatic

Boolean; mặc định là False

Đối với cc_binarycc_test: liên kết tệp nhị phân ở chế độ tĩnh. Đối với cc_library.link_static: hãy xem bên dưới.

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

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

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

  • STATIC với tính năng fully_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 thuộc tính features.
  • STATIC, trong đó tất cả thư viện người dùng được liên kết tĩnh (nếu có phiên bản tĩnh), nhưng thư viện hệ thống (ngoại trừ thư viện thời gian chạy C/C++) được liên kết động, ví dụ: "gcc foo.o libfoo.a libbaz.a -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=True.
  • DYNAMIC, trong đó tất cả thư viện được liên kết động (nếu có phiên bản động), ví dụ: "gcc foo.o libfoo.so libbaz.so -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=False.

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

Thuộc tính linkstatic có ý nghĩa khác nếu được sử dụng trên quy tắc cc_library(). Đối với thư viện C++, linkstatic=True cho biết rằng chỉ cho phép liên kết tĩnh, vì vậy sẽ không tạo ra .so. 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.

Sẽ có rất ít mã được tạo bằng linkstatic=False trong bản phát hành chính thức. Nếu là linkstatic=False, thì công cụ bản dựng sẽ tạo các đường liên kết tượng trưng đến thư viện dùng chung phụ thuộc trong vùng *.runfiles.

local_defines

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

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Chịu sự thay thế của biến"Make"tạo 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) được thêm vào đầu bằng -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 thêm vào các phần phụ thuộc của mục tiêu.
module_interfaces

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

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

C++ Standard không có quy định hạn chế về đuôi tệp giao diện mô-đun

  • Clang sử dụng cppm
  • GCC có thể sử dụng bất kỳ đuôi tệp nguồn nào
  • MSVC sử dụng ixx

Việc sử dụng được bảo vệ bằng cờ --experimental_cpp_modules.

strip_include_prefix

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

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

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

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

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

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

textual_hdrs

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

Danh sách các tệp tiêu đề do thư viện này phát hành để các nguồn đưa vào văn bản theo quy tắc phụ thuộc.

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

win_def_file

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

Tệp DEF của Windows sẽ được chuyển đến trình liên kết.

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

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, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)

Công cụ này tạo ra một thư viện dùng chung.

Ví dụ:

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

Trong ví dụ này, foo_shared liên kết tĩnh foobaz, trong đó baz là phần phụ thuộc bắc cầu. Phương thức này không liên kết bar vì phương thức này đã được cung cấp linh độ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 biểu tượng nào sẽ được xuất. Logic quy tắc cc_shared_library không kiểm soát việc xuất biểu tượng nào, mà chỉ sử dụng những biểu tượng được giả định là sẽ xuất để đưa ra lỗi trong giai đoạn phân tích nếu hai thư viện dùng chung xuất cùng một mục tiêu.

Mọi phần phụ thuộc trực tiếp của cc_shared_library đều được giả định là được xuất. Do đó, trong quá trình phân tích, Bazel giả định rằng foo đang được foo_shared xuất. baz không được giả định là được xuất bởi 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 trong ví dụ chỉ được xuất hiện tối đa trong một cc_shared_library. Nếu muốn liên kết baz vào bar_shared, chúng ta cần thêm tags = ["LINKABLE_MORE_THAN_ONCE"] vào baz.

Do thuộc tính shared_lib_name, tệp do bar_shared tạo sẽ có tên là bar.so thay vì tên libbar.so theo mặc định trên Linux.

Lỗi

Two shared libraries in dependencies export the same symbols.

Điều này sẽ xảy ra bất cứ khi nào bạn tạo một mục tiêu có hai phần phụ thuộc cc_shared_library khác nhau xuất cùng một mục tiêu. Để khắc phục vấn đề này, bạn cần dừng việc xuất thư viện trong một trong các phần phụ thuộc cc_shared_library.

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

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

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

Điều này có nghĩa là bạn có thể truy cập vào một thư viện trong tập hợp đóng bắc cầu của deps mà không cần phải truy cập vào một trong các phần phụ thuộc cc_shared_library, nhưng thư viện này đã đượ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 là xuất tệp này từ phần phụ thuộc cc_shared_library hoặc lấy một cc_shared_library thứ ba để xuất tệp 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ì thư viện này không cần và không thể được liên kết tĩnh vào mục tiêu cc_shared_library hiện tại mà bạn đang tạo. Do đó, thuộc tính này không thuộc deps của cc_shared_library. Nếu thư viện động được biên dịch trước này là phần phụ thuộc của một cc_libraries, thì cc_library cần trực tiếp phụ thuộc vào thư viện đó.

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

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

Để khắc phục vấn đề này, hãy xoá mục tiêu khỏi deps và chỉ dựa vào mục tiêu đó từ phần phụ thuộc động hoặc đảm bảo rằng exports_filter không 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; mặc định là []

Các thư viện cấp cao nhất sẽ được liên kết tĩnh vào 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ào thư viện dùng chung này, miễn là các phần phụ thuộc đó 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 mọi mục tiêu được liệt kê trong deps là do thư viện dùng chung xuất ra để đưa ra lỗi khi nhiều cc_shared_libraries xuất cùng một mục tiêu. Việc triển khai quy tắc không thông báo cho trình liên kết về các biểu tượng mà đối tượng dùng chung sẽ xuất. Người dùng nên xử lý vấn đề này thông qua tập lệnh trình liên kết hoặc khai báo chế độ hiển thị trong mã nguồn.

Quá trình triển khai cũng sẽ kích hoạt lỗi bất cứ khi nào cùng một thư viện được liên kết tĩnh và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" vào cc_library.tags hoặc bằng cách liệt kê "cc_library" dưới dạng một tệp xuất của một trong các thư viện dùng chung để có thể tạo một dynamic_dep của thư viện khác.

additional_linker_inputs

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

Mọi tệp bổ sung mà bạn có thể muốn truyền đến trình liên kết, 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 tệp này. Bạn có thể thực hiện việc này thông qua thuộc tính user_link_flags.
dynamic_deps

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

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

Việc triển khai cc_shared_library sẽ sử dụng danh sách dynamic_deps (mang tính bắc cầu, 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 deps mang tính bắc cầu không được liên kết vì các cc_libraries đó đã được cung cấp bởi một cc_shared_library khác.

exports_filter

Danh sách chuỗi; 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à do thư viện dùng chung hiện tại xuất.

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

Xin lưu ý rằng thuộc tính này không thực sự thêm cạnh phần phụ thuộc vào các mục tiêu đó, mà cạnh phần phụ thuộc sẽ do deps tạo.Các mục nhập trong thuộc tính này chỉ là chuỗi. Xin lưu ý rằng khi đặt một mục tiêu trong thuộc tính này, đây được coi là tuyên bố rằng thư viện dùng chung sẽ xuất các biểu tượng từ mục tiêu đó. Logic cc_shared_library thực sự không xử lý việc cho trình liên kết biết nên xuất biểu tượng nào.

Cú pháp sau đây được cho phép:

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

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

roots

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

shared_lib_name

Chuỗi; 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 dùng chung dựa trên tên của mục tiêu và nền tảng. Tên này bao gồm một phần mở rộng và đôi khi là một tiền tố. Đôi khi, bạn có thể không muốn tên mặc định, ví dụ: khi tải thư viện dùng chung C++ cho Python, tiền tố lib* mặc định thường không mong muốn, trong trường hợp này, bạn có thể sử dụng thuộc tính này để chọn tên tuỳ chỉnh.
static_deps

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

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

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

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

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

Tệp DEF của Windows sẽ được chuyển đến trình liên kết.

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

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)
Quy tắc này hiện đang trong giai đoạn thử nghiệm và chỉ có thể sử dụng với cờ --experimental_cc_static_library. Tạo một thư viện tĩnh từ danh sách các mục tiêu và 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 mục tiêu đó, ưu tiên các đố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 bất kỳ tệp đối tượng nào vào thư viện tĩnh, nhưng cung cấp ít nhất một thư viện tĩnh, động hoặc giao diện. Thư viện tĩnh thu được có thể yêu cầu các thư viện này có sẵn 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ả 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.

Ký hiệu trùng lặp

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

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

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

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

  • Triển khai thao tác ACTION_NAMES.validate_static_library và bật thao tác đó bằng tính năng symbol_check. Công cụ được đặt trong thao tác đượ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 tệp phải được tạo nếu quá trình kiểm tra thành công.
  • Tính năng symbol_check thêm cờ trình lưu trữ khiến thao tác tạo thư viện tĩnh không thành công trên các 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; mặc định là []

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

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 thư viện tĩnh, nhưng nhãn của các phần phụ thuộc này sẽ được thu thập trong tệp do nhóm đầu ra linkdeps cung cấp.

cc_test

Xem nguồn quy tắc
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, 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 chương trình kiểm thử. Ở đây, kiểm thử là một trình bao bọc tệp 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 động.
Để liên kết tĩnh một kiểm thử đơn vị, hãy chỉ định linkstatic=True. Bạn nên bình luận lý do kiểm thử của mình cần linkstatic; điều này có thể không rõ ràng.

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

  • name.stripped (chỉ được tạo nếu được yêu cầu rõ ràng): Phiên bản nhị phân đã loại bỏ. strip -g được chạy trên tệp nhị phân để xoá các biểu tượng gỡ lỗi. Bạn có thể cung cấp các tuỳ chọn khác cho tính năng loại bỏ trên dòng lệnh bằng cách sử dụng --stripopt=-foo.
  • name.dwp (chỉ được tạo nếu được yêu cầu rõ ràng): Nếu bạn bật Fission: tệp gói thông tin gỡ lỗi phù hợp để gỡ lỗi các tệp nhị phân được triển khai từ xa. Nếu không: một tệp trống.

Xem các đối số cc_binary(), ngoại trừ đối số stamp được đặt thành 0 theo mặc định cho các chương trình kiểm thử và cc_test có thêm các thuộc tính phổ biến cho tất cả 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; mặc định là []

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

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

Bạn cũng có thể đặt tập lệnh trình liên kết (.lds) vào phần phụ thuộc và tham chiếu các tập lệnh đó trong linkopts.
srcs

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

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

Các tệp trình tập hợp thuần tuý (.s, .asm) không được xử lý trước và thường được tạo bằng trình tập hợp. Các tệp tập hợp được xử lý trước (.S) được xử lý trước và thường được tạo bằ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 để các nguồn đưa vào theo quy tắc này. Cả tệp .cc.h đều có thể trực tiếp bao gồm các tiêu đề được liệt kê trong srcs này hoặc trong hdrs của quy tắc này hoặc bất kỳ quy tắc nào được liệt kê trong đối số deps.

Tất cả tệp #included phải được đề cập trong thuộc tính hdrs của quy tắc này hoặc quy tắc cc_library được tham chiếu, hoặc phải được liệt kê trong srcs nếu là tệp riêng tư đối với thư viện này. Hãy xem phần "Kiểm tra việc đưa tiêu đề vào" để biết thêm thông tin chi tiết.

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ó các tệp này dưới dạng srcs nếu thư viện đó 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, thì 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 cho việc tạo mã nguồn một lần (để sử dụng nhiều hơn một lần, bạn nên triển khai lớp quy tắc Starlark và sử dụng API cc_common)

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

  • Tệp nguồn C và C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Tệp tiêu đề C và C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Trình tập hợp có trình tiền xử lý C: .S
  • Lưu trữ: .a, .pic.a
  • Thư viện "Luôn liên kết": .lo, .pic.lo
  • Thư viện dùng chung, có phiên bản hoặc không có phiên bản: .so, .so.version
  • Tệp đối tượng: .o, .pic.o

... và mọi quy tắc tạo ra 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; mặc định là []

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

Nếu data là tên của tệp được tạo, thì quy tắc cc_library này sẽ tự động phụ thuộc vào quy tắc tạo.

Nếu data là tên quy tắc, thì quy tắc cc_library này sẽ 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; mặc định là []

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

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

conlyopts

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

Thêm các tuỳ chọn này vào lệnh biên dịch C. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.
copts

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

Thêm các tuỳ chọn này vào lệnh biên dịch C/C++. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.

Mỗi chuỗi trong thuộc tính này được thêm theo thứ tự đã cho vào COPTS trước khi biên dịch mục tiêu tệp nhị phân. Các cờ này chỉ có hiệu lực khi biên dịch mục tiêu này, chứ không phải các phần phụ thuộc của mục tiêu. Vì vậy, hãy cẩn thận với các tệp tiêu đề có trong nơi khác. Tất cả đường dẫn phải tương ứng với không gian làm việc, chứ không phải với gói hiện tại. Bạn không cần thuộc tính này bên ngoài third_party.

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

cxxopts

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

Thêm các tuỳ chọn này vào lệnh biên dịch C++. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.
defines

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

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Chịu sự thay thế của biến"Make"tạo 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, được thêm vào đầu bằng -D và thêm vào dòng lệnh biên dịch cho mục tiêu này, cũng như cho mọi quy tắc phụ thuộc vào mục tiêu này. Hãy cẩn thận vì việc này có thể ảnh hưởng sâu rộng. Khi không chắc chắn, hãy thêm các giá trị xác định vào local_defines.
dynamic_deps

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

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

Việc triển khai cc_shared_library sẽ sử dụng danh sách dynamic_deps (mang tính bắc cầu, 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 deps mang tính bắc cầu không được liên kết vì các cc_libraries đó đã được cung cấp bởi một cc_shared_library khác.

hdrs_check

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

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

Danh sách chuỗi; 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. Chịu sự thay thế của "Tạo biến". Mỗi chuỗi được thêm vào đầu bằng đường dẫn gói và được chuyển đến chuỗi công cụ C++ để mở rộng thông qua tính năng CROSSTOOL "include_paths". Một chuỗi công cụ chạy trên hệ thống POSIX với các định nghĩa tính năng thông thường sẽ tạo ra -isystem path_to_package/include_entry. Bạn chỉ nên sử dụng phương thức này cho các thư viện bên thứ ba không tuân thủ kiểu viết câu lệnh #include của Google. Không giống như COPTS, các cờ này được thêm vào quy tắc này và mọi quy tắc phụ thuộc vào quy tắc này. (Lưu ý: không phải là các quy tắc mà nó phụ thuộc vào!) Hãy cực kỳ cẩn thận vì việc này có thể gây ra những hậu quả sâu rộng. Khi không chắc chắn, hãy thêm cờ "-I" vào COPTS.

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

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

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

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

linkopts

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

Thêm các cờ này vào lệnh của trình liên kết C++. Chịu sự thay thế của biến"Make", tạo mã thông báo Bourne shellmở rộng nhãn. Mỗi chuỗi trong thuộc tính này được thêm vào LINKOPTS trước khi liên kết mục tiêu tệp nhị phân.

Mỗi phần tử của danh sách này không bắt đầu bằng $ hoặc - được giả định là nhãn của một mục tiêu trong deps. Danh sách tệp do mục tiêu đó tạo ra sẽ được thêm vào các tuỳ chọn của trình liên kết. Hệ thống sẽ báo lỗi nếu nhãn không hợp lệ hoặc không được khai báo trong deps.

linkshared

Boolean; mặc định là False

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

Việc có cờ này có nghĩa là việc liên kết sẽ xảy ra với cờ -shared với gcc và thư viện dùng chung thu được sẽ phù hợp để tải vào ví dụ: một chương trình Java. Tuy nhiên, đối với mục đích xây dựng, thư viện này sẽ không bao giờ được liên kết vào tệp nhị phân phụ thuộc, vì giả định rằng các thư viện dùng chung được tạo bằng quy tắc cc_binary chỉ được các chương trình khác tải theo cách thủ công, vì vậy, bạn không nên coi thư viện này là thay thế cho quy tắc cc_library. Để có khả năng mở rộng, bạn nên tránh hoàn toàn phương pháp này và chỉ để java_library phụ thuộc vào các quy tắc cc_library.

Nếu chỉ định cả linkopts=['-static']linkshared=True, bạn sẽ nhận được một đơn vị hoàn toàn độc lập. Nếu chỉ định cả linkstatic=Truelinkshared=True, bạn sẽ nhận được một đơn vị duy nhất, hầu hết là tự chứa.

linkstatic

Boolean; mặc định là False

Đối với cc_binarycc_test: liên kết tệp nhị phân ở chế độ tĩnh. Đối với cc_library.link_static: hãy xem bên dưới.

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

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

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

  • STATIC với tính năng fully_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 thuộc tính features.
  • STATIC, trong đó tất cả thư viện người dùng được liên kết tĩnh (nếu có phiên bản tĩnh), nhưng thư viện hệ thống (ngoại trừ thư viện thời gian chạy C/C++) được liên kết động, ví dụ: "gcc foo.o libfoo.a libbaz.a -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=True.
  • DYNAMIC, trong đó tất cả thư viện được liên kết động (nếu có phiên bản động), ví dụ: "gcc foo.o libfoo.so libbaz.so -lm".
    Chế độ này được bật bằng cách chỉ định linkstatic=False.

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

Thuộc tính linkstatic có ý nghĩa khác nếu được sử dụng trên quy tắc cc_library(). Đối với thư viện C++, linkstatic=True cho biết rằng chỉ cho phép liên kết tĩnh, vì vậy sẽ không tạo ra .so. 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.

Sẽ có rất ít mã được tạo bằng linkstatic=False trong bản phát hành chính thức. Nếu là linkstatic=False, thì công cụ bản dựng sẽ tạo các đường liên kết tượng trưng đến thư viện dùng chung phụ thuộc trong vùng *.runfiles.

local_defines

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

Danh sách các định nghĩa cần thêm vào dòng biên dịch. Chịu sự thay thế của biến"Make"tạo 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) được thêm vào đầu bằng -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 thêm vào các phần phụ thuộc của mục tiêu.
malloc

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

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

Theo mặc định, các tệp nhị phân C++ được liên kết với //tools/cpp:malloc, là một thư viện trống nên tệp nhị phân sẽ sử dụng libc malloc. Nhãn này phải tham chiếu đến cc_library. Nếu quá trình biên dịch là cho một quy tắc không phải C++, thì tuỳ chọn này sẽ không có hiệu lực. Giá trị của thuộc tính này sẽ bị bỏ qua nếu bạn chỉ định linkshared=True.

module_interfaces

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

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

C++ Standard không có quy định hạn chế về đuôi tệp giao diện mô-đun

  • Clang sử dụng cppm
  • GCC có thể sử dụng bất kỳ đuôi tệp nguồn nào
  • MSVC sử dụng ixx

Việc sử dụng được bảo vệ bằng cờ --experimental_cpp_modules.

nocopts

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

Xoá các tuỳ chọn trùng khớp khỏi lệnh biên dịch C++. Chịu sự thay thế của biến"Make". Giá trị của thuộc tính này được diễn giải dưới dạng biểu thức chính quy. Mọi COPTS có sẵn khớp với biểu thức chính quy này (bao gồm cả các giá trị được chỉ định rõ ràng trong thuộc tính copts của quy tắc) sẽ bị xoá khỏi COPTS cho mục đích biên dịch quy tắc này. Bạn không cần thiết phải 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 việc thay thế biến "Make".
reexport_deps

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

stamp

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

Có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Các giá trị có thể là:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong các bản dựng --nostamp. Bạn nên tránh chế độ cài đặt này vì chế độ này có thể huỷ kích hoạt tính năng lưu vào bộ nhớ đệm từ xa cho tệp nhị phân và mọi thao tác tiếp theo phụ thuộc vào tệp nhị phân đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị không đổi. Điều này giúp lưu kết quả bản dựng vào bộ nhớ đệm hiệu quả.
  • stamp = -1: Việc nhúng thông tin bản dựng được kiểm soát bằng cờ --[no]stamp.

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

win_def_file

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

Tệp DEF của Windows sẽ được chuyển đến trình liên kết.

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

cc_toolchain

Xem nguồn quy tắc
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_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:

  • Thu thập tất cả cấu phần phần mềm cần thiết để các thao tác C++ chạy. Việc này được thực hiện bằng các thuộc tính như all_files, compiler_files, linker_files hoặc các thuộc tính khác có đuôi là _files). Đây là các nhóm tệp phổ biến nhất, tổng hợp tất cả các tệp bắt buộc.
  • Tạo dòng lệnh chính xác cho các thao tác C++. Bạn có thể thực hiện việc này bằng cách sử dụng nhà cung cấp CcToolchainConfigInfo (thông tin chi tiết bên dưới).

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

Sử dụng tags = ["manual"] để ngăn việc 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

Bộ sưu tập tất cả cấu phần phần mềm cc_toolchain. Các cấu phần phần mềm này sẽ được thêm vào dưới dạng dữ liệu đầu vào cho tất cả các hành động liên quan đến rules_cc (ngoại trừ các hành động đang sử dụng các tập hợp cấu phần phần mềm chính xác hơn từ các thuộc tính bên dưới). Bazel giả định rằng all_files là tập hợp con 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 dấu vết liên kết cần cả tệp biên dịch và tệp liên kết, vì vậy, quá trình này sẽ mất all_files).

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

ar_files

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

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

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

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

Nhãn; bắt buộc

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

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

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

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

Tập hợp tất cả cấu phần phần mềm cc_toolchain cần thiết cho các hành động về mức độ sử dụng. Nếu không chỉ định, hệ thống sẽ sử dụng all_files.
dwp_files

Nhãn; bắt buộc

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

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

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

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

exec_transition_for_inputs

Boolean; mặc định là False

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

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

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

Nhãn; bắt buộc

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

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

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

Nhãn; bắt buộc

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

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

static_runtime_lib

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

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

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

strip_files

Nhãn; bắt buộc

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

Boolean; 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; mặc định là True

Đặt thành True khi cc_toolchain hỗ trợ sử dụng tệp param để liên kết các thao tác.
toolchain_config

Nhãn; bắt buộc

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

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

Giá trị nhận dạng dùng để so khớp cc_toolchain này với crosstool_config.toolchain tương ứng.

Cho đến khi vấn đề #5380 được khắc phục, bạn nên liên kết cc_toolchain với CROSSTOOL.toolchain theo cách sau. Thuộc tính này sẽ được thay thế bằng thuộc tính toolchain_config (#5380).

cc_toolchain_suite

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

Không dùng nữa: quy tắc này 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)

Biểu thị hồ sơ gợi ý tải 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_absolute_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)

Biểu thị 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; mặc định là None

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

Nhãn; bắt buộc

Nhãn của hồ sơ FDO hoặc quy tắc tạo ra hồ sơ đó. Tệp FDO có thể có một trong các đuôi sau: .profraw cho hồ sơ LLVM chưa được lập chỉ mục, .profdata cho hồ sơ LLVM được lập chỉ mục, .zip chứa 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_absolute_path_profile.
proto_profile

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

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

memprof_profile

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

Biểu thị một hồ sơ 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 hồ sơ MEMPROF. Hồ sơ dự kiến sẽ có đuôi .profdata (đối với hồ sơ memprof được lập chỉ mục/biểu tượng hoá) hoặc đuôi .zip đối với tệp zip chứa tệp memprof.profdata. Nhãn cũng có thể trỏ đến quy tắc fdo_absolute_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)

Biểu thị 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 truyền đến hành động liên kết. Tệp này có đuôi .txt.