Spec-Zone.ru › Bazel 6.2

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

Правила

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

Примеры

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

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

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

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

Аргументы

Атрибуты
name

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

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-05-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.2.0/reference/be/general

Spec-Zone.ru

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