Spec-Zone.ru › Bazel 6.3

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

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

  • СТАТИЧЕСКИЙ с функцией 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 -1

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

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

win_def_file

Label; optional

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

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

cc_import

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

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

Обычно применяются следующие случаи:
1. Подключение статической библиотеки

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

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

hdrs

List of labels; optional

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

Boolean; optional; default is False

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

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

interface_library

Label; optional

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

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

shared_library

Label; optional

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

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

static_library

Label; optional

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

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

system_provided

Boolean; optional; default is False

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

cc_library

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

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

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

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

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

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

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

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

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

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

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

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

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

Аргументы

Атрибуты
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_240%%:

  • Файлы исходного кода 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).
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 и добавляется в командную строку компиляции для этой цели, а также для каждого правила, которое от нее зависит. Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений, добавьте значения define в 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 может не включать какой-либо определённый набор флагов компилятора, и поэтому не должна зависеть от каких-либо определенных заголовков, опций компилятора или других переменных сборки. Эта опция должна потребоваться только в пакете linkstatic.
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.

END_OF_DOCUMENT_MARKER
local_defines

List of strings; optional

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

String; optional

Удаление соответствующих опций из командной строки компиляции C++. Подлежит замене переменной "Make" variable. Значение этого атрибута интерпретируется как регулярное выражение. Любые существующие 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 может иметь следующие расширения: .profraw для неиндексированного профиля LLVM, .profdata для индексированного профиля LLVM, .zip, содержащий профиль LLVM profraw, или .afdo для профиля AutoFDO.
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".
    Этот режим включён, если указать 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" и токенизации оболочки 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

Файл DEF Windows для передачи линковщику.

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

Цепочка инструментов C++

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-07-25 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.3.0/reference/be/c-cpp

Spec-Zone.ru

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