Spec-Zone.ru › Bazel 8.0

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

Правила

  • alias
  • config_setting
  • filegroup
  • genquery
  • genrule
  • starlark_doc_extract
  • test_suite

псевдоним

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(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 и одно имеет все те же флаги и constraint_setting что и другое плюс дополнительные, то выбирается тот, у которого больше настроек. Это известно как «специализация». Например, config_setting сопоставляется с x86 и Linux специализирует config_setting сопоставляемое с x86.

Если два config_setting соответствуют и оба имеют constraint_value которые не присутствуют в другом, это ошибка.

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(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)

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

filegroup не является заменой перечисления целей в командной строке или в атрибуте другой команды, потому что у целей есть много свойств, помимо их выходных данных, которые не собираются таким же образом. Однако, оно всё ещё полезно в довольно многих случаях, например, в атрибуте srcs genrule или атрибуте data правила *_binary.

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

Примеры

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

filegroup(
    name = "mygroup",
    srcs = [
        "a_file.txt",
        "//a/library:target",
        "//a/binary:target",
    ],
)

Или используйте 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() выполняет запрос, заданный на языке запросов Bazel Bazel query language, и выводит результат в файл.

Чтобы сохранить согласованность сборки, запросу разрешается посещать только транзитивное замыкание целей, указанных в атрибуте 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

Если true, цели, чьи запросы выходят за пределы транзитивного замыкания их областей, не смогут быть построены. Если false, 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, не должно предполагать ничего о своей рабочей директории; Bazel гарантирует только, что объявленные входные данные будут доступны по пути, который $(location) возвращает для их метки. Например, если действие выполняется в песочнице или удалённо, реализация песочницы или удалённого выполнения определит рабочую директорию. Если выполняются напрямую (с использованием стратегии standalone), рабочая директория будет корневой директорией выполнения, т.е. результатом bazel info execution_root.

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

Учёт особенностей кросс-компиляции

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

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

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

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

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

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

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

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

Окружение Genrule

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

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

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

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

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

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

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

Команда пакетной обработки для запуска в 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

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

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

Если истинно, метки в главном репозитории в выводимой документации будут отображаться с компонентом репозитория (другими словами, //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)

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

Примеры

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

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 обрабатывается по-разному по сравнению с вышеперечисленным при «расширении набора_тестов», выполняемом командой bazel test при вызовах, включающих шаблоны целей с подстановкой символов целей сборки. Там цели с тегом «ручное» исключаются (и, таким образом, не расширяются). Это поведение согласуется с тем, как bazel build и bazel test обрабатывают шаблоны целей с подстановкой символов в целом. Обратите внимание, что это явно отличается от поведения bazel query 'tests(E)', так как наборы всегда расширяются функцией запроса tests, независимо от тега manual.

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

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

tests

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

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

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

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

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

Последнее обновление 2024-12-10 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/8.0.0/reference/be/general

Spec-Zone.ru

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