Spec-Zone.ru › Bazel 6.1

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

Правила

  • alias
  • config_setting
  • filegroup
  • genquery
  • genrule
  • test_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(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 Blaze query language, и выводит результат в файл.

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

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

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

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

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

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

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

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

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

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

Spec-Zone.ru

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