Spec-Zone.ru › Bazel 7.0

Общие правила

Правила

  • псевдоним
  • config_setting
  • группа_файлов
  • genquery
  • genrule
  • starlark_doc_extract
  • набор_тестов

псевдоним

alias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)

Правило alias создает другое имя, по которому можно обратиться к правилу.

Использование псевдонимов работает только для «обычных» целей. В частности, package_group и test_suite использовать псевдонимы нельзя.

Использование псевдонимов может быть полезно в больших репозиториях, где переименование цели потребовало бы внесения изменений во множество файлов. Также можно использовать правило псевдонима для хранения вызова функции select, если нужно повторно использовать эту логику для нескольких целей.

Правило псевдонима имеет собственное объявление видимости. Во всех остальных отношениях оно ведет себя как правило, к которому оно ссылается (например, testonly на псевдониме игнорируется; вместо этого используется свойство testonly ссылаемого правила) с некоторыми незначительными исключениями:

  • Тесты не выполняются, если их псевдоним указан в командной строке. Чтобы определить псевдоним, запускающий ссылаемый тест, используйте правило test_suite с единственной целью в его атрибуте tests.
  • При определении групп окружения псевдонимы правил environment не поддерживаются. Они также не поддерживаются в опции командной строки --target_environment.

Примеры

filegroup(
    name = "data",
    srcs = ["data.txt"],
)

alias(
    name = "other",
    actual = ":data",
)

Аргументы

Атрибуты
name

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

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

actual

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

Цель, к которой ссылается этот псевдоним. Это необязательно должно быть правило, это также может быть входной файл.

config_setting

config_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)

Сопоставляет ожидаемое состояние конфигурации (выраженное в флагах сборки или ограничениях платформы) для запуска настраиваемых атрибутов. См. select, чтобы узнать, как использовать это правило, и Настраиваемые атрибуты для общего обзора функции.

Примеры

Следующее соответствует любой сборке, которая устанавливает --compilation_mode=opt или -c opt (явно в командной строке или неявно из файлов .bazelrc):

  config_setting(
      name = "simple",
      values = {"compilation_mode": "opt"}
  )
  

Следующее соответствует любой сборке, которая нацелена на ARM и применяет пользовательское определение FOO=bar (например, bazel build --cpu=arm --define FOO=bar ...):

  config_setting(
      name = "two_conditions",
      values = {
          "cpu": "arm",
          "define": "FOO=bar"
      }
  )
  

Следующее соответствует любой сборке, которая устанавливает пользовательский флаг --//custom_flags:foo=1 (явно в командной строке или неявно из файлов .bazelrc):

  config_setting(
      name = "my_custom_flag_is_set",
      flag_values = { "//custom_flags:foo": "1" },
  )
  

Следующее соответствует любой сборке, которая нацелена на платформу с архитектурой x86_64 и версией glibc 2.25, предполагая существование constraint_value с меткой //example:glibc_2_25. Обратите внимание, что платформа по-прежнему соответствует, если она определяет дополнительные значения ограничений помимо этих двух.

  config_setting(
      name = "64bit_glibc_2_25",
      constraint_values = [
          "@platforms//cpu:x86_64",
          "//example:glibc_2_25",
      ]
  )
  
Во всех этих случаях конфигурация может изменяться в процессе сборки, например, если целевой объект нужно скомпилировать для платформы, отличной от его зависимости. Это означает, что даже если config_setting не соответствует флагам командной строки верхнего уровня, оно может соответствовать некоторым целевым объектам сборки.

