stamp | Integer; optional; default is -1 Нужно ли кодировать информацию о сборке в двоичный файл. Возможные значения: -
stamp = 1: Всегда вставлять информацию о сборке в двоичный файл, даже в --nostamp сборках. Этот параметр следует избегать, так как он потенциально отключает кэширование удаленных бинарных файлов и любых последующих действий, зависящих от него. -
stamp = 0: Всегда заменять информацию о сборке постоянными значениями. Это обеспечивает хорошее кэширование результатов сборки. -
stamp = -1: Вставка информации о сборке регулируется флагом --[no]stamp. Отмеченные двоичные файлы не перестраиваются, если не изменяются их зависимости. |
win_def_file | Label; optional Файл Windows DEF, который передаётся компоновщику. Этот атрибут следует использовать только при целевой платформе Windows. Он может использоваться для экспорта символов при компоновке динамической библиотеки. |
cc_import
cc_import(name, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)
cc_import правила позволяют пользователям импортировать предварительно скомпилированные библиотеки C/C++.
Типичные случаи использования:
1. Подключение статической библиотеки
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. Подключение динамической библиотеки (Unix)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
3. Подключение динамической библиотеки с интерфейсной библиотекой (Windows)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
# mylib.lib is a import library for mylib.dll which will be passed to linker
interface_library = "mylib.lib",
# mylib.dll will be available for runtime
shared_library = "mylib.dll",
)
4. Подключение динамической библиотеки с
system_provided=True (Windows)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
# mylib.lib is an import library for mylib.dll which will be passed to linker
interface_library = "mylib.lib",
# mylib.dll is provided by system environment, for example it can be found in PATH.
# This indicates that Bazel is not responsible for making mylib.dll available.
system_provided = 1,
)
5. Подключение к статической или динамической библиотеке
В Unix:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.a",
shared_library = "libmylib.so",
)
# first will link to libmylib.a
cc_binary(
name = "first",
srcs = ["first.cc"],
deps = [":mylib"],
linkstatic = 1, # default value
)
# second will link to libmylib.so
cc_binary(
name = "second",
srcs = ["second.cc"],
deps = [":mylib"],
linkstatic = 0,
)
В Windows:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.lib", # A normal static library
interface_library = "mylib.lib", # An import library for mylib.dll
shared_library = "mylib.dll",
)
# first will link to libmylib.lib
cc_binary(
name = "first",
srcs = ["first.cc"],
deps = [":mylib"],
linkstatic = 1, # default value
)
# second will link to mylib.dll through mylib.lib
cc_binary(
name = "second",
srcs = ["second.cc"],
deps = [":mylib"],
linkstatic = 0,
)
Аргументы
| Атрибуты |
name | Name; required Уникальное имя для этой цели. |
hdrs | List of labels; optional Список файлов заголовков, опубликованных этой предварительно скомпилированной библиотекой, которые напрямую включаются источниками в зависимых правилах. |
alwayslink | Boolean; optional; default is False Если 1, любой двоичный файл, который зависит (прямо или косвенно) от этой предварительно скомпилированной библиотеки C++, будет подключать все объектные файлы, архивированные в статической библиотеке, даже если некоторые не содержат символы, на которые ссылается двоичный файл. Это полезно, если ваш код не вызывается явно кодом в двоичном файле, например, если ваш код регистрируется для получения некоторого обратного вызова, предоставляемого какой-либо службой. Если alwayslink не работает с VS 2017 на Windows, это связано с известной проблемой известной проблемой, пожалуйста, обновите VS 2017 до последней версии. |
interface_library | Label; optional Единственная интерфейсная библиотека для подключения динамической библиотеки. Разрешенные типы файлов: .ifso, .tbd, .lib, .so или .dylib |
shared_library | Label; optional Одна предварительно скомпилированная динамическая библиотека. Bazel гарантирует, что она доступна двоичному файлу, зависящему от неё, во время выполнения. Разрешенные типы файлов: .so, .dll или .dylib |
static_library | Label; optional Одна предварительно скомпилированная статическая библиотека. Разрешенные типы файлов: .a, .pic.a или .lib |
system_provided | Boolean; optional; default is False Если 1, это указывает, что динамическая библиотека, необходимая во время выполнения, предоставляется системой. В этом случае следует указать interface_library, а shared_library должно быть пустым. |
cc_library
cc_library(name, deps, srcs, data, hdrs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)
Проверка включения заголовков
Все файлы заголовков, используемые в сборке, должны быть объявлены в hdrs или srcs правил cc_*. Это обязательно.
Для правил cc_library, заголовки в hdrs составляют публичный интерфейс библиотеки и могут быть непосредственно включены как из файлов в hdrs и srcs самой библиотеки, так и из файлов в hdrs и srcs правил cc_*, которые перечисляют библиотеку в своих deps. Заголовки в srcs должны включаться только непосредственно из файлов в hdrs и srcs самой библиотеки. При принятии решения о том, куда поместить заголовок — в hdrs или srcs, нужно спросить, хотите ли вы, чтобы потребители этой библиотеки могли непосредственно его включить. Это примерно то же решение, что и между видимостью public и private в языках программирования.
Правила cc_binary и cc_test не имеют экспортированного интерфейса, поэтому у них также нет атрибута hdrs. Все заголовки, относящиеся к двоичному файлу или тесту напрямую, должны быть перечислены в srcs.
Для иллюстрации этих правил, посмотрите пример ниже.
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"],
)
Разрешенные прямые включения в этом примере перечислены в таблице ниже. Например, foo.cc разрешено напрямую включать foo.h и bar.h, но не baz.h.
| Включающий файл |
Разрешенные включения |
| foo.h |
bar.h |
| foo.cc |
foo.h bar.h |
| bar.h |
bar-impl.h baz.h |
| bar-impl.h |
bar.h baz.h |
| bar.cc |
bar.h bar-impl.h baz.h |
| baz.h |
baz-impl.h |
| baz-impl.h |
baz.h |
| baz.cc |
baz.h baz-impl.h |
Правила проверки включения применяются только к прямым включениям. В примере выше foo.cc разрешено включать bar.h, которое может включать baz.h, которое, в свою очередь, разрешено включать baz-impl.h. Технически, компиляция файла .cc может транзитивно включать любой файл заголовка в hdrs или srcs в любом cc_library в транзитивном deps замыкании. В этом случае компилятор может прочитать baz.h и baz-impl.h при компиляции foo.cc, но foo.cc не должен содержать #include "baz.h". Для этого разрешения baz нужно добавить в deps правил foo.
К сожалению, Bazel в настоящее время не может отличить прямые от транзитивных включений, поэтому он не может обнаруживать случаи ошибок, когда файл незаконно включает заголовок напрямую, который разрешено включать только транзитивно. Например, Bazel не будет жаловаться, если в примере выше foo.cc напрямую включает baz.h. Это будет незаконно, потому что foo не зависит напрямую от baz. В настоящее время в этом случае не возникает ошибок, но такая проверка ошибок может быть добавлена в будущем.
Аргументы