Spec-Zone.ru › Bazel 8.0

Правила C/C++

Правила

  • cc_binary
  • cc_import
  • cc_library
  • cc_shared_library
  • cc_static_library
  • cc_test
  • cc_toolchain
  • cc_toolchain_suite
  • fdo_prefetch_hints
  • fdo_profile
  • memprof_profile
  • propeller_optimize

cc_binary

cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, exec_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

Он создаёт исполняемый двоичный файл.


Имя name целевого объекта должно совпадать с именем исходного файла, являющегося основной точкой входа приложения (без расширения). Например, если ваша точка входа находится в main.cc, то имя должно быть main.

Неявные целевые выходные файлы

  • name.stripped (генерируется только при явном запросе): Обрезанная версия двоичного файла. Для удаления символов отладки используется strip -g. Дополнительные параметры для обрезки можно указать в командной строке с помощью --stripopt=-foo.
  • name.dwp (генерируется только при явном запросе): Если включена Fission: файл пакета отладочной информации, подходящий для удалённой отладки исполняемых файлов. Иначе: пустой файл.

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

deps

Список метки; значение по умолчанию []

Список других библиотек, которые необходимо подключить к целевому бинарному файлу.

Это могут быть цели cc_library или objc_library.

Также разрешается помещать скрипты линковщика (.lds) в deps и ссылаться на них в linkopts.
srcs

Список метки; значение по умолчанию []

Список файлов C и C++, которые обрабатываются для создания целевой библиотеки. Это файлы исходного кода и заголовков C/C++, либо не сгенерированные (обычный исходный код), либо сгенерированные.

Все файлы .cc, .c, и .cpp будут скомпилированы. Это могут быть сгенерированные файлы: если именованный файл находится в outs какой-либо другой правила, эта cc_library автоматически будет зависеть от этой другой правила.

Чистые файлы ассемблера (.s, .asm) не препроцессируются и обычно строятся с помощью ассемблера. Препроцессированные файлы ассемблера (.S) препроцессируются и обычно строятся с помощью компилятора C/C++.

Файл .h не будет скомпилирован, но будет доступен для включения источниками в этом правиле. Файлы .cc и .h могут напрямую включать заголовки, перечисленные в этих srcs или в hdrs этого правила или любого правила, перечисленного в аргументе deps.

Все файлы #include должны быть упомянуты в атрибуте hdrs этого или связанного cc_library правила, или должны быть перечислены в srcs если они являются закрытыми для этой библиотеки. См. "Проверка включения заголовков" для более подробного описания.

Файлы .so, .lo, и .a — это файлы предварительной компиляции. Ваша библиотека может иметь их как srcs если она использует сторонний код, для которого у нас нет исходного кода.

Если атрибут srcs включает метку другой правила, cc_library будет использовать выходные файлы этой правила в качестве исходных файлов для компиляции. Это полезно для разового генерирования исходного кода (для более частых использования лучше реализовать класс правила Starlark и использовать API cc_common).

Разрешенные типы файлов srcs:

  • Файлы исходного кода C и C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Файлы заголовков C и C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Ассемблер с предварительным процессором C: .S
  • Архив: .a, .pic.a
  • Библиотека "всегда подключать": .lo, .pic.lo
  • Динамическая библиотека, с версией или без: .so, .so.version
  • Объектный файл: .o, .pic.o

... и любые правила, которые производят эти файлы (например, cc_embed_data). Разные расширения обозначают разные языки программирования в соответствии с соглашениями gcc.

data

Список метки; значение по умолчанию []

Список файлов, необходимых для работы этой библиотеки. См. общие замечания о data в Типичные атрибуты, определенные большинством правил построения.

Если data — имя сгенерированного файла, то это правило cc_library автоматически зависит от правила генерации.

Если data — имя правила, то это правило cc_library автоматически зависит от этого правила, и файлы outs этого правила автоматически добавляются в файлы данных этого cc_library правила.

Ваш код C++ может получить доступ к этим файлам данных следующим образом:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

Список метки; значение по умолчанию []

Передайте эти файлы команде C++ линковщика.

Например, скомпилированные файлы Windows .res можно предоставить здесь, чтобы они были встроены в целевой бинарный файл.

conlyopts

Список строк; значение по умолчанию []

Добавьте эти параметры к команде компиляции C. Подлежат замене "переменной Make" и разбору токенов оболочки Bourne.
copts

Список строк; значение по умолчанию []

Добавьте эти параметры к команде компиляции C/C++. Подлежат замене "переменной Make" и разбору токенов оболочки Bourne.

Каждая строка в этом атрибуте добавляется в указанном порядке к COPTS перед компиляцией целевого бинарного файла. Флаги действуют только для компиляции этой цели, а не её зависимостей, поэтому будьте осторожны с файлами заголовков, включенными где-либо ещё. Все пути должны быть относительными к рабочей области, а не к текущему пакету. Этот атрибут не должен потребоваться за пределами third_party.

Если пакет объявляет функцию no_copts_tokenization, разбор токенов оболочки Bourne применяется только к строкам, состоящим из одной переменной "Make".

cxxopts

Список строк; значение по умолчанию []

Добавьте эти параметры к команде компиляции C++. Подлежат замене "переменной Make" и разбору токенов оболочки Bourne.
defines

Список строк; значение по умолчанию []

Список определений для добавления к строке компиляции. Подлежат замене "переменной Make" и разбору токенов оболочки Bourne. Каждая строка, которая должна состоять из одного токена оболочки Bourne, предваряется -D и добавляется в строку команд компиляции для этой цели, а также для всех правил, которые зависят от нее. Будьте очень осторожны, так как это может иметь далеко идущие последствия. Если есть сомнения, добавьте значения определений в local_defines вместо этого.
dynamic_deps

Список метки; значение по умолчанию []

Это другие зависимости cc_shared_library от которых зависит текущая цель.

Реализация cc_shared_library будет использовать список dynamic_deps (переходно, т.е. также dynamic_deps текущей цели dynamic_deps) для определения, какие cc_libraries в переходной deps не должны быть подключены, потому что они уже предоставлены другой cc_shared_library.

hdrs_check

Строка; значение по умолчанию ""

Устарело, ничто не делается.
includes

Список строк; значение по умолчанию []

Список каталогов включения, которые будут добавлены в строку компиляции. Подлежат замене "переменной Make". Каждая строка предваряется путем пакета и передается C++ инструментарию для расширения через функцию "include_paths" CROSSTOOL. Инструментарий, работающий на POSIX-системе с типичными определениями функций, будет производить -isystem path_to_package/include_entry. Это следует использовать только для сторонних библиотек, которые не соответствуют стилю Google для записи инструкций #include. В отличие от COPTS, эти флаги добавляются для этого правила и для каждого правила, зависящего от него. (Примечание: не правила, от которых он зависит!) Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений добавьте флаги "-I" в COPTS вместо этого.

Добавляемые include пути будут включать сгенерированные файлы, а также файлы в дереве исходных кодов.

link_extra_lib

Метка; значение по умолчанию "@bazel_tools//tools/cpp:link_extra_lib"

Управление подключением дополнительных библиотек.

По умолчанию бинарные файлы C++ подключаются к //tools/cpp:link_extra_lib, которая по умолчанию зависит от флага метки //tools/cpp:link_extra_libs. Без установки флага эта библиотека по умолчанию пуста. Установка флага метки позволяет подключать необязательные зависимости, такие как переопределения для слабых символов, перехваты для функций динамических библиотек или специальные библиотеки времени выполнения (для замен malloc, предпочтительнее malloc или --custom_malloc). Установка этого атрибута в None отключает это поведение.

linkopts

Список строк; значение по умолчанию []

Добавьте эти флаги к команде C++ линковщика. Подлежат замене "переменной Make", разбору токенов оболочки Bourne и расширению меток. Каждая строка в этом атрибуте добавляется к LINKOPTS перед связыванием целевого бинарного файла.

Каждый элемент этого списка, который не начинается с $ или -, предполагается, что он является меткой цели в deps. Список файлов, сгенерированных этой целью, добавляется к параметрам линковщика. Ошибка сообщается, если метка недействительна или не объявлена в deps.

linkshared

Булево; значение по умолчанию False

Создать динамическую библиотеку. Для активации этого атрибута, включите linkshared=True в ваше правило. По умолчанию этот параметр выключен.

