Spec-Zone.ru › Bazel 7.0

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

Правила

  • cc_binary
  • cc_import
  • cc_library
  • cc_proto_library
  • cc_shared_library
  • fdo_prefetch_hints
  • fdo_profile
  • memprof_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, link_extra_lib, 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

Имя; обязательно

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

deps

Список меток; значение по умолчанию []

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

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

srcs

Список меток; значение по умолчанию []

Список файлов 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

Список меток; значение по умолчанию []

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

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

copts

Список строк; значение по умолчанию []

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

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

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

defines

Список строк; значение по умолчанию []

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

Список строк; значение по умолчанию []

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

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

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

link_extra_lib

Метка; значение по умолчанию "@bazel_tools//tools/cpp:link_extra_lib"

Управление подключением дополнительных библиотек.

По умолчанию двоичные файлы C++ подключаются к //tools/cpp:link_extra_lib, который по умолчанию зависит от флага метки //tools/cpp:link_extra_libs. Без установки флага эта библиотека по умолчанию пустая. Установка флага метки позволяет подключать необязательные зависимости, такие как переопределения для слабых символов, обработчики для функций разделяемых библиотек или специальные библиотеки времени выполнения (для замены malloc, используйте malloc или --custom_malloc). Установка этого атрибута в None отключает это поведение.

linkopts

Список строк; значение по умолчанию []

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

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

linkshared

Булево; не настраиваемый; значение по умолчанию False

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

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

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

linkstatic

Булево; значение по умолчанию 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.

END_OF_DOCUMENT_MARKER
local_defines

Список строк; по умолчанию []

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

Метка; по умолчанию "@bazel_tools//tools/cpp:malloc"

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

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

nocopts

Строка; по умолчанию ""

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

Целое число; по умолчанию -1

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

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

win_def_file

Метка; по умолчанию None

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

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

cc_import

cc_import(name, deps, 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 an 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,
)
cc_import поддерживает атрибут include. Например:
  cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = [ "vendor/curl/include" ],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

Аргументы

Атрибуты
name

Имя; необходимо

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

deps

Список меток; по умолчанию []

Список других библиотек, от которых зависит целевой объект. См. общие комментарии о deps в Типичные атрибуты, определенные большинством правил сборки.
hdrs

Список меток; по умолчанию []

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

Булево; по умолчанию False

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

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

interface_library

Метка; по умолчанию None

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

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

shared_library

Метка; по умолчанию None

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

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

static_library

Метка; по умолчанию None

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

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

system_provided

Булево; по умолчанию False

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

cc_library

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

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

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

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

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

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

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

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

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

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

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

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

Bazel полагается на поддержку инструментария для соблюдения правил проверки включения. Функция layering_check должна поддерживаться инструментарием и запрашиваться явно, например, через флаг командной строки --features=layering_check или параметр features функции package. Предоставляемые Bazel инструментарии поддерживают эту функцию только с clang на Unix и macOS.

Аргументы

Атрибуты
name

Имя; обязательно

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

deps

Список метки; значение по умолчанию []

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

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

srcs

Список метки; значение по умолчанию []

Список файлов 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

Список метки; значение по умолчанию []

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

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

additional_compiler_inputs

Список метки; значение по умолчанию []

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

Список метки; значение по умолчанию []

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

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

alwayslink

Булево значение; значение по умолчанию False

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

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

copts

Список строк; значение по умолчанию []

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

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

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

defines

Список строк; значение по умолчанию []

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

Список метки; значение по умолчанию []

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

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

include_prefix

Строка; значение по умолчанию ""

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

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

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

includes

Список строк; значение по умолчанию []

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

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

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

linkopts

Список строк; значение по умолчанию []

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

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

linkstamp

Метка; значение по умолчанию None

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

Булево значение; значение по умолчанию — 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

Список строк; значение по умолчанию — []

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

Строка; значение по умолчанию — ""

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

Строка; значение по умолчанию — ""

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

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

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

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

textual_hdrs

Список меток; значение по умолчанию — []

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

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

win_def_file

Метка; значение по умолчанию — None

Файл 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

Имя; обязательно

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

deps

Список меток; значение по умолчанию — []

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

cc_shared_library

cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)

Он производит общую библиотеку.

Пример

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

В примере foo_shared статически связывает foo и baz, при этом последний является транзитивной зависимостью. Он не связывает bar, так как он уже предоставляется динамически библиотекой dynamic_dep bar_shared.

foo_shared использует файл скрипта компоновщика *.lds для управления символами, которые должны быть экспортированы. Логика правила cc_shared_library не контролирует, какие символы экспортируются, она только использует то, что предполагается экспортировать, чтобы выдавать ошибки во время фазы анализа, если две общие библиотеки экспортируют одни и те же целевые объекты.

Каждая прямая зависимость от cc_shared_library предполагается экспортируемой. Поэтому Bazel предполагает во время анализа, что foo экспортируется foo_shared. baz не предполагается экспортируемой foo_shared. Каждый целевой объект, соответствующий exports_filter, также предполагается экспортируемым.

