Spec-Zone.ru › Bazel 6.4

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

Правила

  • псевдоним
  • config_setting
  • filegroup
  • genquery
  • genrule
  • набор_тестов

Псевдоним

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

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

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

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

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

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

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

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

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

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

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

Компиляция хост-хост: в некоторых случаях системе сборки необходимо запустить 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 заставит 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 производит много выходов.

Примеры

Этот пример генерирует 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

Команда пакетного файла для выполнения в 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' - в случае наличия нескольких команд, разделенных ;, действие завершается немедленно, если какой-либо CmdLet Powershell завершается с ошибкой, но это НЕ работает для внешних команд.
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8' - изменить кодировку по умолчанию с utf-16 на utf-8.
exec_tools

List of labels; optional

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

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

executable

Boolean; optional; nonconfigurable; default is False

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

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

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

local

Boolean; optional; default is False

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

Это эквивалентно предоставлению '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 и/или ее аффилированных компаний.

Последнее обновление 2023-10-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.4.0/reference/be/general

Spec-Zone.ru

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