Spec-Zone.ru › Bazel 6.0

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

Правила

  • псевдоним
  • config_setting
  • filegroup
  • genquery
  • genrule
  • тест_suite

псевдоним

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

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

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

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

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

Примеры

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

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

Аргументы

Атрибуты
name

Name; required

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

actual

Label; required

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

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 flag), 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

Name; required

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

constraint_values

List of labels; optional; nonconfigurable

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

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

define_values

Dictionary: String -> String; optional; nonconfigurable

То же, что и 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

Dictionary: label -> String; optional; nonconfigurable

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

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

values

Dictionary: String -> String; optional; nonconfigurable

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

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

Для удобства, значения конфигурации указываются как флаги сборки (без предшествующего "--"). Но имейте в виду, что эти два не одинаковы. Это связано с тем, что цели могут быть скомпилированы в нескольких конфигурациях в рамках одной сборки. Например, «cpu» конфигурации хоста соответствует значению --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

Name; required

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

srcs

List of labels; optional

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

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

data

List of labels; optional

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

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

output_group

String; optional

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

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

genquery

genquery(name, deps, data, compatible_with, 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 упорядочивается с помощью --order_output=full, чтобы обеспечить детерминированный вывод.

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

Примеры

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

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

Аргументы

Атрибуты
name

Name; required

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

expression

String; required

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

List of strings; optional

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

null; required

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

Boolean; optional; default is 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, exec_tools, 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 для запуска тестов. Существуют особые условия для тестов и результатов тестов, включая политики кеширования и переменные окружения. Тесты обычно необходимо запускать после завершения сборки и на целевой архитектуре, в то время как genrules выполняются во время сборки и на хост-архитектуре (они могут отличаться). Если вам нужно общее правило тестирования, используйте sh_test.

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

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

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

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

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

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

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

Компиляция хост-хост: в некоторых случаях системе сборки необходимо выполнить genrules таким образом, чтобы выходные данные также можно было использовать во время сборки. Например, если 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 заставит Bazel повторно выполнить команду при следующей сборке.

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

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

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

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

Name; required

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


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

List of labels; optional

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

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

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

outs

List of filenames; required; nonconfigurable

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

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

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

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

cmd

String; optional

Команда для выполнения. Подлежит подстановке $(location) и подстановке "переменных Make".
  1. Сначала применяется подстановка $(location) , заменяющая все вхождения $(location label) и $(locations label) (и аналогичные конструкции с использованием соответствующих переменных execpath, execpaths, rootpath и rootpaths).
  2. Затем расширяются переменные "Make". Обратите внимание, что предопределённые переменные $(JAVA), $(JAVAC) и $(JAVABASE) расширяются в конфигурации host, поэтому вызовы 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

String; optional

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

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

cmd_bat

String; optional

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

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

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

String; optional

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

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

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

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

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

List of labels; optional

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

Команда Blaze переходит на использование семантики exec_tools для всех используемых tools. Пользователям рекомендуется предпочитать exec_tools tools, если это не вызывает проблем. После завершения функциональной миграции мы можем переименовать exec_tools в tools. Вы получите предупреждение об устаревании и инструкции по миграции перед этим.

executable

Boolean; optional; nonconfigurable; default is False

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

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

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

local

Boolean; optional; default is False

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

Это эквивалентно указанию 'local' в качестве тега (tags=["local"]).

message

String; optional

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

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

output_licenses

Licence type; optional

См. common attributes
output_to_bindir

Boolean; optional; nonconfigurable; default is False

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

tools

List of labels; optional

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

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

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

Набор тестов

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

Name; required

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

tags

List of strings; optional; nonconfigurable

Список текстовых тегов, таких как "small" или "database" или "-flaky". Теги могут быть любой допустимой строкой.

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

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

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

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

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

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

tests

List of labels; optional; nonconfigurable

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

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

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

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

Последнее обновление 2022-12-20 по UTC.

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

Spec-Zone.ru

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