Каждый cc_library в примере должен появляться не более чем в одном cc_shared_library. Если бы мы хотели связать baz также в bar_shared, нам нужно добавить tags = ["LINKABLE_MORE_THAN_ONCE"] к baz.

Из-за атрибута shared_lib_name файл, созданный bar_shared, будет иметь имя bar.so вместо имени libbar.so, которое он имел бы по умолчанию в Linux.

Ошибки

Two shared libraries in dependencies export the same symbols.

Это произойдёт всякий раз, когда вы создаёте целевой объект с двумя различными зависимостями cc_shared_library, которые экспортируют один и тот же целевой объект. Чтобы исправить это, нужно предотвратить экспорт библиотек в одной из зависимостей cc_shared_library.

Two shared libraries in dependencies link the same library statically

Это произойдёт всякий раз, когда вы создаёте новый cc_shared_library с двумя различными зависимостями cc_shared_library, которые статически связывают один и тот же целевой объект. Аналогично ошибке с экспортом.

Один из способов исправить это — прекратить связывание библиотеки в одной из зависимостей cc_shared_library. В то же время, та, которая всё ещё связывает её, должна экспортировать библиотеку, чтобы та, которая не связывает её, сохраняла видимость символов. Другой способ — выделить третью библиотеку, которая экспортирует целевой объект. Третий способ — пометить виновную cc_library как LINKABLE_MORE_THAN_ONCE, но это исправление должно быть редким, и вы должны быть абсолютно уверены, что cc_library действительно безопасно связывать более чем один раз.

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

Это означает, что библиотека в транзитивном замыкании вашей deps доступна без прохождения через одну из зависимостей cc_shared_library, но уже связана с другим cc_shared_library в dynamic_deps и не экспортирована.

Решение — экспортировать её из зависимости cc_shared_library или выделить третью cc_shared_library.

Do not place libraries which only contain a precompiled dynamic library in deps.

Если у вас есть предварительно скомпилированная динамическая библиотека, её не нужно и нельзя статически связывать с текущим целевым объектом cc_shared_library, который вы сейчас создаёте. Поэтому она не должна находиться в deps целевого объекта cc_shared_library. Если эта предварительно скомпилированная динамическая библиотека является зависимостью одного из ваших cc_libraries, тогда cc_library должен напрямую зависеть от неё.

Trying to export a library already exported by a different shared library

Вы увидите эту ошибку, если в текущем правиле вы пытаетесь экспортировать целевой объект, который уже экспортируется одной из ваших динамических зависимостей.

Чтобы исправить это, удалите целевой объект из deps и полагайтесь только на него из динамической зависимости или убедитесь, что exports_filter не захватывает этот целевой объект.

Аргументы

Атрибуты
name

Имя; обязательно

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

deps

Список метки; значение по умолчанию []

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

Любая транзитивная зависимость от этих прямых зависимостей будет связана с этой общей библиотекой, если они ещё не были связаны с cc_shared_library в dynamic_deps.

Во время анализа, реализация правила будет рассматривать любой целевой объект, указанный в deps, как экспортируемый общей библиотекой, чтобы выдавать ошибки, когда несколько cc_shared_libraries экспортируют одни и те же целевые объекты. Реализация правила не заботится о том, чтобы сообщать компоновщику, какие символы должны быть экспортированы общим объектом. Пользователь должен позаботиться об этом с помощью скриптов компоновщика или деклараций видимости в исходном коде.

Реализация также будет вызывать ошибки, когда одна и та же библиотека статически связана более чем с одной cc_shared_library. Этого можно избежать, добавив "LINKABLE_MORE_THAN_ONCE" к cc_library.tags или указав `cc_library` как экспорт одной из общих библиотек, чтобы одна могла стать dynamic_dep другой.

additional_linker_inputs

Список меток; значение по умолчанию []

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

Список меток; значение по умолчанию []

Это другие cc_shared_library зависимости, от которых зависит текущий целевой объект.

Реализация cc_shared_library будет использовать список dynamic_deps (транзитивно, то есть также dynamic_deps текущего целевого объекта dynamic_deps) для определения того, какие cc_libraries в транзитивной deps не должны быть связаны, потому что они уже предоставляются другой cc_shared_library.

exports_filter

Список строк; значение по умолчанию []

Этот атрибут содержит список целевых объектов, которые, как утверждается, экспортируются текущей общей библиотекой.

Любой целевой объект deps уже считается экспортируемым общей библиотекой. Этот атрибут должен использоваться для перечисления любых целевых объектов, которые экспортируются общей библиотекой, но являются транзитивными зависимостями deps.

Обратите внимание, что этот атрибут фактически не добавляет зависимость к этим целевым объектам, зависимость должна быть создана deps. Элементы этого атрибута — просто строки. Имейте в виду, что при размещении целевого объекта в этом атрибуте это рассматривается как утверждение, что общая библиотека экспортирует символы из этого целевого объекта. Логика cc_shared_library фактически не обрабатывает указание компоновщику, какие символы должны быть экспортированы.

Допускается следующий синтаксис:

//foo:__package__ для учета любого целевого объекта в foo/BUILD

