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, это связано с известной проблемой https://github.com/bazelbuild/bazel/issues/3949, пожалуйста, обновите 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. В настоящее время в этом случае не возникает ошибки, но такая проверка ошибок может быть добавлена в будущем.
Аргументы