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, additional_compiler_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. В настоящее время в этом случае ошибка не генерируется, но такая проверка ошибок может быть добавлена в будущем.
Аргументы