//foo:__subpackages__ для учета любого целевого объекта в foo/BUILD или в любом другом пакете ниже foo/ как foo/bar/BUILD

shared_lib_name

Строка; значение по умолчанию ""

По умолчанию cc_shared_library будет использовать имя для выходного файла общей библиотеки, основанное на имени целевого объекта и платформе. Это включает расширение и иногда префикс. Иногда вам может не потребоваться имя по умолчанию, например, при загрузке общих библиотек C++ для Python, префикс lib* по умолчанию часто нежелателен. В этом случае вы можете использовать этот атрибут для выбора пользовательского имени.
user_link_flags

Список строк; значение по умолчанию []

Любые дополнительные флаги, которые вы можете передать компоновщику. Например, чтобы компоновщик знал о скрипте компоновщика, переданном через additional_linker_inputs, вы можете использовать следующее:
         cc_shared_library(
            name = "foo_shared",
            additional_linker_inputs = select({
              "//src/conditions:linux": [
                ":foo.lds",
                ":additional_script.txt",
              ],
              "//conditions:default": []}),
            user_link_flags = select({
              "//src/conditions:linux": [
                "-Wl,-rpath,kittens",
                "-Wl,--version-script=$(location :foo.lds)",
                "-Wl,--script=$(location :additional_script.txt)",
              ],
              "//conditions:default": []}),
              ...
         )
        
win_def_file

Метка; значение по умолчанию None

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

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

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

Имя; обязательно

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

profile

Метка; значение по умолчанию None

Метка профиля подсказок. Файл подсказок имеет расширение .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

Имя; обязательно

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

absolute_path_profile

Строка; значение по умолчанию ""

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

Метка; значение по умолчанию None

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

Метка; значение по умолчанию None

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

memprof_profile

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

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

memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

memprof_profile(
  name = "memprof_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

Аргументы

Атрибуты
name

Имя; обязательно

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

absolute_path_profile

Строка; значение по умолчанию ""

Абсолютный путь к профилю MEMPROF. Файл может иметь только расширение .profdata или .zip (где zip-архив должен содержать файл memprof.profdata).
profile

Метка; значение по умолчанию None

Метка профиля MEMPROF. Ожидается, что профиль будет иметь расширение .profdata (для индексированного/символьного профиля memprof) или расширение .zip для zip-архива, содержащего файл memprof.profdata. Метка также может указывать на правило fdo_absolute_path_profile.

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

Имя; обязательно

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

ld_profile

Метка; значение по умолчанию None

Метка профиля, переданная действию компоновки. Этот файл имеет расширение .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, link_extra_lib, 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

Имя; обязательно

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

deps

Список метки; значение по умолчанию []

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

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

srcs

Список метки; значение по умолчанию []

Список файлов 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

Список метки; значение по умолчанию []

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

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

copts

Список строк; значение по умолчанию []

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

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

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

defines

Список строк; значение по умолчанию []

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

Список строк; значение по умолчанию []

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

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

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

link_extra_lib

Метка; значение по умолчанию "@bazel_tools//tools/cpp:link_extra_lib"

Управление подключением дополнительных библиотек.

По умолчанию бинарные файлы C++ подключаются к //tools/cpp:link_extra_lib, которое по умолчанию зависит от флага метки //tools/cpp:link_extra_libs. Без установки флага эта библиотека по умолчанию пуста. Установка флага метки позволяет подключать необязательные зависимости, такие как переопределения слабых символов, перехваты для функций разделяемых библиотек или специальные библиотеки времени выполнения (для замены malloc, предпочтительнее malloc или --custom_malloc). Установка этого атрибута в None отключает это поведение.

linkopts

Список строк; значение по умолчанию []

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

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

linkstatic

Булево; значение по умолчанию 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

Список строк; значение по умолчанию []

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

Метка; значение по умолчанию "@bazel_tools//tools/cpp:malloc"

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

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

nocopts

Строка; по умолчанию ""

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

Целое число; по умолчанию 0

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

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

win_def_file

Метка; по умолчанию None

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

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

cc_toolchain

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

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

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

Аргументы

Атрибуты
name

Имя; обязательно

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

all_files

Метка; обязательно

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

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

ar_files

Метка; по умолчанию None

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

as_files

Метка; по умолчанию None

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

compiler_files

Метка; обязательно

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

Метка; по умолчанию None

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

Метка; по умолчанию None

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

Метка; обязательно

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

Метка; по умолчанию None

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

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

exec_transition_for_inputs

Булево; по умолчанию True

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

Метка; по умолчанию None

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

Метка; обязательно

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

Метка; по умолчанию None

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

Метка; обязательно

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

Метка; по умолчанию None

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

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

strip_files

Метка; обязательно

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

Булево; по умолчанию False

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

Булево; по умолчанию True

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

Метка; обязательно

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

Строка; неконфигурируемый; по умолчанию ""

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

Имя; обязательно

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

toolchains

Словарь, сопоставляющий строки с метками; неконфигурируемый; обязательно

Карта из строк вида "<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-12-11 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/7.0.0/reference/be/c-cpp

Spec-Zone.ru

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