Примечания

  • См. select, чтобы узнать, что происходит, когда несколько config_setting соответствуют текущему состоянию конфигурации.
  • Для флагов, которые поддерживают сокращенные формы (например, --compilation_mode по сравнению с -c), определения values должны использовать полную форму. Они автоматически соответствуют вызовам, использующим любую из этих форм.
  • Если флаг принимает несколько значений (например, --copt=-Da --copt=-Db или список-тип Starlark флаг), values = { "flag": "a" } соответствует, если "a" присутствует где-либо в фактическом списке.

    values = { "myflag": "a,b" } работает аналогичным образом: это соответствует --myflag=a --myflag=b, --myflag=a --myflag=b --myflag=c, --myflag=a,b, и --myflag=c,b,a. Точные семантики различаются в зависимости от флагов. Например, --copt не поддерживает несколько значений в одном экземпляре: --copt=a,b дает ["a,b"], а --copt=a --copt=b дает ["a", "b"] (поэтому values = { "copt": "a,b" } соответствует первому, но не второму). Но --ios_multi_cpus (для правил Apple) поддерживает: -ios_multi_cpus=a,b и ios_multi_cpus=a --ios_multi_cpus=b оба дают ["a", "b"]. Тщательно проверяйте определения флагов и тестируйте свои условия, чтобы убедиться в точном соответствии ожиданий.

  • Если вам нужно определить условия, которые не моделируются встроенными флагами сборки, используйте Starlark-определенные флаги. Вы также можете использовать --define, но это обеспечивает более слабую поддержку и не рекомендуется. См. здесь для более подробного обсуждения.
  • Избегайте повторения идентичных config_setting определений в разных пакетах. Вместо этого ссылайтесь на общий config_setting пакет, который определяется в каноническом пакете.
  • values, define_values, и constraint_values могут быть использованы в любом сочетании в одном config_setting , но по крайней мере один должен быть установлен для любого заданного config_setting.

Аргументы

Атрибуты
name

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

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

constraint_values

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

Минимальный набор constraint_values , который платформа целевого устройства должна указать для соответствия этой config_setting. (Платформа выполнения здесь не рассматривается.) Любые дополнительные значения ограничений, имеющиеся у платформы, игнорируются. Подробнее см. Настраиваемые атрибуты сборки.

В случае, если две config_setting совпадают в одной select, этот атрибут не учитывается для определения, является ли одна из config_setting специализацией другой. Другими словами, одна config_setting не может сильнее соответствовать платформе, чем другая.

define_values

Словарь: Строка -> Строка; не настраиваемый; значение по умолчанию {}

То же, что и values, но специально для флага --define.

--define является особым, поскольку его синтаксис (--define KEY=VAL) означает, что KEY=VAL является значением с точки зрения флага Bazel.

Это означает:

            config_setting(
                name = "a_and_b",
                values = {
                    "define": "a=1",
                    "define": "b=2",
                })
          

не работает, потому что один и тот же ключ (define) появляется дважды в словаре. Этот атрибут решает эту проблему:

            config_setting(
                name = "a_and_b",
                define_values = {
                    "a": "1",
                    "b": "2",
                })
          

правильно соответствует bazel build //foo --define a=1 --define b=2.

--define по-прежнему может отображаться в values с обычным синтаксисом флага и может быть смешан с этим атрибутом, если ключи словаря останутся уникальными.

flag_values

Словарь: метка -> Строка; не настраиваемый; значение по умолчанию {}

То же, что и values, но для пользовательских флагов сборки.

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

values

Словарь: Строка -> Строка; не настраиваемый; значение по умолчанию {}

Набор значений конфигурации, которые соответствуют этому правилу (выраженному как флаги сборки)

Это правило наследует конфигурацию настроенной цели, которая ссылается на него в select операторе. Оно считается соответствующим вызову Bazel, если для каждой записи в словаре его конфигурация соответствует ожидаемому значению. Например, values = {"compilation_mode": "opt"} соответствует вызовам bazel build --compilation_mode=opt ... и bazel build -c opt ... для правил, настроенных на целевой уровень.

Для удобства значения конфигурации задаются как флаги сборки (без предшествующего "--"). Но имейте в виду, что это не одно и то же. Это связано с тем, что цели могут быть собраны в нескольких конфигурациях в одной сборке. Например, «cpu» конфигурации exec соответствует значению --host_cpu, а не --cpu. Поэтому разные экземпляры одной и той же config_setting могут соответствовать одному вызову по-разному, в зависимости от конфигурации правила, использующего их.

