- Использование
- Предопределённые переменные
- Предопределённые переменные genrule
- Предопределённые переменные пути к исходникам/выходам
- Пользовательские переменные
Переменные "Make" — это специальный класс расширяемых строковых переменных, доступных атрибутам, помеченным как "Подлежащие замене переменными 'Make'".
Их можно использовать, например, для вставки конкретных путей к инструментам в пользовательские действия сборки.
Bazel предоставляет как предопределённые переменные, доступные всем целевым объектам, так и пользовательские переменные, которые определяются в целевых объектах-зависимостях и доступны только целевым объектам, которые зависят от них.
Название "Make" — историческое: синтаксис и семантика этих переменных изначально должны были соответствовать GNU Make.
Использование
Атрибуты, помеченные как "Подлежащие замене переменными 'Make variable'", могут ссылаться на переменную "Make" FOO следующим образом:
my_attr = "prefix $(FOO) suffix"
Другими словами, любой подстроке, соответствующей $(FOO), присваивается значение FOO. Если это значение равно "bar", итоговая строка будет:
my_attr = "prefix bar suffix"
Если FOO не соответствует переменной, известной целевому объекту, Bazel выдаёт ошибку.
Переменные "Make", имена которых — небуквенные символы, такие как @, также могут быть использованы с помощью только знака доллара, без скобок. Например:
my_attr = "prefix $@ suffix"
Чтобы записать $ как строковый литерал (то есть предотвратить расширение переменных), запишите $$.
Предопределённые переменные
На любые атрибуты, помеченные как "Подлежащие замене переменными 'Make variable'", на любом целевом объекте можно ссылаться через предопределённые переменные "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: Список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, в зависимости от расширяемого атрибута. Это устаревшее поведение до Starlark и не рекомендуется, если вы не знаете точно, что делает для конкретного правила. См. #2475 для получения подробной информации.
execpaths, rootpaths, rlocationpaths, и locations — это множественные варианты execpath, rootpath, rlocationpaths, и location, соответственно. Они поддерживают метки, создающие несколько выходов, в которых каждый выход перечисляется через пробел. Правила с нулевым выходом и некорректные метки приводят к ошибкам сборки.