Наличие этого флага означает, что связывание происходит с флагом -shared к gcc, и полученная динамическая библиотека подходит для загрузки, например, в программу Java. Однако, для целей построения она никогда не будет подключаться к зависимому бинарному файлу, так как предполагается, что динамические библиотеки, построенные с помощью правила cc_binary, загружаются только вручную другими программами, поэтому это не должно рассматриваться как замена правила cc_library. Для повышения масштабируемости мы рекомендуем избегать этого подхода и просто позволить java_library зависеть от правил cc_library вместо этого.

Если вы укажете оба linkopts=['-static'] и linkshared=True, вы получите единый полностью автономный модуль. Если вы укажете оба linkstatic=True и linkshared=True, вы получите единый, в основном автономный модуль.

linkstatic

Булево значение; значение по умолчанию — True

Для cc_binary и cc_test: привязка бинарного файла в статическом режиме. Для cc_library.link_static: см. ниже.

По умолчанию этот параметр включён для cc_binary и выключен для остальных.

Если включено и это бинарный файл или тест, этот параметр указывает инструменту построения, использовать ли .a для пользовательских библиотек вместо .so, когда это возможно. Системные библиотеки, такие как libc (но не библиотеки времени выполнения C/C++, см. ниже), по-прежнему подключаются динамически, как и библиотеки, для которых нет статической библиотеки. Таким образом, полученный исполняемый файл по-прежнему будет динамически связан, поэтому он в основном статический.

Существует три способа связи исполняемого файла:

  • СТАТИЧЕСКИЙ с параметром fully_static_link, в котором всё подключается статически; например, "gcc -static foo.o libbar.a libbaz.a -lm".
    Этот режим включён при указании fully_static_link в атрибуте features.
  • СТАТИЧЕСКИЙ, в котором все пользовательские библиотеки подключаются статически (если доступна статическая версия), но системные библиотеки (исключая библиотеки времени выполнения C/C++) подключаются динамически, например, "gcc foo.o libfoo.a libbaz.a -lm".
    Этот режим включён при указании linkstatic=True.
  • ДИНАМИЧЕСКИЙ, в котором все библиотеки подключаются динамически (если доступна динамическая версия), например, "gcc foo.o libfoo.so libbaz.so -lm".
    Этот режим включён при указании linkstatic=False.

Если атрибут linkstatic или fully_static_link в features используется вне //third_party, добавьте комментарий рядом с правилом, чтобы объяснить причину.

Атрибут linkstatic имеет другое значение, если используется в правиле cc_library(). Для библиотеки C++, linkstatic=True указывает, что разрешена только статическая привязка, поэтому динамическая библиотека .so не будет создана. linkstatic=False не предотвращает создание статических библиотек. Этот атрибут предназначен для управления созданием динамических библиотек.

В производстве должно быть очень мало кода, скомпилированного с linkstatic=False. Если linkstatic=False, инструмент построения создаст ссылки на зависимости shared библиотеки в области *.runfiles.

local_defines

Список строк; значение по умолчанию — []

Список определений для добавления в строку компиляции. Подлежит подстановке переменных "Make" и токенизации оболочки Bourne. Каждая строка, которая должна состоять из одного токена оболочки Bourne, предваряется -D и добавляется в командную строку компиляции для этого целевого объекта, но не для его зависимостей.
malloc

Метка; значение по умолчанию — "@bazel_tools//tools/cpp:malloc"

Переопределение зависимости от malloc по умолчанию.

По умолчанию C++ бинарные файлы привязаны к //tools/cpp:malloc, что является пустой библиотекой, так что бинарный файл в конечном итоге использует libc malloc. Эта метка должна ссылаться на cc_library. Если компиляция выполняется для правила, отличного от C++, этот параметр не влияет. Значение этого атрибута игнорируется, если указан linkshared=True.

module_interfaces

Список меток; значение по умолчанию — []

Список файлов, рассматриваемых как интерфейс модулей C++20.

Стандарт C++ не ограничивает расширение файла интерфейса модуля

  • Clang использует cppm
  • GCC может использовать любое расширение исходного файла
  • MSVC использует ixx

Использование защищено флагом --experimental_cpp_modules.

nocopts

Строка; значение по умолчанию — ""

Удаление совпадающих опций из командной строки компиляции C++. Подлежит подстановке переменных "Make". Значение этого атрибута интерпретируется как регулярное выражение. Любые существующие COPTS, которые соответствуют этому регулярному выражению (включая значения, явно указанные в атрибуте правила copts), будут удалены из COPTS для целей компиляции этого правила. Этот атрибут не должен быть необходимым или используемым вне third_party. Значения не препроцессируются ничем, кроме подстановки переменных "Make".
reexport_deps

Список меток; значение по умолчанию — []

stamp

Целое число; значение по умолчанию — -1

Нужно ли кодировать информацию о сборке в бинарный файл. Возможные значения:
  • stamp = 1: Всегда добавлять информацию о сборке в бинарный файл, даже в сборках --nostamp. От этого следует избегать, так как это потенциально убивает кеширование удалённых данных для бинарного файла и любых последующих действий, зависящих от него.
  • stamp = 0: Всегда заменять информацию о сборке на константные значения. Это обеспечивает хорошее кэширование результатов сборки.
  • stamp = -1: Встраивание информации о сборке регулируется флагом --[no]stamp.

Бинарные файлы со штампами не перестраиваются, если не изменились их зависимости.

win_def_file

Метка; значение по умолчанию — None

Файл Windows DEF, который должен быть передан компоновщику.

Этот атрибут следует использовать только при платформе Windows в качестве целевой. Он может использоваться для экспорта символов во время компоновки динамической библиотеки.

Правило cc_import

cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, 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. Привязка динамической библиотеки с интерфейсной библиотекой

В Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # libmylib.ifso is an interface library for libmylib.so which will be passed to linker
  interface_library = "libmylib.ifso",
  # libmylib.so will be available for runtime
  shared_library = "libmylib.so",
)

В 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 will be available for runtime
  shared_library = "mylib.dll",
)
4. Привязка динамической библиотеки с system_provided=True

В Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
  # libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
  # This indicates that Bazel is not responsible for making libmylib.so available.
  system_provided = 1,
)

В 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",
)

В 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",
)

Остальное одинаково в Unix и Windows:


# first will link to libmylib.a (or libmylib.lib)
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to libmylib.so (or libmylib.lib)
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)

cc_import поддерживает атрибут include. Например:


cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = ["vendor/curl/include"],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

deps

Список меток; значение по умолчанию []

Список других библиотек, от которых зависит цель. См. общие замечания о deps в Типичные атрибуты, определённые большинством правил построения.
hdrs

Список меток; значение по умолчанию []

Список заголовочных файлов, опубликованных этой предварительно скомпилированной библиотекой, для непосредственного включения в исходные файлы в зависимых правилах.
alwayslink

Булево значение; значение по умолчанию False

Если 1, любой двоичный файл, который зависит (прямо или косвенно) от этой предварительно скомпилированной C++ библиотеки, будет подключать все объектные файлы, архивированные в статической библиотеке, даже если некоторые не содержат символы, на которые ссылается двоичный файл. Это полезно, если ваш код не вызывается явно кодом в двоичном файле, например, если ваш код регистрируется для получения какого-либо обратного вызова, предоставляемого некоторой службой.

Если alwayslink не работает с VS 2017 в Windows, это связано с известной проблемой, пожалуйста, обновите VS 2017 до последней версии.

includes

Список строк; значение по умолчанию []

Список директорий включения, которые необходимо добавить в строку компиляции. Подлежит замене переменной "Make". Каждая строка предваряется путем пакета и передаётся инструменту C++ для расширения через функцию CROSSTOOL "include_paths". Инструмент, работающий в системе POSIX со стандартными определениями функций, будет производить -isystem path_to_package/include_entry. Это следует использовать только для сторонних библиотек, которые не соответствуют стилю Google по написанию инструкций #include. В отличие от COPTS, эти флаги добавляются для этого правила и каждого правила, которое от него зависит. (Примечание: не правила, от которых оно зависит!) Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений добавьте флаги "-I" в COPTS вместо этого.

Путь по умолчанию include не включает сгенерированные файлы. Если вам нужно #include сгенерированный заголовочный файл, перечислите его в srcs.