Если флаг не явно задан в командной строке, используется его значение по умолчанию. Если ключ появляется несколько раз в словаре, используется только последний экземпляр. Если ключ ссылается на флаг, который может быть задан несколько раз в командной строке (например, bazel build --copt=foo --copt=bar --copt=baz ...), соответствие происходит, если любое из этих настроек совпадает.

filegroup

filegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)

Используйте filegroup для присвоения удобного имени набору целей. Затем к ним можно обратиться из других правил.

Рекомендуется использовать filegroup вместо прямой ссылки на каталоги. Последний вариант некорректен, так как система сборки не имеет полного знания обо всех файлах в каталоге, поэтому она может не перестроить их при изменении этих файлов. В сочетании с glob, filegroup может гарантировать, что все файлы будут явно известны системе сборки.

Примеры

Для создания filegroup , состоящего из двух исходных файлов, выполните

filegroup(
    name = "mygroup",
    srcs = [
        "a_file.txt",
        "some/subdirectory/another_file.txt",
    ],
)

Или используйте glob для поиска в каталоге testdata:

filegroup(
    name = "exported_testdata",
    srcs = glob([
        "testdata/*.dat",
        "testdata/logs/**/*.log",
    ]),
)

Чтобы использовать эти определения, обратитесь к filegroup с меткой из любого правила:

cc_library(
    name = "my_library",
    srcs = ["foo.cc"],
    data = [
        "//my_package:exported_testdata",
        "//my_package:mygroup",
    ],
)

Аргументы

Атрибуты
name

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

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

srcs

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

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

Часто для значения атрибута srcs используется результат выражения glob.

data

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

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

Цели, указанные в атрибуте data, будут добавлены к runfiles этого правила filegroup. При ссылке на filegroup в атрибуте data другого правила его runfiles будет добавлен к runfiles зависимого правила. См. раздел зависимостей данных и общую документацию data для получения дополнительной информации о том, как зависеть от файлов данных и использовать их.

output_group

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

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

«Группа выходных данных» — это категория выходных артефактов цели, указанная в реализации этого правила.

genquery

genquery(name, deps, data, compatible_with, compressed_output, deprecation, distribs, exec_compatible_with, exec_properties, expression, features, licenses, opts, restricted_to, scope, strict, tags, target_compatible_with, testonly, visibility)

genquery() выполняет запрос, указанный в языке запросов Blaze, и выводит результат в файл.

Для сохранения согласованности сборки, запрос разрешено выполнять только для транзитивного замыкания целей, указанных в атрибуте scope. Запросы, нарушающие это правило, завершатся ошибкой во время выполнения, если strict не указано или равно true (если strict равно false, цели за пределами области будут просто пропущены с предупреждением). Самый простой способ гарантировать, что этого не произойдет, — это упомянуть те же метки в области, что и в выражении запроса.

