Spec-Zone.ru › Bazel 6.1

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

Правила

  • cc_binary
  • cc_import
  • cc_library
  • cc_proto_library
  • fdo_prefetch_hints
  • fdo_profile
  • propeller_optimize
  • cc_test
  • cc_toolchain
  • cc_toolchain_suite

cc_binary

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

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

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

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

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

Они могут быть целевыми файлами типа cc_library или objc_library.

srcs

List of labels; optional

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

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

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

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

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

Разрешенные типы файлов 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

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

additional_linker_inputs

List of labels; optional

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

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

copts

List of strings; optional

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

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

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

defines

List of strings; optional

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

List of strings; optional

Список каталогов включения для добавления к строке компиляции.

Подлежат подстановке переменных «Make». Каждая строка предваряется -isystem и добавляется к COPTS. В отличие от COPTS, эти флаги добавляются для этого правила и для каждого правила, зависящего от него. (Примечание: не для правил, от которых оно зависит!) Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений, добавьте флаги «-I» в COPTS вместо этого.

Заголовочные файлы должны добавляться в srcs или hdrs, иначе они не будут доступны зависимым правилам, когда компиляция работает в изолированном контейнере (по умолчанию).

linkopts

List of strings; optional

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

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

linkshared

Boolean; optional; nonconfigurable; default is False

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

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

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

linkstatic

Boolean; optional; default is True

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

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

Если включен, и это бинарный или тестовый файл, этот параметр сообщает инструменту сборки подключать .a вместо .so для пользовательских библиотек, когда это возможно. Некоторые системные библиотеки по-прежнему могут подключаться динамически, как и библиотеки, для которых нет статической библиотеки. Таким образом, полученный исполняемый файл по-прежнему будет динамически подключаться, следовательно, только *частично* статически.

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

  • STATIC с функцией fully_static_link, в которой всё подключается статически; например, «gcc -static foo.o libbar.a libbaz.a -lm».
    Этот режим включен, если указан fully_static_link в атрибуте features.
  • STATIC, в котором все пользовательские библиотеки подключаются статически (если имеется статическая версия), но где системные библиотеки (исключая библиотеки времени выполнения C/C++) подключаются динамически, например, «gcc foo.o libfoo.a libbaz.a -lm».
    Этот режим включен, если указан linkstatic=True.
  • DYNAMIC, в котором все библиотеки подключаются динамически (если имеется динамическая версия), например, «gcc foo.o libfoo.so libbaz.so -lm».
    Этот режим включен, если указан linkstatic=False.

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

Если linkstatic=False, то инструмент сборки создаст символические ссылки на зависимые библиотеки динамической компоновки в области *.runfiles.

local_defines

List of strings; optional

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

Label; optional; default is @bazel_tools//tools/cpp:malloc

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

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

nocopts

String; optional

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

Integer; optional; default is -1

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

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

win_def_file

Label; optional

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

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

cc_import

cc_import(name, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)

Правила cc_import позволяют пользователям импортировать предварительно скомпилированные библиотеки C/C++.

Типичные варианты использования:
1. Подключение статической библиотеки

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = 1,
)
2. Подключение разделяемой библиотеки (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Подключение разделяемой библиотеки с библиотекой интерфейса (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is a import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. Подключение разделяемой библиотеки с system_provided=True (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = 1,
)
5. Подключение к статической или разделяемой библиотеке
В Unix:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

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

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
В Windows:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)

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

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

Аргументы

Атрибуты
name

Name; required

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

List of labels; optional

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

Boolean; optional; default is False

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

Если alwayslink не работает с VS 2017 на Windows, это связано с известной проблемой https://github.com/bazelbuild/bazel/issues/3949, пожалуйста, обновите VS 2017 до последней версии.

interface_library

Label; optional

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

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

shared_library

Label; optional

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

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

static_library

Label; optional

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

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

system_provided

Boolean; optional; default is False

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

cc_library

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

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

Все файлы заголовков, используемые в сборке, должны быть объявлены в hdrs или srcs правил cc_*. Это обязательное требование.

Для правил cc_library, заголовки в hdrs составляют публичный интерфейс библиотеки и могут быть включены напрямую как из файлов в hdrs и srcs самой библиотеки, так и из файлов в hdrs и srcs правил cc_*, которые перечисляют библиотеку в своих deps. Заголовки в srcs должны быть включены напрямую только из файлов в hdrs и srcs самой библиотеки. При решении, помещать ли заголовок в hdrs или srcs, необходимо спросить, хотите ли вы, чтобы потребители этой библиотеки могли напрямую включить его. Это примерно аналогично решению о видимости public и private в языках программирования.

Правила cc_binary и cc_test не имеют экспортируемого интерфейса, поэтому у них также нет атрибута hdrs. Все заголовки, относящиеся непосредственно к двоичному файлу или тесту, должны быть перечислены в srcs.

Для иллюстрации этих правил, рассмотрите следующий пример.

cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)

cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)

cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)

Допустимые прямые включения в этом примере перечислены в таблице ниже. Например, foo.cc разрешено напрямую включать foo.h и bar.h, но не baz.h.

Включаемый файл Разрешённые включения
foo.h bar.h
foo.cc foo.h bar.h
bar.h bar-impl.h baz.h
bar-impl.h bar.h baz.h
bar.cc bar.h bar-impl.h baz.h
baz.h baz-impl.h
baz-impl.h baz.h
baz.cc baz.h baz-impl.h

Правила проверки включения применяются только к прямым включениям. В приведённом выше примере foo.cc разрешено включать bar.h, которое может включать baz.h, которое, в свою очередь, разрешено включать baz-impl.h. Технически, компиляция файла .cc может транзитивно включать любой файл заголовков в hdrs или srcs в любом cc_library в транзитивном замкнутом deps множестве. В этом случае компилятор может прочитать baz.h и baz-impl.h при компиляции foo.cc, но foo.cc не должен содержать #include "baz.h". Для этого baz должен быть добавлен в deps правил foo.

К сожалению, Bazel в настоящее время не может различать прямые и транзитивные включения, поэтому не может обнаруживать случаи ошибок, когда файл незаконно включает заголовок напрямую, который разрешено включать только транзитивно. Например, Bazel не будет жаловаться, если в приведённом выше примере foo.cc напрямую включает baz.h. Это было бы незаконно, потому что foo не зависит напрямую от baz. В настоящее время в этом случае не возникает ошибки, но такая проверка ошибок может быть добавлена в будущем.

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

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

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

srcs

List of labels; optional

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

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

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

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

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

Разрешенные типы файлов 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

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

hdrs

List of labels; optional

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

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

alwayslink

Boolean; optional; default is False

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

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

copts

List of strings; optional

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

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

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

defines

List of strings; optional

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

List of labels; optional

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

На данный момент использование ограничено cc_libraries и защищено флагом --experimental_cc_implementation_deps.

include_prefix

String; optional

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

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

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

includes

List of strings; optional

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

Подлежит замене "Переменной Make". Каждая строка предваряется -isystem и добавляется к COPTS. В отличие от COPTS, эти флаги добавляются для данного правила и каждого правила, от него зависящего. (Примечание: не правила, от которых оно зависит!) Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений, добавьте флаги "-I" в COPTS вместо этого.

Заголовочные файлы должны быть добавлены в srcs или hdrs, иначе они не будут доступны зависимым правилам, когда компиляция находится в защищенной среде (по умолчанию).

linkopts

List of strings; optional

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

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

linkstamp

Label; optional

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

Boolean; optional; default is False

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

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

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

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

  • СТАТИЧЕСКИЙ с функцией 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 имеет другое значение, если используется в правиле cc_library(). Для C++ библиотеки linkstatic=True указывает, что разрешено только статическое подключение, поэтому динамические библиотеки .so не будут созданы. linkstatic=False не предотвращает создание статических библиотек. Этот атрибут предназначен для управления созданием динамических библиотек.

Если linkstatic=False, инструмент сборки создаст ссылки на зависящие общие библиотеки в области *.runfiles.

local_defines

List of strings; optional

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

String; optional

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

String; optional

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

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

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

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

textual_hdrs

List of labels; optional

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

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

win_def_file

Label; optional

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

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

cc_proto_library

cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

cc_proto_library генерирует код C++ из .proto файлов.

deps должен указывать на proto_library правила.

Пример:

