Spec-Zone.ru › Bazel 6.4

Правила 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 Shell.

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

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

defines

List of strings; optional

Список определений для добавления в командную строку компиляции. Подлежат подстановке "Переменных Make" и разбору токенов Bourne Shell. Каждая строка, которая должна состоять из одного токена Bourne Shell, предваряется -D и добавляется в командную строку компиляции для этой цели, а также для каждого правила, зависящего от неё. Будьте очень внимательны, так как это может иметь далеко идущие последствия. В случае сомнений, добавьте значения определений в local_defines вместо этого.
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, выводится ошибка.

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 для пользовательских библиотек, когда это возможно. Некоторые системные библиотеки все же могут быть подключены динамически, как и библиотеки, для которых нет статической библиотеки. Таким образом, полученный исполняемый файл всё равно будет подключён динамически, поэтому он лишь *в основном* статический.

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

  • СТАТИЧЕСКИЙ с функцией 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 и добавляется в командную строку компиляции для этой цели, но не для её зависимостей.
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

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

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

cc_import

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

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

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

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

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

List of labels; optional

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

Boolean; optional; default is False

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

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

interface_library

Label; optional

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

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

shared_library

Label; optional

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

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

static_library

Label; optional

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

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

system_provided

Boolean; optional; default is False

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

cc_library

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

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

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

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

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

Чтобы проиллюстрировать эти правила, рассмотрим следующий пример.

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

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

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

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

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

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

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

Аргументы

Атрибуты
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 вместо этого, даже если они включены опубликованным заголовком. Подробно см. "Проверка включения заголовков".

additional_compiler_inputs

List of labels; optional

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

List of labels; optional

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

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

alwayslink

Boolean; optional; default is False

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

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

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 вместо этого.
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 и расширение меток. Каждый элемент этого атрибута добавляется к 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++ runtime) привязаны динамически, например, "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" variable и токенизации оболочки Bourne Bourne shell tokenization. Каждая строка, которая должна состоять из одного токена оболочки Bourne, предваряется -D и добавляется в командную строку компиляции для этого объекта, но не для его зависимостей.
nocopts

String; optional

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

String; optional

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

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

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

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

textual_hdrs

List of labels; optional

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

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

win_def_file

Label; optional

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

Этот атрибут следует использовать только при платформе 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++, они компилируются в это правило; если это файлы библиотек, они подключаются.

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

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".
    Этот режим включен, если в атрибуте features указано fully_static_link.
  • СТАТИЧЕСКИ, в котором все пользовательские библиотеки подключаются статически (если доступна статическая версия), но системные библиотеки (за исключением библиотек времени выполнения 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>" — когда передаются и --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 для разработчиков. Java — зарегистрированный товарный знак Oracle и/или её дочерних компаний.

Последнее обновление 2023-10-20 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.4.0/reference/be/c-cpp

Spec-Zone.ru

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