interface_library

Метка; значение по умолчанию None

Единственная библиотека интерфейса для подключения динамической библиотеки.

Разрешенные типы файлов: .ifso, .tbd, .lib, .so или .dylib

linkopts

Список строк; значение по умолчанию []

Добавьте эти флаги в команду C++ линковщика. Подлежит замене "Make" переменной, токенизация оболочки Bourne и расширение меток. Каждая строка в этом атрибуте добавляется к LINKOPTS перед подключением двоичной цели.

Каждый элемент этого списка, который не начинается с $ или -, предполагается, что это метка цели в deps. Список файлов, сгенерированных этой целью, добавляется к параметрам линковщика. Ошибка сообщается, если метка неверна или не объявлена в deps.

objects

Список меток; значение по умолчанию []

pic_objects

Список меток; значение по умолчанию []

pic_static_library

Метка; значение по умолчанию None

shared_library

Метка; значение по умолчанию None

Одна предварительно скомпилированная динамическая библиотека. Bazel гарантирует, что она будет доступна двоичному файлу, который от неё зависит, во время выполнения.

Разрешенные типы файлов: .so, .dll или .dylib

static_library

Метка; значение по умолчанию None

Одна предварительно скомпилированная статическая библиотека.

Разрешенные типы файлов: .a, .pic.a или .lib

system_provided

Булево значение; значение по умолчанию False

Если 1, это указывает, что динамическая библиотека, необходимая во время выполнения, предоставляется системой. В этом случае следует указать interface_library, а shared_library должно быть пустым.

cc_library

cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

Используйте cc_library() для C++-компилируемых библиотек. Результатом является .so, .lo, или .a, в зависимости от необходимых данных.

Если вы создаёте что-то со статическим подключением, что зависит от cc_library, выходом правила зависимой библиотеки является файл .a. Если вы укажете alwayslink=True, вы получите файл .lo.

Фактическое имя выходного файла libfoo.so для динамической библиотеки, где foo — имя правила. Другие типы библиотек оканчиваются на .lo и .a соответственно. Если вам нужно конкретное имя динамической библиотеки, например, для определения модуля Python, используйте genrule для копирования библиотеки в нужное имя.

Проверка включения заголовков

Все заголовочные файлы, используемые в сборке, должны быть объявлены в 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 полагается на поддержку инструментария для обеспечения соблюдения правил проверки включения. Функция layering_check должна поддерживаться инструментом и быть явно запрошена, например, через флаг командной строки --features=layering_check или параметр features функции package. Предоставляемые Bazel инструменты поддерживают эту функцию только с clang в Unix и macOS.

Примеры

Мы используем флаг alwayslink для принудительного подключения этого кода линковщиком, даже если код основного двоичного файла не ссылается на него.


cc_library(
    name = "ast_inspector_lib",
    srcs = ["ast_inspector_lib.cc"],
    hdrs = ["ast_inspector_lib.h"],
    visibility = ["//visibility:public"],
    deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
    # alwayslink as we want to be able to call things in this library at
    # debug time, even if they aren't used anywhere in the code.
    alwayslink = 1,
)

Следующий пример взят из third_party/python2_4_3/BUILD. Некоторые части кода используют библиотеку dl (для загрузки другой, динамической библиотеки), поэтому в этом правиле указан параметр подключения -ldl для подключения библиотеки dl.


cc_library(
    name = "python2_4_3",
    linkopts = [
        "-ldl",
        "-lutil",
    ],
    deps = ["//third_party/expat"],
)

Следующий пример взят из third_party/kde/BUILD. Мы храним предварительно скомпилированные .so файлы в хранилище. Заголовочные файлы находятся в подкаталоге с именем include.


cc_library(
    name = "kde",
    srcs = [
        "lib/libDCOP.so",
        "lib/libkdesu.so",
        "lib/libkhtml.so",
        "lib/libkparts.so",
        ...more .so files...,
    ],
    includes = ["include"],
    deps = ["//third_party/X11"],
)

Следующий пример взят из third_party/gles/BUILD. Сторонние библиотеки часто требуют определённых defines и linkopts.


