Spec-Zone.ru › Bazel 6.3

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

Правила

  • псевдоним
  • настройка_параметра
  • группа_файлов
  • 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.

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 заставит 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) расширяются в конфигурации хоста, поэтому вызовы Java, выполняемые в рамках шага сборки, могут правильно загружать общие библиотеки и другие зависимости.
  3. Наконец, полученная команда выполняется с помощью оболочки Bash. Если её код возврата отличен от нуля, команда считается завершившейся с ошибкой.
Это резервное решение для cmd_bash, cmd_ps и cmd_bat, если ни одно из них не применимо.

Если длина командной строки превышает ограничение платформы (64К на Linux/macOS, 8К на Windows), genrule запишет команду в скрипт и выполнит этот скрипт для обхода ограничения. Это относится ко всем атрибутам cmd (cmd, cmd_bash, cmd_ps, cmd_bat).

cmd_bash

String; optional

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

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

cmd_bat

String; optional

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

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

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

String; optional

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

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

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

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

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

List of labels; optional

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

Команда Blaze мигрирует все случаи использования 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' в качестве тега (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; они собираются с использованием конфигурации хоста, поскольку эти инструменты выполняются в рамках сборки. Путь к отдельному целевому объекту 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_suites, тесты внутри них не будут отфильтрованы этим test_suite (они считаются уже отфильтрованными).

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

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

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

Spec-Zone.ru

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