Spec-Zone.ru › Bazel 6.0

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

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

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

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

hdrs

List of labels; optional

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

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

alwayslink

Boolean; optional; default is False

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

Если 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 и добавляется в командную строку компиляции для этой цели, а также для каждого правила, которое от неё зависит. Будьте очень осторожны, так как это может иметь далеко идущие последствия. В случае сомнений, добавьте значения определений в 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 shell. Каждая строка, которая должна состоять из одного токена Bourne shell, предваряется -D и добавляется в командную строку компиляции для этого целевого объекта, но не для его зависимостей.
nocopts

String; optional

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

String; optional

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

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

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

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

textual_hdrs

List of labels; optional

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

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

win_def_file

Label; optional

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

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

cc_proto_library

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

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

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

Пример:

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

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

proto_library(
    name = "foo_proto",
)

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

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

fdo_prefetch_hints

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

profile

Label; optional

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

fdo_profile

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

absolute_path_profile

String; optional

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

Label; optional

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

Label; optional

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

propeller_optimize

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

ld_profile

Label; optional

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

cc_test

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

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

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

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

srcs

List of labels; optional

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

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

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

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

Если имя правила находится в srcs, то это правило автоматически зависит от него. Если именованные правила outs являются файлами исходного кода 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 variable" и токенеризации оболочки Bourne.

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

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

defines

List of strings; optional

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

List of strings; optional

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

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

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

linkopts

List of strings; optional

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

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

linkstatic

Boolean; optional; default is False

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

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

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

На самом деле существует три способа связать исполняемый файл:

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

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

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

local_defines

List of strings; optional

Список определений, которые нужно добавить в строку компиляции. Подлежат замене переменной "Make" variable и токенеризации оболочки 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" variable. Значение этого атрибута интерпретируется как регулярное выражение. Любые существующие COPTS, которые соответствуют этому регулярному выражению (включая явно указанные значения в атрибуте правила copts), будут удалены из COPTS для целей компиляции этого правила. Этот атрибут редко нужен.
stamp

Integer; optional; default is 0

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

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

win_def_file

Label; optional

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

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

cc_toolchain

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

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

Эта команда отвечает за:

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

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

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

Аргументы

Атрибуты
name

Name; required

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

all_files

Label; required

Коллекция всех артефактов cc_toolchain. Эти артефакты будут добавлены в качестве входных данных ко всем действиям, связанным с rules_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.

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

cc_toolchain_suite

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

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

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

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

Последнее обновление 2022-12-19 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.0.0/reference/be/c-cpp

Spec-Zone.ru

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