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++ библиотеки, подключит все файлы объектов, архивированные в статической библиотеке, даже если некоторые из них не содержат символов, на которые ссылается двоичный файл. Это полезно, если ваш код не явно вызывается кодом в двоичном файле, например, если ваш код регистрируется для получения обратного вызова, предоставляемого некоторой службой. Если всегдаlink не работает с 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. В настоящее время в этом случае не выдаётся ошибка, но такая проверка ошибок может быть добавлена в будущем.
Аргументы