Spec-Zone.ru › Bazel 6.2

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

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

alwayslink

Boolean; optional; default is False

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

Если alwayslink не работает с VS 2017 в Windows, это связано с известной проблемой https://github.com/bazelbuild/bazel/issues/3949, пожалуйста, обновите ваш 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 может не включать какой-либо определенный набор флагов компилятора, и поэтому не должна зависеть от какого-либо определенного заголовка, параметра компилятора или другой переменной сборки. Этот параметр должен потребоваться только в пакете base.
linkstatic

Boolean; optional; default is False

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

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

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

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

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

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

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

local_defines

List of strings; optional

Список определений для добавления к строке компиляции. Подлежат подстановке "Переменной Make" и токенизации оболочки Bourne. Каждая строка, которая должна состоять из одного токена оболочки Bourne, предваряется -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++) подключены динамически, например, "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, то инструмент построения создаст символические ссылки на зависящие от shared библиотеки в области *.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_инструментальная_цепочка

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). Чаще всего это filegroups, которые обобщают все необходимые файлы.
  • Генерация правильных командных строк для действий C++. Это делается с помощью поставщика CcToolchainConfigInfo (подробности ниже).

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

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

Аргументы

Атрибуты
name

Name; required

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

all_files

Label; required

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

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

ar_files

Label; optional

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

as_files

Label; optional

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

compiler

String; optional; nonconfigurable

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

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

compiler_files

Label; required

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

Label; optional

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

Label; optional

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

String; optional; nonconfigurable

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

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

dwp_files

Label; required

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

Label; optional

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

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

exec_transition_for_inputs

Boolean; optional; default is True

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

Label; optional

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

Label; required

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

Label; optional

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

Label; required

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

Label; optional

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

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

strip_files

Label; required

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

Boolean; optional; default is False

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

Boolean; optional; default is True

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

Label; required

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

String; optional; nonconfigurable

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

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

cc_toolchain_suite

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

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

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

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

Последнее обновление 2023-05-15 UTC.

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

Spec-Zone.ru

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