cc_library(
    name = "lib",
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

Список proto_library правил для генерации кода C++.

fdo_prefetch_hints

fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

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

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

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

Аргументы

Атрибуты
name

Name; required

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

profile

Label; optional

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

fdo_profile

fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

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

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

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

Аргументы

Атрибуты
name

Name; required

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

absolute_path_profile

String; optional

Абсолютный путь к профилю FDO. Файл FDO может иметь только расширение .afdo.
profile

Label; optional

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

Label; optional

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

propeller_optimize

propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

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

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

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

Аргументы

Атрибуты
name

Name; required

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

ld_profile

Label; optional

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

cc_test

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

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

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

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

srcs

List of labels; optional

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

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

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

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

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

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

  • Файлы исходного кода 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

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

additional_linker_inputs

List of labels; optional

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

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

copts

List of strings; optional

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

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

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

defines

List of strings; optional

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

List of strings; optional

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

Подлежат замене переменными «Make». Каждая строка предваряется -isystem и добавляется к COPTS. В отличие от COPTS, эти флаги добавляются для этого правила и для каждого правила, от которого оно зависит. (Примечание: не правила, от которых оно зависит!) Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений добавьте флаги «-I» в COPTS вместо этого.

Заголовочные файлы должны быть добавлены в srcs или hdrs, иначе они не будут доступны зависимым правилам, когда компиляция находится в песочнице (по умолчанию).

linkopts

List of strings; optional

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

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

linkstatic

Boolean; optional; default is False

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

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

Если включено и это бинарный или тестовый файл, этот параметр сообщает инструменту сборки подключать .a вместо .so для пользовательских библиотек, когда это возможно. Некоторые системные библиотеки все еще могут подключаться динамически, как и библиотеки, для которых нет статической библиотеки. Таким образом, результируемый исполняемый файл все равно будет подключаться динамически, следовательно, только частично статично.

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

  • СТАТИЧЕСКИ с функцией 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 имеет другое значение, если используется в правиле cc_library(). Для библиотеки C++, linkstatic=True указывает, что разрешена только статическая компоновка, поэтому .so не будет создано. linkstatic=False не предотвращает создание статических библиотек. Атрибут предназначен для управления созданием динамических библиотек.

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

local_defines

List of strings; optional

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

Label; optional; default is @bazel_tools//tools/cpp:malloc

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

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

nocopts

String; optional

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

Integer; optional; default is 0

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

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

win_def_file

Label; optional

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

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

cc_toolchain

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

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

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

all_files

Label; required

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

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

ar_files

Label; optional

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

as_files

Label; optional

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

compiler

String; optional; nonconfigurable

Устарело. Используйте вместо этого атрибут toolchain_identifier. Он будет недействующим после миграции CROSSTOOL в Starlark и будет удален в #7075.

При установке он будет использоваться для выбора crosstool_config.toolchain. Он будет иметь приоритет над опцией --cpu Bazel.

compiler_files

Label; required

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

Label; optional

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

Label; optional

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

String; optional; nonconfigurable

Устарело. Используйте атрибут toolchain_identifier вместо этого. Он будет недействующим после миграции CROSSTOOL в Starlark и будет удален в #7075.

При установке он будет использоваться для выбора crosstool_config.toolchain. Он будет иметь приоритет над опцией --cpu Bazel.

dwp_files

Label; required

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

Label; optional

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

Это будет использоваться, когда включена функция 'static_link_cpp_runtimes', и мы связываем зависимости динамически.

exec_transition_for_inputs

Boolean; optional; default is True

Установите в значение True, чтобы собрать все входные файлы для cc_toolchain для платформы exec вместо того, чтобы не иметь перехода (т. е. платформа целевого объекта по умолчанию).
libc_top

Label; optional

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

Label; required

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

Label; optional

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

Label; required

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

Label; optional

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

Это будет использоваться, когда функция 'static_link_cpp_runtimes' включена, и мы связываем зависимости статически.

strip_files

Label; required

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

Boolean; optional; default is False

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

Boolean; optional; default is True

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

Label; required

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

String; optional; nonconfigurable

Идентификатор, используемый для сопоставления этого 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)

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

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

  • Сбор всех соответствующих инструментальных цепочек C++.
  • Выбор одной инструментальной цепочки в зависимости от опций --cpu и --compiler , переданных в Bazel.

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

Аргументы

Атрибуты
name

Name; required

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

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

Карта из строк "<cpu>" или "<cpu>|<compiler>" в метку cc_toolchain. "<cpu>" будет использоваться, когда в Bazel передана только опция --cpu, а "<cpu>|<compiler>" будет использоваться, когда в Bazel переданы обе опции --cpu и --compiler. Пример:
          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )
          

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

Последнее обновление 2023-03-15 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/6.1.0/reference/be/c-cpp

Spec-Zone.ru

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