stamp | Integer; optional; default is -1 Включать ли информацию о сборке в двоичный файл. Возможные значения: -
stamp = 1: Всегда включать информацию о сборке в двоичный файл, даже в сборках с --nostamp. Этот параметр следует избегать, так как он потенциально отключает кэширование удалённых двоичных файлов и всех зависимых от них действий. -
stamp = 0: Всегда заменять информацию о сборке на постоянные значения. Это даёт хорошую кэшируемость результатов сборки. -
stamp = -1: Включение информации о сборке контролируется флагом --[no]stamp. Отмеченные двоичные файлы не пересобираются, если не изменятся их зависимости. |
win_def_file | Label; optional Файл DEF для Windows, который передаётся компоновщику. Этот атрибут следует использовать только при платформе 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, additional_compiler_inputs, additional_linker_inputs, 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. В настоящее время в этом случае не генерируется ошибка, но такая проверка ошибок может быть добавлена в будущем.
Аргументы