- Использование
- Предопределённые переменные
- Предопределённые переменные 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 должен быть указан в атрибутеgenruleвtools. -
GENDIR: Основание сгенерированного дерева кода для архитектуры цели.
Переменные архитектуры машины
-
TARGET_CPU: ЦП целевой архитектуры, напримерk8.
Предопределённые переменные genrule
Следующие переменные специально доступны для атрибута genrule cmd и, как правило, важны для работы этого атрибута.
См. пример предопределённых переменных genrule.
-
OUTS: Списокgenruleвouts. Если у вас только один выходной файл, вы также можете использовать$@. -
SRCS: Списокgenruleвsrcs(или точнее: имена путей к файлам, соответствующим меткам в списке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.Путь к файлу в внешнем хранилище
repoначнётся с../repo/, за которым следует путь, относящийся к хранилищу.Это имеет те же требования «только один выход» что и
execpath. -
rlocationpath: Путь, который сгенерированный двоичный файл может передать функцииRlocationбиблиотеки runfiles для поиска зависимости во время выполнения, либо в каталоге runfiles (если доступен), либо с помощью файла-манифеста runfiles.Это похоже на
rootpath, поскольку не содержит конфигурационных префиксов, но отличается тем, что всегда начинается с имени хранилища. В приведённом выше примере это означает, чтоempty.sourceиappприведут к следующим путям:myproject/testapp/empty.sourceиmyproject/testapp/app.Путь к файлу в внешнем хранилище
repoначнётся сrepo/, за которым следует путь, относящийся к хранилищу.Передача этого пути двоичному файлу и разрешение его в путь к файлу с помощью библиотек runfiles — предпочтительный подход к поиску зависимостей во время выполнения. В отличие от
rootpath, у него есть преимущество в том, что он работает на всех платформах и даже если каталог runfiles недоступен.Это имеет те же требования «только один выход» что и
execpath. -
location: Синоним дляexecpathилиrootpath, в зависимости от расширяемого атрибута. Это поведение по умолчанию, предшествующее Starlark, и не рекомендуется, если вы не знаете точно, что оно делает для конкретного правила. См. #2475 для подробностей.
execpaths, rootpaths, rlocationpaths, и locations — это множественные варианты execpath, rootpath, rlocationpaths, и location, соответственно. Они поддерживают метки, генерирующие несколько выходных данных, в которых каждый выходной данные перечислены через пробел. Правила с нулевыми выходами и метки с неправильным форматом вызывают ошибки сборки.