Базель Старларк: как я могу сгенерировать файл 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 аргумент для запуска внешних команд.

Другие вопросы по тегам