Единственное отличие между разрешенными здесь запросами и запросами в командной строке заключается в том, что запросы, содержащие спецификации целей с подстановками (например, //pkg:* или //pkg:all) здесь не допускаются. Причины этому двойственны: во-первых, потому что genquery должен указать область, чтобы предотвратить влияние целей, находящихся за пределами транзитивного замыкания запроса, на его выходные данные; и, во-вторых, потому что файлы BUILD не поддерживают зависимые подстановки (например, deps=["//a/..."] недопустимо).

Выходные данные genquery упорядочены лексикографически, чтобы обеспечить детерминированный вывод, за исключением --output=graph|minrank|maxrank или когда somepath используется как функция верхнего уровня.

Имя выходного файла — имя правила.

Примеры

В этом примере в файл записывается список меток в транзитивном замыкании указанной цели.

genquery(
    name = "kiwi-deps",
    expression = "deps(//kiwi:kiwi_lib)",
    scope = ["//kiwi:kiwi_lib"],
)

Аргументы

Атрибуты
name

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

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

compressed_output

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

Если True, вывод запроса записывается в формате файла GZIP. Этот параметр можно использовать, чтобы избежать скачков использования памяти Bazel, когда ожидается, что вывод запроса будет большим. Bazel уже внутренне сжимает выводы запросов, превышающие 220 байт, независимо от значения этого параметра, поэтому установка его в True может не уменьшить размер удерживаемой кучи. Однако это позволяет Bazel пропустить распаковку при записи выходного файла, что может быть ресурсоёмкой операцией.
expression

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

Запрос, который будет выполнен. В отличие от командной строки и других мест в файлах BUILD, метки здесь разрешаются относительно корневого каталога рабочей области. Например, метка :b в этом атрибуте в файле a/BUILD будет ссылаться на целевой объект //:b.
opts

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

Параметры, которые передаются в движок запросов. Они соответствуют параметрам командной строки, которые могут быть переданы bazel query. Некоторые параметры запроса здесь недопустимы: --keep_going, --query_file, --universe_scope, --order_results и --order_output. Параметры, не указанные здесь, будут иметь свои значения по умолчанию, как и в командной строке bazel query.
scope

Список меток; обязательно

Область действия запроса. Запросу запрещено обращаться к целевым объектам, находящимся за пределами транзитивного замыкания этих целевых объектов.
strict

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

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

Правило genrule

genrule(name, srcs, outs, cmd, cmd_bash, cmd_bat, cmd_ps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, executable, features, licenses, local, message, output_licenses, output_to_bindir, restricted_to, tags, target_compatible_with, testonly, toolchains, tools, visibility)

genrule генерирует один или несколько файлов с помощью определённой пользователем команды Bash.

Правила genrule — это общие правила построения, которые можно использовать, если нет специального правила для задачи. Например, вы можете выполнить одну строку Bash. Однако, если вам необходимо скомпилировать файлы C++, придерживайтесь существующих cc_* правил, так как вся сложная работа уже выполнена за вас.

Обратите внимание, что правило genrule требует оболочки для интерпретации аргумента команды. Также легко ссылаться на произвольные программы, доступные в PATH, однако это делает команду негерметичной и может привести к невоспроизводимости результатов. Если вам нужно запустить только один инструмент, используйте run_binary вместо этого.

Не используйте правило genrule для запуска тестов. Существуют специальные исключения для тестов и результатов тестов, включая политики кэширования и переменные среды. Тесты обычно запускаются после завершения сборки и на целевой архитектуре, тогда как правила genrule выполняются во время сборки и на архитектуре выполнения (эти архитектуры могут отличаться). Если вам нужно общее правило для тестирования, используйте sh_test.

Учёт кросс-компиляции

См. руководство пользователя для получения дополнительной информации о кросс-компиляции.

Хотя правила genrule выполняются во время сборки, их выходные данные часто используются после сборки, для развертывания или тестирования. Рассмотрим пример компиляции кода C для микроконтроллера: компилятор принимает файлы исходного кода C и генерирует код, который выполняется на микроконтроллере. Сгенерированный код, очевидно, не может выполняться на процессоре, который использовался для его компиляции, но сам компилятор C (если он скомпилирован из исходного кода) должен.

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

Для правил genrule система сборки гарантирует, что зависимости построены должным образом: srcs строятся (при необходимости) для конфигурации цели, tools строятся для конфигурации выполнения, а вывод рассматривается как для конфигурации цели. Она также предоставляет переменные "Make", которые команды genrule могут передавать соответствующим инструментам.

Намеренно, что правило genrule не определяет атрибут deps: другие встроенные правила используют зависящие от языка метаданные, передаваемые между правилами, чтобы автоматически определить, как обрабатывать зависимые правила, но такой уровень автоматизации невозможен для правил genrule. Правила genrule работают только на уровне файлов и исполняемых файлов.

Особые случаи

Компиляция exec-exec: в некоторых случаях системе сборки необходимо запустить правила genrule таким образом, чтобы выходные данные также могли быть выполнены во время сборки. Например, если правило genrule создаёт какой-либо пользовательский компилятор, который впоследствии используется другим правилом genrule, первое должно производить свой вывод для конфигурации выполнения, поскольку именно там будет работать компилятор в другом правиле genrule. В этом случае система сборки делает это автоматически: она строит srcs и outs первого правила genrule для конфигурации выполнения вместо конфигурации целевого объекта. См. руководство пользователя для получения дополнительной информации.

JDK и инструменты C++: для использования инструмента из JDK или набора инструментов C++ компилятор предоставляет набор переменных. См. "Переменные Make" для получения подробностей.

Среда genrule

Команда genrule выполняется оболочкой Bash, настроенной на выход при ошибке команды или конвейера, используя set -e -o pipefail.

Инструмент сборки выполняет команду Bash в очищенной среде процесса, определяющей только основные переменные, такие как PATH, PWD, TMPDIR, и несколько других. Для обеспечения воспроизводимости сборок большинство переменных, определённых в среде оболочки пользователя, не передаются команде genrule. Однако Bazel (но не Blaze) передаёт значение переменной среды пользователя PATH. Любое изменение значения PATH приведёт к повторному выполнению команды при следующей сборке.

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

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

Общие рекомендации

  • Убедитесь, что инструменты, запускаемые правилом genrule, детерминированы и герметичны. Они не должны записывать метки времени в свой вывод, и они должны использовать устойчивое упорядочение для множеств и словарей, а также записывать только относительные пути к файлам вывода, а не абсолютные пути. Несоблюдение этого правила приведёт к неожиданному поведению сборки (Bazel не перестроит правило genrule, которое, по вашему мнению, должно было быть перестроено) и ухудшит производительность кэша.
  • Используйте $(location) для вывода, инструментов и исходных данных. Из-за разделения выходных файлов для различных конфигураций, правила genrule не могут полагаться на жёстко закодированные или абсолютные пути.
  • Напишите общую макрос Starlark в случае, если одно и то же или очень похожее правило genrule используется в нескольких местах. Если правило genrule сложное, рассмотрите возможность реализации его в скрипте или как правило Starlark. Это улучшит читаемость и проверяемость.
  • Убедитесь, что код выхода правильно указывает успех или неудачу правила genrule.
  • Не записывайте информационные сообщения в stdout или stderr. Хотя это полезно для отладки, это легко может стать шумом; успешное правило genrule должно быть бесшумным. С другой стороны, правило genrule, завершившееся ошибкой, должно выводить хорошие сообщения об ошибках.
  • $$ вычисляется как $, буквальный знак доллара, поэтому для вызова команды оболочки, содержащей знаки доллара, таких как ls $(dirname $x), необходимо экранировать её, как ls $$(dirname $$x).
  • Избегайте создания символических ссылок и каталогов. Bazel не копирует структуру каталогов/символических ссылок, созданную правилами genrule, и проверка зависимостей каталогов со стороны Bazel ненадёжна.
  • При ссылке на правило genrule в других правилах вы можете использовать метку правила genrule или метки отдельных выходных файлов. Иногда один подход более удобочитаем, иногда другой: ссылка на выходные данные по имени в srcs правила-потребителя позволит избежать случайного выбора других выходных данных правила genrule, но может быть утомительной, если правило genrule производит много выводов.

Примеры

Этот пример генерирует foo.h. Нет исходных данных, потому что команда не принимает никаких входных данных. «Бинарник», выполняемый командой, — это скрипт perl в том же пакете, что и правило genrule.

genrule(
    name = "foo",
    srcs = [],
    outs = ["foo.h"],
    cmd = "./$(location create_foo.pl) > \"$@\"",
    tools = ["create_foo.pl"],
)

Следующий пример демонстрирует, как использовать filegroup и выходные данные другого genrule. Обратите внимание, что использование $(SRCS) вместо явных $(location) директив также сработает; в этом примере используется последняя для демонстрационных целей.

genrule(
    name = "concat_all_files",
    srcs = [
        "//some:files",  # a filegroup with multiple files in it ==> $(locations)
        "//other:gen",   # a genrule with a single output ==> $(location)
    ],
    outs = ["concatenated.txt"],
    cmd = "cat $(locations //some:files) $(location //other:gen) > $@",
)

Аргументы

Атрибуты
name

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

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


Вы можете обратиться к этому правилу по имени в разделе srcs или deps других правил BUILD. Если правило генерирует исходные файлы, вы должны использовать атрибут srcs.
srcs

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

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

Этот атрибут не подходит для перечисления инструментов, исполняемых cmd; для них используйте атрибут tools.

Система сборки гарантирует, что эти предварительные условия будут построены перед запуском команды genrule; они строятся с теми же настройками, что и исходный запрос сборки. Имена файлов этих предварительных условий доступны команде в виде списка, разделенного пробелами, в $(SRCS); альтернативно, путь к отдельному целевому объекту srcs //x:y можно получить с помощью $(location //x:y), или используя $< при условии, что это единственная запись в srcs.

outs

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

Список файлов, сгенерированных этим правилом.

Файлы вывода не должны пересекать границы пакетов. Имена файлов вывода интерпретируются как относительные к пакету.

Если флаг executable установлен, outs должен содержать ровно одну метку.

Ожидается, что команда genrule создаст каждый файл вывода в заранее определенном месте. Местоположение доступно в cmd с помощью специфичных для genrule переменных «Make» ($@, $(OUTS), $(@D) или $(RULEDIR)) или с использованием $(location) подстановки.

cmd

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

Команда для выполнения. Подлежит $(location) и "Переменной Make" подстановке.
  1. Сначала применяется подстановка $(location) , заменяющая все вхождения $(location label) и $(locations label) (и аналогичные конструкции с использованием связанных переменных execpath, execpaths, rootpath и rootpaths).
  2. Далее расширяются переменные «Make». Обратите внимание, что предопределенные переменные $(JAVA), $(JAVAC) и $(JAVABASE) расширяются в конфигурации exec, поэтому вызовы Java, выполняемые в рамках шага сборки, могут корректно загружать общие библиотеки и другие зависимости.
  3. Наконец, полученная команда выполняется с использованием оболочки Bash. Если её код возврата отличен от нуля, считается, что команда завершилась неудачно.
Это резервный вариант для cmd_bash, cmd_ps и cmd_bat, если ни один из них не применим.

Если длина командной строки превышает ограничение платформы (64 КБ на Linux/macOS, 8 КБ на Windows), genrule запишет команду в скрипт и выполнит его, чтобы обойти ограничение. Это относится ко всем атрибутам cmd (cmd, cmd_bash, cmd_ps, cmd_bat).

cmd_bash

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

Команда Bash для выполнения.

Этот атрибут имеет более высокий приоритет, чем cmd. Команда расширяется и выполняется точно так же, как атрибут cmd .

cmd_bat

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

Команда Batch для выполнения на Windows.

Этот атрибут имеет более высокий приоритет, чем cmd и cmd_bash. Команда выполняется аналогично атрибуту cmd, с следующими отличиями:

  • Этот атрибут применим только на Windows.
  • Команда выполняется с cmd.exe /c со следующими аргументами по умолчанию:
    • /S - удаление первой и последней кавычек и выполнение всего остального как есть.
    • /E:ON - включение расширенного набора команд.
    • /V:ON - включение отложенного расширения переменных
    • /D - игнорирование записей реестра AutoRun.
  • После подстановки $(location) и "Переменной Make" пути будут преобразованы в пути в стиле Windows (с обратным слешем).
cmd_ps

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

Команда Powershell для выполнения на Windows.

Этот атрибут имеет более высокий приоритет, чем cmd, cmd_bash и cmd_bat. Команда выполняется аналогично атрибуту cmd, с следующими отличиями:

  • Этот атрибут применим только на Windows.
  • Команда выполняется с powershell.exe /c.

Чтобы сделать Powershell более удобным в использовании и менее подверженным ошибкам, мы запускаем следующие команды для настройки среды перед выполнением команды Powershell в genrule.

  • Set-ExecutionPolicy -Scope CurrentUser RemoteSigned - разрешение запуска неподписанных скриптов.
  • $errorActionPreference='Stop' - В случае, если есть несколько команд, разделенных ;, действие завершается немедленно, если cmdlet Powershell завершается неудачно, но это НЕ работает для внешних команд.
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8' - изменение кодировки по умолчанию с utf-16 на utf-8.
executable

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

Объявить вывод исполняемым.

Установка этого флага в True означает, что вывод является исполняемым файлом и может быть запущен с помощью команды run. Genrule должен производить ровно один вывод в этом случае. Если этот атрибут установлен, run будет пытаться выполнить файл независимо от его содержимого.

Объявление зависимостей данных для сгенерированного исполняемого файла не поддерживается.

local

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

Если установлено в True, этот параметр принудительно заставляет это genrule выполняться с помощью стратегии «local», что означает отсутствие удаленного выполнения, без кэширования, без постоянных рабочих потоков.

Это эквивалентно предоставлению тега «local» (tags=["local"]).

message

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

Сообщение о ходе выполнения.

Сообщение о ходе выполнения, которое будет выведено при выполнении этого шага сборки. По умолчанию сообщение «Генерация вывода» (или что-то столь же тривиальное), но вы можете предоставить более конкретное. Используйте этот атрибут вместо echo или других инструкций печати в вашей команде cmd, так как это позволяет инструменту сборки управлять тем, отображаются ли такие сообщения о ходе выполнения или нет.

output_licenses

Тип лицензии; по умолчанию ["none"]

См. common attributes
output_to_bindir

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

Если установлено в True, этот параметр заставляет файлы вывода записываться в каталог bin вместо каталога genfiles.

tools

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

Список зависимостей инструмента для этого правила. См. определение зависимостей для получения дополнительной информации.

Система сборки гарантирует, что эти предварительные условия будут построены перед запуском команды genrule; они строятся с конфигурацией exec, так как эти инструменты выполняются в рамках сборки. Путь к отдельному целевому объекту tools //x:y можно получить с помощью $(location //x:y).

Любой *_binary или инструмент, который должен быть выполнен cmd, должен появляться в этом списке, а не в srcs, чтобы гарантировать, что они будут построены в правильной конфигурации.

starlark_doc_extract

starlark_doc_extract(name, deps, src, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, render_main_repo_name, restricted_to, symbol_names, tags, target_compatible_with, testonly, visibility)

starlark_doc_extract() извлекает документацию по правилам, функциям (включая макросы), аспектам и поставщикам, определенным или повторно экспортированным в заданном .bzl или .scl файле. Результатом этого правила является ModuleInfo двоичный протокол, как определено в stardoc_output.proto в дереве исходных кодов Bazel.

Неявные целевые выводы

  • name.binaryproto (вывод по умолчанию): ModuleInfo двоичный протокол.
  • name.textproto (строится только по явным запросам): текстовый протокол версии name.binaryproto.

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

Аргументы

Атрибуты
name

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

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

deps

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

Список целевых объектов, содержащих файлы Starlark, которые load()-ируются src. В обычном использовании эти целевые объекты, как правило, являются bzl_library целевыми объектами, но правило starlark_doc_extract не требует этого и принимает любой целевой объект, предоставляющий файлы Starlark в своём DefaultInfo.

Обратите внимание, что файлы Starlark, которые должны быть упакованы, должны быть файлами в дереве исходных кодов; Bazel не может load() сгенерированные файлы.

src

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

Файл Starlark, из которого следует извлечь документацию.

Обратите внимание, что этот файл должен находиться в дереве исходных кодов; Bazel не может load() сгенерированные файлы.

render_main_repo_name

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

Если значение true, метки в основном репозитории в выводимой документации будут отображаться с компонентом репозитория (то есть, //foo:bar.bzl будет отображено как @main_repo_name//foo:bar.bzl).

Имя, используемое для основного репозитория, получается из module(name = ...) в файле MODULE.bazel основного репозитория (если включен Bzlmod) или из workspace(name = ...) в файле WORKSPACE основного репозитория.

Этот атрибут следует устанавливать в False при генерации документации для файлов Starlark, которые предназначены для использования только внутри одного репозитория, и в True при генерации документации для файлов Starlark, которые предназначены для использования из других репозиториев.

symbol_names

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

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

starlark_doc_extract генерирует документацию для сущности только в том случае, если

  1. каждый компонент полного имени сущности является общедоступным (то есть, первая буква каждого компонента полного имени является буквой, а не "_"); и
    1. либо список symbol_names пуст (что является значением по умолчанию), либо
    2. полное имя сущности или полное имя структуры, в которой сущность вложена, находится в списке symbol_names.

Набор_тестов

test_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, tests, visibility)

Набор_тестов определяет набор тестов, которые считаются «полезными» для человека. Это позволяет проектам определять наборы тестов, такие как «тесты, которые необходимо выполнить перед внесением изменений», «тесты на стрессовую нагрузку нашего проекта» или «все небольшие тесты». Команда blaze test учитывает такую организацию: при вызове, например, blaze test //some/test:suite, Blaze сначала перечисляет все целевые объекты тестов, которые включены транзитивно целевым объектом //some/test:suite (мы называем это «расширением набора_тестов»), затем Blaze строит и тестирует эти целевые объекты.

Примеры

Набор_тестов для запуска всех небольших тестов в текущем пакете.

test_suite(
    name = "small_tests",
    tags = ["small"],
)

Набор_тестов, который запускает указанный набор тестов:

test_suite(
    name = "smoke_tests",
    tests = [
        "system_unittest",
        "public_api_unittest",
    ],
)

Набор_тестов для запуска всех тестов в текущем пакете, которые не являются нестабильными.

test_suite(
    name = "non_flaky_test",
    tags = ["-flaky"],
)

Аргументы

Атрибуты
name

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

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

tags

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

Список текстовых тегов, таких как «маленький» или «база данных» или «-нестабильный». Теги могут быть любой допустимой строкой.

Теги, начинающиеся с символа «-», считаются отрицательными тегами. Предыдущий символ «-» не считается частью тега, поэтому тег набора «-маленький» соответствует размеру теста «маленький». Все остальные теги считаются положительными тегами.

В качестве дополнения, чтобы сделать положительные теги более явными, теги также могут начинаться с символа «+», который не будет учитываться как часть текста тега. Он просто делает различие между положительными и отрицательными тегами более наглядным.

В наборе_тестов будут включены только правила тестов, которые соответствуют всем положительным тегам и ни одному из отрицательных тегов. Обратите внимание, что это не означает, что проверка ошибок зависимостей от тестов, которые отфильтрованы, пропускается; зависимости от пропущенных тестов всё ещё должны быть допустимы (например, не блокироваться ограничениями видимости).

Ключевое слово тега manual обрабатывается иначе, чем вышеописанное, во время «расширения набора_тестов», выполняемого командой blaze test при вызовах, включающих шаблоны целевых объектов с подстановкой символов таргетов. В этом случае целевые объекты с тегом «ручной» отфильтровываются (и, следовательно, не расширяются). Это поведение соответствует тому, как blaze build и blaze test обрабатывают шаблоны целевых объектов с подстановкой символов в целом. Обратите внимание, что это явно отличается от поведения blaze query 'tests(E)', так как наборы_тестов всегда расширяются функцией запроса tests, независимо от тега manual.

Обратите внимание, что тег size целевого объекта теста рассматривается как тег для фильтрации.

Если вам нужен test_suite, содержащий тесты с взаимно исключающими тегами (например, все маленькие и средние тесты), вам придётся создать три правила test_suite:

одно для всех малых тестов, одно для всех средних тестов и одно, включающее предыдущие два.
tests

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

Список наборов_тестов и целевых объектов тестов любого языка.

Здесь принимаются любые *_test, независимо от языка. Однако *_binary целевые объекты не принимаются, даже если они случайно запускают тест. Фильтрация по указанным tags выполняется только для тестов, перечисленных непосредственно в этом атрибуте. Если этот атрибут содержит test_suite , тесты внутри них не будут отфильтрованы этим test_suite (они считаются уже отфильтрованными).

Если атрибут tests не указан или пуст, правило по умолчанию включает все правила тестов в текущем файле BUILD, которые не помечены как manual. Эти правила всё ещё подвергаются фильтрации tag.

За исключением случаев, когда указано иначе, содержимое этой страницы лицензировано на условиях лицензии 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/general

Spec-Zone.ru

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