cc_library(
    name = "gles",
    srcs = [
        "GLES/egl.h",
        "GLES/gl.h",
        "ddx.c",
        "egl.c",
    ],
    defines = [
        "USE_FLOAT",
        "__GL_FLOAT",
        "__GL_COMMON",
    ],
    linkopts = ["-ldl"],  # uses dlopen(), dl library
    deps = [
        "es",
        "//third_party/X11",
    ],
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этого целевого объекта.

deps

Список метки; значение по умолчанию []

Список других библиотек, от которых зависит целевой объект библиотеки.

Это могут быть cc_library или objc_library целевые объекты.

См. общие комментарии по deps в Типичные атрибуты, определенные большинством правил построения.

Здесь должны быть указаны имена правил построения библиотек C++. При построении исполняемого файла, который использует библиотеку этого правила, будут также подключены библиотеки в deps.

Не все клиенты этой библиотеки должны быть здесь. Зависимости от данных во время выполнения должны быть указаны в data. Файлы исходного кода, сгенерированные другими правилами, должны быть в srcs.

Чтобы подключить предварительно скомпилированную стороннюю библиотеку, добавьте её имя в srcs.

Чтобы зависеть от чего-либо без подключения к этой библиотеке, добавьте его имя в data.

srcs

Список метки; значение по умолчанию []

Список файлов C и C++, которые обрабатываются для создания целевого объекта библиотеки. Это файлы исходного кода и заголовков C/C++, либо не сгенерированные (обычный исходный код), либо сгенерированные.

Все .cc, .c, и .cpp файлы будут скомпилированы. Это могут быть сгенерированные файлы: если имя файла находится в outs другого правила, это cc_library будет автоматически зависеть от этого другого правила.

Чистые файлы ассемблера (.s, .asm) не предварительно обрабатываются и обычно компилируются с помощью ассемблера. Файлы ассемблера с предварительной обработкой (.S) предварительно обрабатываются и обычно компилируются с помощью компилятора C/C++.

Файл .h не будет компилироваться, но будет доступен для включения источниками в этом правиле. Файлы .cc и .h могут напрямую включать заголовки, перечисленные в этих srcs или в hdrs этого правила или любого правила, перечисленного в аргументе deps.

Все файлы #include должны быть указаны в атрибуте hdrs этого или связанного cc_library правила, или они должны быть перечислены в srcs если они являются частными для этой библиотеки. См. "Проверка включения заголовков" для более подробного описания.

Файлы .so, .lo, и .a — это предварительно скомпилированные файлы. Ваша библиотека может иметь их как srcs, если она использует сторонний код, для которого у нас нет исходного кода.

Если атрибут srcs включает метку другого правила, cc_library будет использовать выходные файлы этого правила как исходные файлы для компиляции. Это полезно для разового генерирования исходного кода (для более частого использования лучше реализовать класс правила Starlark и использовать API cc_common).

Допустимые типы файлов srcs:

  • Файлы исходного кода C и C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Файлы заголовков C и C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Ассемблер с предварительной обработкой C: .S
  • Архив: .a, .pic.a
  • Библиотека "всегда подключать": .lo, .pic.lo
  • Динамическая библиотека, с версией или без: .so, .so.version
  • Объектный файл: .o, .pic.o

... и любые правила, которые производят эти файлы (например, cc_embed_data). Разные расширения обозначают разные языки программирования в соответствии с соглашениями gcc.

data

Список метки; значение по умолчанию []

Список файлов, необходимых этой библиотеке во время выполнения. См. общие комментарии по data в Типичные атрибуты, определенные большинством правил построения.

Если data — это имя сгенерированного файла, то это cc_library правило автоматически зависит от правила-генератора.

Если data — имя правила, то это cc_library правило автоматически зависит от этого правила, и файлы outs этого правила автоматически добавляются к файлам данных cc_library.

Ваш код C++ может получить доступ к этим файлам данных следующим образом:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
hdrs

Список метки; значение по умолчанию []

Список файлов заголовков, опубликованных этой библиотекой для прямого включения источниками в зависимых правилах.

Это предпочтительное место для объявления файлов заголовков, описывающих интерфейс библиотеки. Эти заголовки будут доступны для включения источниками в этом правиле или в зависимых правилах. Заголовки, которые не должны включаться клиентом этой библиотеки, должны быть указаны в атрибуте srcs вместо этого, даже если они включаются опубликованным заголовком. См. "Проверка включения заголовков" для более подробного описания.

Допустимые типы файлов headers: .h, .hh, .hpp, .hxx.

additional_compiler_inputs

Список метки; значение по умолчанию []

Любые дополнительные файлы, которые вы можете передать в командную строку компилятора, например, списки игнорирования анализатора. Файлы, указанные здесь, могут затем использоваться в copts с функцией $(location).
additional_linker_inputs

Список метки; значение по умолчанию []

Передать эти файлы в командную строку C++ компоновщика.

Например, скомпилированные файлы Windows .res могут быть предоставлены здесь для встраивания в целевой исполняемый файл.

alwayslink

Булево; значение по умолчанию False

Если 1, любой исполняемый файл, который зависит (прямо или косвенно) от этой библиотеки C++, будет подключать все объектные файлы для файлов, перечисленных в srcs, даже если некоторые из них не содержат символов, на которые ссылается исполняемый файл. Это полезно, если ваш код не вызывается явно кодом в исполняемом файле, например, если ваш код регистрируется для получения обратного вызова, предоставляемого какой-либо службой.

Если alwayslink не работает с VS 2017 в Windows, это связано с известной проблемой, пожалуйста, обновите вашу VS 2017 до последней версии.

conlyopts

Список строк; значение по умолчанию []

Добавьте эти опции к команде компиляции C. Подвергается замене "Переменных Make" и Токенизации оболочки Bourne.
copts

Список строк; значение по умолчанию []

Добавьте эти опции к команде компиляции C/C++. Подвергается замене "Переменных Make" и Токенизации оболочки Bourne.

Каждая строка в этом атрибуте добавляется в указанном порядке к COPTS перед компиляцией целевого исполняемого файла. Флаги действуют только для компиляции этого целевого объекта, а не его зависимостей, поэтому будьте осторожны с файлами заголовков, включенными где-либо ещё. Все пути должны быть относительными к рабочему пространству, а не к текущему пакету. Этот атрибут не должен быть необходим вне third_party.

Если пакет объявляет функцию no_copts_tokenization, токенизация оболочки Bourne применяется только к строкам, состоящим из одной переменной "Make".

cxxopts

Список строк; значение по умолчанию []

Добавьте эти опции к команде компиляции C++. Подвергается замене "Переменных Make" и Токенизации оболочки Bourne.
defines

Список строк; значение по умолчанию []

Список определений, которые нужно добавить в строку компиляции. Подвергается замене "Переменными Make" и Токенизацией оболочки Bourne. Каждая строка, которая должна состоять из одного токена оболочки Bourne, предваряется -D и добавляется в строку компиляции для этого целевого объекта, а также для каждого правила, которое от него зависит. Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений, добавьте значения define в local_defines вместо этого.
hdrs_check

Строка; значение по умолчанию ""

Устарело, бесполезно.
implementation_deps

Список метки; значение по умолчанию []

Список других библиотек, от которых зависит целевой объект библиотеки. В отличие от deps, заголовки и пути включения этих библиотек (и всех их транзитивных зависимостей) используются только для компиляции этой библиотеки, а не библиотек, которые от неё зависят. Библиотеки, указанные с implementation_deps, по-прежнему подключаются в целевых исполняемых файлах, которые зависят от этой библиотеки.
include_prefix

Строка; значение по умолчанию ""

Префикс, который нужно добавить к путям заголовков этого правила.

При установке заголовки в атрибуте hdrs этого правила доступны по пути, к которому добавлен этот атрибут перед его репозиторным относительным путём.

Префикс в атрибуте strip_include_prefix удаляется перед добавлением этого префикса.

Этот атрибут допустим только в third_party.

includes

Список строк; по умолчанию []

Список каталогов включений, которые следует добавить к строке компиляции. Подлежит подстановке переменных "Make". Каждая строка предваряется путём пакета и передаётся инструментарию C++ для расширения через функцию "include_paths" CROSSTOOL. Инструментарий, работающий на системе POSIX со стандартными определениями функций, выведет -isystem path_to_package/include_entry. Это следует использовать только для сторонних библиотек, которые не соответствуют стилю Google для написания директив #include. В отличие от COPTS, эти флаги добавляются для этого правила и для каждого правила, зависящего от него. (Примечание: не правила, от которых оно зависит!) Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений добавьте флаги "-I" в COPTS вместо этого.

Добавленные include пути будут включать сгенерированные файлы, а также файлы в дереве исходных кодов.

linkopts

Список строк; по умолчанию []

См. cc_binary.linkopts. Атрибут linkopts также применяется к любому целевому элементу, который непосредственно или косвенно зависит от этой библиотеки через атрибут deps (или через другие атрибуты, которые обрабатываются аналогично: атрибут malloc правила cc_binary). Опции компоновки зависимостей имеют приоритет над опциями компоновки зависимых элементов (т.е. опции компоновки зависимостей появляются позже в командной строке). Опции компоновки, указанные в --linkopt, имеют приоритет над опциями компоновки правила.

Обратите внимание, что атрибут linkopts применяется только при создании файлов .so или исполняемых файлов, а не при создании файлов .a или .lo. Таким образом, если атрибут linkstatic=True задан, атрибут linkopts не повлияет на создание этой библиотеки, только на другие целевые элементы, которые зависят от этой библиотеки.

Также важно отметить, что опции "-Wl,-soname" или "-Xlinker -soname" не поддерживаются и никогда не должны указываться в этом атрибуте.

Файлы .so , созданные правилами cc_library , не компонуются с библиотеками, от которых они зависят. Если вы пытаетесь создать общую библиотеку для использования за пределами основного репозитория, например, для ручного использования с dlopen() или LD_PRELOAD, может быть лучше использовать правило cc_binary с атрибутом linkshared=True. См. cc_binary.linkshared.

linkstamp

Метка; по умолчанию None

Одновременно компилирует и компонует указанный файл исходного кода C++ в окончательный двоичный файл. Это уловка необходима для ввода информации о временных метках в двоичные файлы; если мы скомпилировали исходный файл в объектный файл обычным способом, метка времени была бы неверной. Компиляция linkstamp может не включать какой-либо конкретный набор флагов компилятора, и поэтому не должна зависеть от какого-либо конкретного заголовка, опции компилятора или другой переменной сборки. Эта опция должна потребоваться только в пакете base.
linkstatic

Булево значение; по умолчанию False

Для cc_binary и cc_test: компонуйте двоичный файл в статическом режиме. Для cc_library.link_static: см. ниже.

По умолчанию эта опция включена для cc_binary и выключена для остальных.

Если включено и это бинарный файл или тест, эта опция сообщает инструменту сборки компоновать .a вместо .so для пользовательских библиотек, когда это возможно. Системные библиотеки, такие как libc (но не библиотеки времени выполнения C/C++, см. ниже), по-прежнему компонуются динамически, как и библиотеки, для которых нет статической библиотеки. Таким образом, полученный исполняемый файл по-прежнему будет динамически компоноваться, следовательно, в основном статический.

Есть три основных способа компоновки исполняемого файла:

  • СТАТИЧЕСКИ с функцией fully_static_link, в которой всё компонуется статически; например, "gcc -static foo.o libbar.a libbaz.a -lm".
    Этот режим активирован указанием fully_static_link в атрибуте features.
  • СТАТИЧЕСКИ, в котором все пользовательские библиотеки компонуются статически (если доступна статическая версия), но системные библиотеки (исключая библиотеки времени выполнения C/C++) компонуются динамически, например, "gcc foo.o libfoo.a libbaz.a -lm".
    Этот режим активируется указанием linkstatic=True.
  • ДИНАМИЧЕСКИ, в котором все библиотеки компонуются динамически (если доступна динамическая версия), например, "gcc foo.o libfoo.so libbaz.so -lm".
    Этот режим активируется указанием linkstatic=False.

Если атрибут linkstatic или fully_static_link в features используются вне //third_party , пожалуйста, добавьте комментарий к правилу, объясняющий почему.

Атрибут linkstatic имеет другое значение, если он используется в правиле cc_library(). Для библиотеки C++, linkstatic=True указывает, что разрешена только статическая компоновка, поэтому не будет создан .so. linkstatic=False не препятствует созданию статических библиотек. Этот атрибут предназначен для управления созданием динамических библиотек.

В производстве должно быть очень мало кода, созданного с помощью linkstatic=False. Если linkstatic=False, то инструмент сборки создаст символические ссылки на зависящие общие библиотеки в области *.runfiles .

local_defines

Список строк; по умолчанию []

Список определений для добавления в строку компиляции. Подлежит подстановке переменных "Make" и токенизации оболочки Bourne. Каждая строка, которая должна состоять из одного токена оболочки Bourne, предваряется -D и добавляется в строку компиляции для этой цели, но не для её зависимостей.
module_interfaces

Список меток; по умолчанию []

Список файлов рассматривается как интерфейс модулей C++20.

Стандарт C++ не накладывает ограничений на расширение файла интерфейса модуля.

  • Clang использует cppm
  • GCC может использовать любое расширение файла исходного кода
  • MSVC использует ixx

Использование защищено флагом --experimental_cpp_modules.

strip_include_prefix

Строка; по умолчанию ""

Префикс, который следует удалить из путей заголовков этого правила.

Если задано, заголовки в атрибуте hdrs этого правила доступны по их пути с удалённым этим префиксом.

Если это относительный путь, он рассматривается как путь, относящийся к пакету. Если это абсолютный путь, он понимается как путь, относящийся к репозиторию.

Префикс в атрибуте include_prefix добавляется после удаления этого префикса.

Этот атрибут допустим только в third_party.

textual_hdrs

Список меток; по умолчанию []

Список заголовочных файлов, опубликованных этой библиотекой, которые будут текстово включены источниками в зависимых правилах.

Это место для объявления заголовочных файлов, которые не могут быть скомпилированы сами по себе; то есть они всегда должны быть текстово включены другими файлами исходного кода, чтобы скомпилировать корректный код.

win_def_file

Метка; по умолчанию None

Файл Windows DEF, который должен быть передан компоновщику.

Этот атрибут следует использовать только при платформе назначения Windows. Он может использоваться для экспорта символов во время компоновки общей библиотеки.

cc_shared_library

cc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)

