Базель Старларк: как я могу сгенерировать файл BUILD процедурно?
После загрузки архива через http_archive я хотел бы запустить сценарий для создания файла BUILD из структуры папок и файлов Cmake в нем (в настоящее время я делаю это вручную, и это достаточно просто, чтобы его можно было написать сценарием). Я не нашел ничего о том, как открывать, читать и записывать файлы в документации starlark, но поскольку сам http_archive загружается из файла bzl (хотя еще не нашел источник этого файла...) и генерирует файлы BUILD (распаковывая их из архивов) Я думаю, должна быть возможность написать оболочку для http_archive, которая также генерирует файл BUILD?
2 ответа
Это идеальный вариант использования правила настраиваемого репозитория. Это позволяет запускать произвольные команды для создания файлов для репозитория, а также использовать некоторые вспомогательные средства для общих операций, таких как загрузка файла через HTTP с использованием кеша репозитория (если настроен). Правило репозитория концептуально похоже на обычное правило, но с гораздо меньшей инфраструктурой, поскольку оно выполняется на этапе загрузки, когда большая часть инфраструктуры Bazel еще не применяется.
Звездная реализация http_archive
находится в http.bzl. Суть этого - единственный призыв к ctx.download_and_extract
. Ваше собственное правило тоже должно делать это.http_archive
затем звонит workspace_and_buildfile
а также patch
из util.bzl
, которые делают то, на что они похожи. Вместо тогоworkspace_and_buildfile
ты должен позвонить ctx.execute
чтобы запустить вашу команду для создания файла BUILD. Вы могли бы позвонитьpatch
если хотите, или пропустите эту функцию, если не собираетесь ее использовать.
Страница repository_ctx в документации - это справочная информация верхнего уровня для всего, что может делать функция реализации вашего правила репозитория, если вы хотите ее расширить.
Когда используешь http_archive
, вы можете использовать build_file
аргумент для создания файла BUILD. Чтобы генерировать его динамически, я думаю, вы можете использоватьpatch_cmds
аргумент для запуска внешних команд.