- Использование
- Предопределённые переменные
- Предопределённые переменные genrule
- Предопределённые переменные путей к исходникам/выходам
- Пользовательские переменные
Переменные "Make" — это специальный тип расширяемых строковых переменных, доступных для атрибутов, помеченных как "Подлежащие подстановке переменных 'Make'".
Их можно использовать, например, для вставки специфических путей к инструментарию в пользовательские действия сборки.
Bazel предоставляет как предопределённые переменные, доступные всем мишеням, так и пользовательские переменные, которые определяются в зависимых мишенях и доступны только мишеням, зависящим от них.
Причина использования термина "Make" историческая: синтаксис и семантика этих переменных изначально были разработаны для соответствия GNU Make.
Использование
Атрибуты, помеченные как "Подлежащие подстановке переменных 'Make'", могут ссылаться на переменную "Make" FOO следующим образом:
my_attr = "prefix $(FOO) suffix"
Другими словами, любой подстроке, соответствующей $(FOO), присваивается значение FOO. Если это значение "bar", то итоговая строка будет:
my_attr = "prefix bar suffix"
Если FOO не соответствует известной переменной для потребляющей мишени, Bazel выдаст ошибку.
Переменные "Make", имена которых не являются символами, такими как @, могут быть обработаны используя только знак доллара, без скобок. Например:
my_attr = "prefix $@ suffix"
Чтобы записать $ как строковую литерал (то есть, предотвратить расширение переменной), запишите $$.
Предопределённые переменные
К предопределённым переменным "Make" можно обратиться из любого атрибута, помеченного как "Подлежащие подстановке переменных 'Make'", на любой мишени.
Для просмотра списка этих переменных и их значений для заданного набора опций сборки, выполните
bazel info --show_make_env [build options]
и посмотрите верхние строки вывода с заглавными буквами.
См. пример предопределённых переменных.
Переменные опций инструментария
-
COMPILATION_MODE:fastbuild,dbg, илиopt. (Подробнее)
Переменные путей
-
BINDIR: Основание сгенерированного бинарного дерева для архитектуры мишени.Обратите внимание, что для программ, работающих во время сборки в архитектуре хоста, может использоваться другое дерево, для поддержки кросс-компиляции.
Если вы хотите запустить инструмент из
genrule, рекомендуемый способ получения его пути —$(execpath toolname), где toolname должен быть указан в атрибутеgenruletools. -
GENDIR: Основание сгенерированного дерева кода для архитектуры мишени.
Переменные архитектуры машины
-
TARGET_CPU: Процессор архитектуры мишени, например,k8.
Предопределённые переменные genrule
Следующие переменные специально доступны для атрибута genrule cmd и, как правило, важны для корректной работы этого атрибута.
См. пример предопределённых переменных genrule.
-
OUTS: Списокgenruleouts. Если у вас только один выходной файл, вы также можете использовать$@. -
SRCS: Списокgenrulesrcs(точнее: имена путей к файлам, соответствующие меткам в спискеsrcs). Если у вас только один исходный файл, вы также можете использовать$<. -
<:SRCS, если это единственный файл. В противном случае, вызывает ошибку сборки. -
@:OUTS, если это единственный файл. В противном случае, вызывает ошибку сборки. -
RULEDIR: Каталог вывода мишени, то есть каталог, соответствующий имени пакета, содержащего мишень, в деревеgenfilesилиbin. Для//my/pkg:my_genruleон всегда заканчиваетсяmy/pkg, даже если выходы//my/pkg:my_genruleнаходятся в подкаталогах. -
@D: Каталог вывода. Если outs содержит одну запись, эта переменная расширяется до каталога, содержащего этот файл. Если она содержит несколько записей, эта переменная расширяется до корневого каталога пакета в деревеgenfiles, даже если все выходные файлы находятся в одном подкаталоге!Примечание: Используйте
RULEDIRвместо@D, так какRULEDIRимеет более простую семантику и ведет себя одинаково независимо от количества выходных файлов.Если genrule нужно сгенерировать временные промежуточные файлы (возможно, в результате использования другого инструмента, например, компилятора), он должен попытаться записать их в
@D(хотя/tmpтакже будет доступен) и удалить их перед завершением.Особенно избегайте записи в каталоги, содержащие входные файлы. Они могут быть на файловых системах только для чтения. Даже если нет, это приведет к повреждению дерева исходных кодов.
Предопределённые переменные путей к исходникам/выходам
Предопределённые переменные execpath, execpaths, rootpath, rootpaths, location, и locations принимают параметры метки (например, $(execpath
//foo:bar)) и подставляют пути к файлам, обозначенные этой меткой.
Для исходных файлов это путь относительно корня вашего рабочего пространства. Для файлов, являющихся результатами правил, это путь вывода файла (см. объяснение файлов вывода ниже).
См. пример предопределённых переменных путей.
-
execpath: Обозначает путь под execroot, где Bazel выполняет действия сборки.В приведённом примере Bazel выполняет все действия сборки в каталоге, связанном с символической ссылкой
bazel-myprojectв корне вашего рабочего пространства. Исходный файлempty.sourceсвязан по путиbazel-myproject/testapp/empty.source. Таким образом, его путь выполнения (который является подпутем ниже корня) составляетtestapp/empty.source. Это путь, который действия сборки могут использовать для поиска файла.Файлы вывода подготавливаются аналогично, но также имеют префикс подпути
bazel-out/cpu-compilation_mode/bin(или для выходов инструментов:bazel-out/cpu-opt-exec-hash/bin). В приведённом примере//testapp:app— это инструмент, так как он появляется в атрибутеshow_app_outputtools. Поэтому выходной файлappзаписывается вbazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app. Таким образом, путь выполнения составляетbazel-out/cpu-opt-exec-hash/bin/testapp/app. Этот дополнительный префикс позволяет собирать одну и ту же мишень для, скажем, двух разных процессоров в одной сборке без перезаписи результатов.Переданная метка для этой переменной должна представлять ровно один файл. Для меток, представляющих исходные файлы, это автоматически верно. Для меток, представляющих правила, правило должно генерировать ровно один выход. Если это не так или метка имеет неправильный формат, сборка завершается ошибкой.
-
rootpath: Обозначает путь, который сгенерированный двоичный файл может использовать для поиска зависимости во время выполнения относительно подкаталога каталога runfiles, соответствующего главному репозиторию. Примечание: Это работает только если--enable_runfilesвключено, что по умолчанию не так в Windows. Используйтеrlocationpathдля кроссплатформенной поддержки вместо этого.Это аналогично
execpath, но удаляет описанные выше конфигурационные префиксы. В приведённом примере это означает, чтоempty.sourceиappиспользуют чисто относительные пути к рабочему пространству:testapp/empty.sourceиtestapp/app.Путь
rootpathфайла в внешнем репозиторииrepoбудет начинаться с../repo/, за которым следует путь относительно репозитория.У этой переменной те же требования «только один выход», что и у
execpath. -
rlocationpath: Путь, который сгенерированный двоичный файл может передать функцииRlocationбиблиотеки runfiles для поиска зависимости во время выполнения, либо в каталоге runfiles (если доступен), либо с помощью манифеста runfiles.Это похоже на
rootpath, поскольку не содержит конфигурационных префиксов, но отличается тем, что всегда начинается с имени репозитория. В приведённом примере это означает, чтоempty.sourceиappприводят к следующим путям:myproject/testapp/empty.sourceиmyproject/testapp/app.Путь
rlocationpathфайла в внешнем репозиторииrepoбудет начинаться сrepo/, за которым следует путь относительно репозитория.Передача этого пути в двоичный файл и разрешение его в путь к файловой системе с использованием библиотек runfiles — предпочтительный способ поиска зависимостей во время выполнения. По сравнению с
rootpath, это имеет преимущество, что работает на всех платформах и даже если каталог runfiles недоступен.У этой переменной те же требования «только один выход», что и у
execpath. -
location: Синоним дляexecpathилиrootpath, в зависимости от расширяемого атрибута. Это поведение legacy до Starlark, и не рекомендуется, если вы точно не знаете, что оно делает для конкретного правила. См. #2475 для получения дополнительной информации.
execpaths, rootpaths, rlocationpaths, и locations являются множественными вариантами execpath, rootpath, rlocationpaths, и location, соответственно. Они поддерживают метки, производящие несколько выходов, в котором каждый выход перечисляется, разделённый пробелом. Правила с нулевым выходом и неправильные метки вызывают ошибки сборки.
Все ссылки на метки должны присутствовать в srcs потребляющей мишени, файлах вывода или deps. В противном случае сборка завершится ошибкой. Мишени C++ также могут ссылаться на метки в data.
Метки не обязательно должны быть в каноническом формате: foo, :foo и //somepkg:foo подойдут.
Пользовательские переменные
Пользовательские переменные "Make" могут быть использованы в атрибутах, помеченных как "Подлежащие подстановке переменных 'Make'", но только в мишенях, которые зависят от других мишеней, которые определяют эти переменные.