Он производит общую библиотеку.

Пример

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

В примере foo_shared статически компонует foo и baz, последняя является транзитивной зависимостью. Он не компонует bar, поскольку она уже предоставляется динамически библиотекой dynamic_dep bar_shared.

foo_shared использует файл сценария компоновщика *.lds для управления символами, которые следует экспортировать. Логика правила cc_shared_library не контролирует, какие символы экспортируются, а только использует то, что предполагается экспортировать, чтобы выдавать ошибки во время анализа, если две общие библиотеки экспортируют одни и те же цели.

Каждая непосредственная зависимость от cc_shared_library предполагается экспортируемой. Поэтому Bazel предполагает во время анализа, что foo экспортируется foo_shared. baz не предполагается экспортируемой foo_shared. Каждая цель, соответствующая exports_filter , также предполагается экспортируемой.

Каждый cc_library в примере должен появляться не более чем в одной cc_shared_library. Если мы хотели бы также включить baz в bar_shared, нам нужно добавить tags = ["LINKABLE_MORE_THAN_ONCE"] в baz.

Из-за атрибута shared_lib_name созданный файлом bar_shared будет иметь имя bar.so вместо имени libbar.so, которое он имел бы по умолчанию в Linux.

Ошибки

Two shared libraries in dependencies export the same symbols.

Это произойдёт всякий раз, когда вы создаёте цель с двумя различными зависимостями cc_shared_library, которые экспортируют одну и ту же цель. Для исправления необходимо прекратить экспорт библиотек в одной из зависимостей cc_shared_library.

Two shared libraries in dependencies link the same library statically

Это произойдёт всякий раз, когда вы создаёте новую cc_shared_library с двумя различными зависимостями cc_shared_library , которые статически компонуют одну и ту же цель. Аналогично ошибке с экспортом.

END_OF_DOCUMENT_MARKER

Один из способов исправить это — прекратить подключение библиотеки к одной из зависимостей cc_shared_library. Одновременно с этим та зависимость, которая все еще подключает ее, должна экспортировать библиотеку, чтобы та, которая не подключает, сохраняла видимость символов. Другой способ — выделить третью библиотеку, которая экспортирует целевой объект. Третий способ — пометить виновника cc_library тегом LINKABLE_MORE_THAN_ONCE, но это исправление должно быть редким, и вы должны абсолютно убедиться, что cc_library действительно безопасно подключать более одного раза.

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

Это означает, что библиотека в транзитивном замыкании вашей deps доступна без прохождения через одну из зависимостей cc_shared_library, но уже подключена к другой cc_shared_library в dynamic_deps и не экспортирована.

Решение состоит в том, чтобы экспортировать ее из зависимости cc_shared_library или выделить третью cc_shared_library, которая ее экспортирует.

Do not place libraries which only contain a precompiled dynamic library in deps.

Если у вас есть предварительно скомпилированная динамическая библиотека, ее не нужно и нельзя подключать статически к текущей цели cc_shared_library, которую вы сейчас создаёте. Поэтому она не должна находиться в deps cc_shared_library. Если эта предварительно скомпилированная динамическая библиотека является зависимостью одного из ваших cc_libraries, то cc_library должен зависеть от нее напрямую.

Trying to export a library already exported by a different shared library

Вы увидите эту ошибку, если в текущем правиле вы заявляете об экспорте цели, которая уже экспортируется одной из ваших динамических зависимостей.

Чтобы исправить это, удалите цель из deps и просто используйте ее из динамической зависимости или убедитесь, что exports_filter не захватывает эту цель.

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

deps

Список меток; по умолчанию []

Верхнеуровневые библиотеки, которые будут безусловно статически подключены к общей библиотеке после полного архивирования.

Любая транзитивная зависимость библиотек этих прямых зависимостей будет подключена к этой общей библиотеке, если они еще не были подключены cc_shared_library в dynamic_deps.

Во время анализа правило будет считать любую цель, указанную в deps, как экспортируемую общей библиотекой, чтобы сообщать об ошибках, когда несколько cc_shared_libraries экспортируют одни и те же цели. Реализация правила не заботится о том, чтобы сообщить компоновщику, какие символы должны быть экспортированы общей библиотекой. Пользователь должен позаботиться об этом с помощью скриптов компоновщика или заявлений о видимости в исходном коде.

Реализация также будет выводить ошибки всякий раз, когда одна и та же библиотека статически подключается к нескольким cc_shared_library. Этого можно избежать, добавив "LINKABLE_MORE_THAN_ONCE" к cc_library.tags или указав `cc_library` как экспорт одной из общих библиотек, чтобы одну из них можно было сделать dynamic_dep другой.

additional_linker_inputs

Список меток; по умолчанию []

Любые дополнительные файлы, которые вы хотите передать компоновщику, например, скрипты компоновщика. Вы должны отдельно передать любые флаги компоновщика, которые нужны компоновщику, чтобы он был осведомлен об этом файле. Вы можете сделать это через атрибут user_link_flags.
dynamic_deps

Список меток; по умолчанию []

Это другие cc_shared_library зависимости, от которых зависит текущая цель.

Реализация cc_shared_library будет использовать список dynamic_deps (по транзитивности, т. е. также dynamic_deps текущей цели dynamic_deps) для определения, какие cc_libraries в транзитивном deps не должны подключаться, потому что они уже предоставляются другой cc_shared_library.

experimental_disable_topo_sort_do_not_use_remove_before_7_0

Булево значение; по умолчанию False

exports_filter

Список строк; по умолчанию []

Этот атрибут содержит список целей, которые, как утверждается, экспортируются текущей общей библиотекой.

Любая цель deps уже считается экспортируемой общей библиотекой. Этот атрибут следует использовать для перечисления любых целей, которые экспортируются общей библиотекой, но являются транзитивными зависимостями deps.

Обратите внимание, что этот атрибут фактически не добавляет ребро зависимости к этим целям, ребро зависимости должно создаваться deps. Элементы этого атрибута — просто строки. Имейте в виду, что при размещении цели в этом атрибуте это считается утверждением, что общая библиотека экспортирует символы из этой цели. Логика cc_shared_library фактически не обрабатывает указание компоновщику, какие символы следует экспортировать.

Допускается следующий синтаксис:

//foo:__pkg__ для учёта любых целей в foo/BUILD

//foo:__subpackages__ для учёта любых целей в foo/BUILD или в любом другом пакете ниже foo/ (например, foo/bar/BUILD)

roots

Список меток; по умолчанию []

shared_lib_name

Строка; по умолчанию ""

По умолчанию cc_shared_library будет использовать имя для файла выходной общей библиотеки, основанное на имени цели и платформе. Это включает расширение и иногда префикс. Иногда вам может не потребоваться имя по умолчанию, например, при загрузке общих библиотек C++ для Python, префикс lib* по умолчанию часто нежелателен, в этом случае вы можете использовать этот атрибут, чтобы выбрать пользовательское имя.
static_deps

Список строк; по умолчанию []

user_link_flags

Список строк; по умолчанию []

Любые дополнительные флаги, которые вы хотите передать компоновщику. Например, чтобы сделать компоновщик осведомленным о скрипте компоновщика, переданном через additional_linker_inputs, можно использовать следующее:

 cc_shared_library(
    name = "foo_shared",
    additional_linker_inputs = select({
      "//src/conditions:linux": [
        ":foo.lds",
        ":additional_script.txt",
      ],
      "//conditions:default": []}),
    user_link_flags = select({
      "//src/conditions:linux": [
        "-Wl,-rpath,kittens",
        "-Wl,--version-script=$(location :foo.lds)",
        "-Wl,--script=$(location :additional_script.txt)",
      ],
      "//conditions:default": []}),
      ...
 )
win_def_file

Метка; по умолчанию None

Файл Windows DEF, который будет передан компоновщику.

Этот атрибут следует использовать только при платформе Windows в качестве целевой платформы. Он может использоваться для экспорта символов во время компоновки общей библиотеки.

cc_статическая_библиотека

cc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Это правило в настоящее время находится в стадии эксперимента и может быть использовано только со флагом --experimental_cc_static_library. Создаёт статическую библиотеку из списка целей и их транзитивных зависимостей.

Полученная статическая библиотека содержит объектные файлы целей, перечисленных в deps, а также их транзитивных зависимостей, с приоритетом PIC объектов.

Группы вывода

linkdeps

Текстовый файл, содержащий метки транзитивных зависимостей целей, перечисленных в deps, которые не внесли вклад в статическую библиотеку, но предоставляют по крайней мере одну статическую, динамическую или интерфейсную библиотеку. Полученная статическая библиотека может потребовать, чтобы эти библиотеки были доступны во время компоновки.

linkopts

Текстовый файл, содержащий предоставленные пользователем linkopts всех транзитивных зависимостей целей, перечисленных в deps.

Дублирующие символы

По умолчанию правило cc_static_library проверяет, что полученная статическая библиотека не содержит дублирующих символов. Если это так, сборка завершается ошибкой с сообщением об ошибке, в котором перечислены дублирующиеся символы и объектные файлы, содержащие их.

Это проверку можно отключить для каждой цели или пакета, установив features = ["-symbol_check"] или глобально через --features=-symbol_check.

Поддержка инструментария для symbol_check

Автонастроенные инструментарии C++, поставляемые с Bazel, поддерживают функцию symbol_check на всех платформах. Пользовательские инструментарии могут добавить поддержку для неё двумя способами:

  • Реализация действия ACTION_NAMES.validate_static_library и её включение с помощью функции symbol_check. Инструментарий, указанный в действии, вызывается с двумя аргументами: статическая библиотека, проверяемая на наличие дублирующих символов, и путь к файлу, который должен быть создан, если проверка пройдена.
  • Добавление функции symbol_check флагов архивации, которые заставляют действие, создающее статическую библиотеку, завершаться с ошибкой при наличии дублирующихся символов.

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

deps

Список меток; значение по умолчанию []

Список целей для объединения в статическую библиотеку, включая все их транзитивные зависимости.

Зависимости, не предоставляющие какие-либо объектные файлы, не включаются в статическую библиотеку, но их метки собираются в файле, предоставляемом группой вывода linkdeps.

cc_test

cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

Правило cc_test() компилирует тест. Здесь тест — это бинарная оболочка вокруг некоторого тестового кода.

По умолчанию, C++ тесты подключаются динамически.
Для статического подключения модульного теста, укажите linkstatic=True. Было бы неплохо прокомментировать, почему ваш тест нуждается в linkstatic; это, вероятно, не очевидно.

Неявные целевые выходные данные

  • name.stripped (создаётся только при явном запросе): Обрезанная версия бинарника. strip -g выполняется над бинарником для удаления символов отладки. Дополнительные параметры обрезки можно указать в командной строке, используя --stripopt=-foo.
  • name.dwp (создаётся только при явном запросе): Если включена Fission: файл пакета информации об отладке, подходящий для отладки удалённо развернутых бинарников. Иначе: пустой файл.

См. аргументы cc_binary(), за исключением того, что аргумент stamp по умолчанию равен 0 для тестов и что cc_test имеет дополнительные атрибуты, общие для всех правил тестов (*_test).

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этого целевого объекта.

deps

Список меток; значение по умолчанию []

Список других библиотек, которые должны быть подключены к целевому объекту бинарного файла.

Это могут быть целевые объекты cc_library или objc_library.

Также разрешается помещать скрипты линковщика (.lds) в deps и ссылаться на них в linkopts.
srcs

Список меток; значение по умолчанию []

Список файлов C и C++, которые обрабатываются для создания целевого объекта библиотеки. Это файлы исходного кода и заголовочные файлы C/C++, либо не сгенерированные (обычный исходный код), либо сгенерированные.

Все файлы .cc, .c, и .cpp будут скомпилированы. Это могут быть сгенерированные файлы: если имя файла содержится в outs некоторой другой правила, то эта cc_library автоматически будет зависеть от этой другой правила.

Чистые файлы ассемблера (.s, .asm) не предварительно обрабатываются и обычно компилируются с помощью ассемблера. Предварительно обработанные файлы ассемблера (.S) предварительно обрабатываются и обычно компилируются с помощью компилятора C/C++.

Файл .h не будет скомпилирован, но будет доступен для включения исходными файлами в данном правиле. Файлы .cc и .h могут напрямую включать заголовочные файлы, указанные в этих srcs или в hdrs данного правила или любого правила, указанного в аргументе deps.

Все файлы #include должны быть упомянуты в атрибуте hdrs данного или связанного cc_library правила, или они должны быть перечислены в srcs , если они являются частными для этой библиотеки. См. "Проверка включения заголовков" для более подробного описания.

Файлы .so, .lo, и .a - это предварительно скомпилированные файлы. Ваша библиотека может иметь их как srcs , если она использует сторонний код, для которого у нас нет исходного кода.

Если атрибут srcs содержит метку другого правила, cc_library будет использовать выходные файлы этого правила как исходные файлы для компиляции. Это полезно для однократной генерации исходного кода (для более частого использования лучше реализовать класс правил Starlark и использовать API cc_common)

Разрешенные типы файлов srcs:

  • Файлы исходного кода C и C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Файлы заголовков C и C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Ассемблер с предварительной обработкой C: .S
  • Архив: .a, .pic.a
  • Библиотека с "всегда подключаемым" связыванием: .lo, .pic.lo
  • Динамическая библиотека, с версией или без: .so, .so.version
  • Объектный файл: .o, .pic.o

... и любые правила, которые создают эти файлы (например, cc_embed_data). Разные расширения обозначают разные языки программирования в соответствии с соглашением gcc.

data

Список меток; значение по умолчанию []

Список файлов, необходимых для этой библиотеки во время выполнения. См. общие комментарии об data в Типичные атрибуты, определенные большинством правил построения.

Если data - это имя сгенерированного файла, то эта cc_library правило автоматически зависит от правила-генератора.

Если data - это имя правила, то это cc_library правило автоматически зависит от этого правила, и файлы outs этого правила автоматически добавляются в файлы данных cc_library.

Ваш код C++ может получить доступ к этим файлам данных следующим образом:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

Список меток; значение по умолчанию []

Передать эти файлы команде линковщика C++.

Например, скомпилированные файлы Windows .res могут быть предоставлены здесь для встраивания в целевой бинарный файл.

conlyopts

Список строк; значение по умолчанию []

Добавить эти параметры к команде компиляции C. Подлежат подстановке "Переменных make" и разбору токенов оболочки Bourne.
copts

Список строк; значение по умолчанию []

Добавить эти параметры к команде компиляции C/C++. Подлежат подстановке "Переменных make" и разбору токенов оболочки Bourne.

Каждая строка в этом атрибуте добавляется в указанном порядке к COPTS перед компиляцией целевого бинарного файла. Флаги действуют только при компиляции этого целевого объекта, а не его зависимостей, поэтому будьте осторожны с заголовочными файлами, включенными где-то еще. Все пути должны быть относительными к рабочему пространству, а не к текущему пакету. Этот атрибут не должен потребоваться за пределами third_party.

Если пакет объявляет функцию no_copts_tokenization, разбор токенов оболочки Bourne применяется только к строкам, состоящим из одной "переменной make".

cxxopts

Список строк; значение по умолчанию []

Добавить эти параметры к команде компиляции C++. Подлежат подстановке "Переменных make" и разбору токенов оболочки Bourne.
defines

Список строк; значение по умолчанию []

Список определений для добавления в строку компиляции. Подлежат подстановке "Переменных make" и разбору токенов оболочки Bourne. Каждая строка, которая должна состоять из одного токена оболочки Bourne, предваряется -D и добавляется в строку компиляции для этого целевого объекта, а также для каждого правила, зависящего от него. Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений, добавьте значения определений в local_defines вместо этого.
dynamic_deps

Список меток; значение по умолчанию []

Это другие cc_shared_library зависимости, от которых зависит текущий целевой объект.

Реализация cc_shared_library будет использовать список dynamic_deps (переходно, т.е. также dynamic_deps текущего целевого объекта's dynamic_deps) для определения, какие cc_libraries в переходной deps не должны быть подключены, потому что они уже предоставлены другой cc_shared_library.

hdrs_check

Строка; значение по умолчанию ""

Устарело, не делает ничего.
includes

Список строк; значение по умолчанию []

Список директорий включения, которые должны быть добавлены в строку компиляции. Подлежат подстановке "Переменных make". Каждая строка предваряется путем пакета и передается инструменту C++ для расширения через функцию CROSSTOOL "include_paths". Инструмент, работающий на системе POSIX со стандартными определениями функций, выведет -isystem path_to_package/include_entry. Это должно использоваться только для сторонних библиотек, которые не соответствуют стилю Google для написания инструкций #include. В отличие от COPTS, эти флаги добавляются для этого правила и для каждого правила, которое зависит от него. (Примечание: не правил, от которых оно зависит!) Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений, добавьте флаги "-I" в COPTS вместо этого.

Добавленные include пути будут включать сгенерированные файлы, а также файлы в дереве исходного кода.

link_extra_lib

Метка; значение по умолчанию "@bazel_tools//tools/cpp:link_extra_lib"

Управление подключением дополнительных библиотек.

По умолчанию бинарные файлы C++ подключаются к //tools/cpp:link_extra_lib, которое по умолчанию зависит от метки флага //tools/cpp:link_extra_libs. Без установки флага эта библиотека по умолчанию пуста. Установка флага метки позволяет подключать дополнительные зависимости, такие как переопределения для слабых символов, интерцепторы для функций динамической библиотеки или специальные библиотеки времени выполнения (для замены malloc, предпочтите malloc или --custom_malloc). Установка этого атрибута в None отключает это поведение.

linkopts

Список строк; значение по умолчанию []

Добавить эти флаги к команде линковщика C++. Подлежат подстановке "Переменные make", разбор токенов оболочки Bourne и расширение меток. Каждая строка в этом атрибуте добавляется к LINKOPTS перед подключением целевого бинарного файла.

Каждый элемент этого списка, который не начинается с $ или -, предполагается, что это метка целевого объекта в deps. Список файлов, сгенерированных этим целевым объектом, добавляется к параметрам линковщика. Об ошибке сообщается, если метка недействительна или не объявлена в deps.

linkshared

Булево; значение по умолчанию False

Создать динамическую библиотеку. Чтобы включить этот атрибут, добавьте linkshared=True в ваше правило. По умолчанию этот параметр выключен.

Наличие этого флага означает, что подключение происходит со флагом -shared к gcc, и полученная динамическая библиотека подходит для загрузки, например, в программу Java. Однако, для целей сборки она никогда не будет подключена к зависимому бинарному файлу, так как предполагается, что динамические библиотеки, созданные с помощью правила cc_binary, загружаются вручную другими программами, поэтому её не следует рассматривать как замену правила cc_library. Из соображений масштабируемости мы рекомендуем вообще избегать этого подхода и просто позволить java_library зависеть от cc_library правил вместо этого.

Если вы укажете оба linkopts=['-static'] и linkshared=True, вы получите один полностью автономный модуль. Если вы укажете оба linkstatic=True и linkshared=True, вы получите один, в основном автономный модуль.

linkstatic

Булево значение; по умолчанию False

Для cc_binary и cc_test: подключить бинарник в статическом режиме. Для cc_library.link_static: см. ниже.

По умолчанию этот параметр включён для cc_binary и выключен для остальных.

Если включён и это бинарник или тест, этот параметр сообщает инструменту сборки подключить .a вместо .so для пользовательских библиотек, когда это возможно. Системные библиотеки, такие как libc (но *не* библиотеки времени выполнения C/C++ — см. ниже), по-прежнему подключаются динамически, как и библиотеки, для которых нет статической библиотеки. Поэтому полученный исполняемый файл всё равно будет динамически подключен, поэтому только *частично* статический.

Есть три способа подключения исполняемого файла:

  • СТАТИЧЕСКИЙ с помощью fully_static_link, в котором всё подключается статически; например, "gcc -static foo.o libbar.a libbaz.a -lm".
    Этот режим включён указанием fully_static_link в атрибуте features.
  • СТАТИЧЕСКИЙ, в котором все пользовательские библиотеки подключаются статически (если доступна статическая версия), но системные библиотеки (исключая библиотеки времени выполнения C/C++) подключаются динамически, например, "gcc foo.o libfoo.a libbaz.a -lm".
    Этот режим включён указанием linkstatic=True.
  • ДИНАМИЧЕСКИЙ, в котором все библиотеки подключаются динамически (если доступна динамическая версия), например, "gcc foo.o libfoo.so libbaz.so -lm".
    Этот режим включён указанием linkstatic=False.

Если атрибут linkstatic или fully_static_link в features используется вне //third_party, пожалуйста, добавьте комментарий рядом с правилом, чтобы объяснить почему.

Атрибут linkstatic имеет другое значение, если используется в правиле cc_library(). Для библиотеки C++, linkstatic=True указывает, что разрешена только статическая компоновка, поэтому не будет создано .so. linkstatic=False не препятствует созданию статических библиотек. Атрибут предназначен для управления созданием динамических библиотек.

В производстве должно быть очень мало кода, собранного с linkstatic=False. Если linkstatic=False, инструмент сборки создаст ссылки на зависимости от общих библиотек в области *.runfiles.

local_defines

Список строк; по умолчанию []

Список определений, которые нужно добавить к строке компиляции. Подлежит замене переменных "Make" и токенизации оболочки Bourne. Каждая строка, которая должна состоять из одного токена оболочки Bourne, предваряется -D и добавляется в командную строку компиляции для этого целевого объекта, но не для его зависимостей.
malloc

Метка; по умолчанию "@bazel_tools//tools/cpp:malloc"

Переопределяет стандартную зависимость от malloc.

По умолчанию бинарники C++ подключаются к //tools/cpp:malloc, которая является пустой библиотекой, поэтому бинарник в конечном итоге использует libc malloc. Эта метка должна ссылаться на cc_library. Если компиляция выполняется для правила, отличного от C++, этот параметр не имеет эффекта. Значение этого атрибута игнорируется, если указано linkshared=True.

module_interfaces

Список меток; по умолчанию []

Список файлов рассматривается как интерфейс модулей C++20.

Стандарт C++ не накладывает никаких ограничений на расширение файлов интерфейса модуля.

  • Clang использует cppm
  • GCC может использовать любое расширение исходного файла
  • MSVC использует ixx

Использование защищено флагом --experimental_cpp_modules.

nocopts

Строка; по умолчанию ""

Удаление соответствующих опций из командной строки компиляции C++. Подлежит замене переменными "Make". Значение этого атрибута интерпретируется как регулярное выражение. Любые существующие COPTS которые соответствуют этому регулярному выражению (включая значения, явно указанные в атрибуте copts правила), будут удалены из COPTS для целей компиляции данного правила. Этот атрибут не должен быть необходим или использован за пределами third_party. Значения не предварительно обрабатываются, за исключением подстановки "переменных Make".
reexport_deps

Список меток; по умолчанию []

stamp

Целое число; по умолчанию 0

Включить ли информацию о сборке в бинарник. Возможные значения:
  • stamp = 1: Всегда вставлять информацию о сборке в бинарник, даже в сборках с --nostamp. Избегайте этого значения, так как оно потенциально убивает кэширование удалённого бинарника и любых последующих действий, которые зависят от него.
  • stamp = 0: Всегда заменять информацию о сборке константными значениями. Это обеспечивает хорошее кэширование результатов сборки.
  • stamp = -1: Вставка информации о сборке контролируется флагом --[no]stamp.

Отмеченные бинарники не пересобираются, если их зависимости не изменились.

win_def_file

Метка; по умолчанию None

Файл DEF для Windows, который будет передан компоновщику.

Этот атрибут следует использовать только при целевой платформе Windows. Он может использоваться для экспорта символов при компоновке общей библиотеки.

cc_toolchain

cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)

Представляет цепочку инструментов C++.

Это правило отвечает за:

  • Сбор всех артефактов, необходимых для выполнения действий C++. Это делается с помощью атрибутов, таких как all_files, compiler_files, linker_files, или других атрибутов, заканчивающихся _files). Чаще всего это группы файлов, охватывающие все необходимые файлы.
  • Генерацию корректных командных строк для действий C++. Это делается с помощью CcToolchainConfigInfo провайдера (подробности ниже).

Используйте атрибут toolchain_config для настройки цепочки инструментов C++. См. также эту страницу для подробного описания настройки цепочки инструментов C++ и документации по выбору цепочки инструментов.

Используйте tags = ["manual"] для предотвращения ненужной сборки и настройки цепочек инструментов при вызове bazel build //...

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этого целевого объекта.

all_files

Метка; обязательно

Коллекция всех артефактов cc_toolchain. Эти артефакты будут добавлены в качестве входных данных для всех действий, связанных с правилами cc_toolchain (за исключением действий, использующих более точные наборы артефактов из атрибутов ниже). Bazel предполагает, что all_files является супермножеством всех других атрибутов, предоставляющих артефакты (например, компиляция с linkstamp требует как файлы компиляции, так и файлы линковки, поэтому она использует all_files).

Вот что содержит cc_toolchain.files, и это используется всеми правилами Starlark, использующими C++ инструмент.

ar_files

Метка; значение по умолчанию None

Коллекция всех артефактов cc_toolchain, необходимых для действий архивирования.
as_files

Метка; значение по умолчанию None

Коллекция всех артефактов cc_toolchain, необходимых для действий сборки.
compiler_files

Метка; обязательно

Коллекция всех артефактов cc_toolchain, необходимых для действий компиляции.
compiler_files_without_includes

Метка; значение по умолчанию None

Коллекция всех артефактов cc_toolchain, необходимых для действий компиляции в случае, если поддержка обнаружения ввода данных (в настоящее время только Google).
coverage_files

Метка; значение по умолчанию None

Коллекция всех артефактов cc_toolchain, необходимых для действий покрытия кода. Если не указано, используется all_files.
dwp_files

Метка; обязательно

Коллекция всех артефактов cc_toolchain, необходимых для действий dwp.
dynamic_runtime_lib

Метка; значение по умолчанию None

Артефакт динамической библиотеки для C++ среды выполнения (например, libstdc++.so).

Будет использоваться при включенном флаге 'static_link_cpp_runtimes' и динамической линковке зависимостей.

exec_transition_for_inputs

Булево; значение по умолчанию False

Устаревшее. Бездействующее.
libc_top

Метка; значение по умолчанию None

Коллекция артефактов для libc, используемых в качестве входных данных для действий компиляции/линковки.
linker_files

Метка; обязательно

Коллекция всех артефактов cc_toolchain, необходимых для действий линковки.
module_map

Метка; значение по умолчанию None

Артефакт карты модулей для использования в модульных сборках.
objcopy_files

Метка; обязательно

Коллекция всех артефактов cc_toolchain, необходимых для действий objcopy.
output_licenses

Список строк; значение по умолчанию []

static_runtime_lib

Метка; значение по умолчанию None

Артефакт статической библиотеки для C++ среды выполнения (например, libstdc++.a).

Будет использоваться при включенном флаге 'static_link_cpp_runtimes' и статической линковке зависимостей.

strip_files

Метка; обязательно

Коллекция всех артефактов cc_toolchain, необходимых для действий удаления.
supports_header_parsing

Булево; значение по умолчанию False

Устанавливается в True, когда cc_toolchain поддерживает действия анализа заголовков.
supports_param_files

Булево; значение по умолчанию True

Устанавливается в True, когда cc_toolchain поддерживает использование файлов параметров для действий линковки.
toolchain_config

Метка; обязательно

Метка правила, предоставляющего cc_toolchain_config_info.
toolchain_identifier

Строка; значение по умолчанию ""

Идентификатор, используемый для сопоставления этого cc_toolchain с соответствующим crosstool_config.toolchain.

До тех пор, пока проблема #5380 не будет решена, это рекомендуемый способ сопоставления cc_toolchain с CROSSTOOL.toolchain. Будет заменен атрибутом toolchain_config (#5380).

cc_toolchain_suite

cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Устаревшее: правило является бездействующим и будет удалено.

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этого целевого объекта.

fdo_prefetch_hints

fdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Представляет профиль FDO предварительной выборки, который находится в рабочей области. Примеры:


fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этого целевого объекта.

profile

Метка; обязательно

Метка профиля подсказок. Файл подсказок имеет расширение .afdo. Метка также может указывать на правило fdo_absolute_path_profile.

fdo_profile

fdo_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Представляет профиль FDO, находящийся в рабочей области. Пример:


fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этого целевого объекта.

memprof_profile

Метка; значение по умолчанию None

Метка профиля MemProf. Ожидается, что профиль будет иметь расширение .profdata (для индексированного/символизированного профиля memprof) или расширение .zip для архива zip, содержащего файл memprof.profdata.
profile

Метка; обязательно

Метка профиля FDO или правило, которое его генерирует. Файл FDO может иметь одно из следующих расширений: .profraw для неиндексированного профиля LLVM, .profdata для индексированного профиля LLVM, .zip, содержащий профиль LLVM profraw, .afdo для профиля AutoFDO, .xfdo для профиля XBinary. Метка также может указывать на правило fdo_absolute_path_profile.
proto_profile

Метка; значение по умолчанию None

Метка профиля protobuf.

memprof_profile

memprof_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Представляет профиль MEMPROF, находящийся в рабочей области. Пример:


memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этого целевого объекта.

profile

Метка; обязательно

Метка профиля MEMPROF. Ожидается, что профиль будет иметь расширение .profdata (для индексированного/символизированного профиля memprof) или расширение .zip для архива zip, содержащего файл memprof.profdata. Метка также может указывать на правило fdo_absolute_path_profile.

propeller_optimize

propeller_optimize(name, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Представляет профиль оптимизации Propeller в рабочей области. Пример:


propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этого целевого объекта.

cc_profile

Метка; обязательно

Метка профиля, передаваемого различным действиям компиляции. Этот файл имеет расширение .txt.
ld_profile

Метка; обязательно

Метка профиля, передаваемого действию компоновки. Этот файл имеет расширение .txt.

За исключением случаев, когда указано иное, содержимое этой страницы лицензировано на условиях лицензии Creative Commons Attribution 4.0, а примеры кода лицензированы на условиях лицензии Apache 2.0. Подробности см. в Политиках сайта Google Developers. Java — зарегистрированный товарный знак Oracle и/или её дочерних компаний.

Последнее обновление 2024-12-10 UTC.

Licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License.
https://bazel.build/versions/8.0.0/reference/be/c-cpp

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API