Spec-gen - генерируем spec-файлы для программ на GNU Autotools и CMake

Материал из Rosalab Wiki
Перейти к: навигация, поиск

В РОСЕ, как и во многих других дистрибутивах, много внимания уделяется автоматизации различных задач и снижению "входного порога" для потенциальных мэйнтейнеров. Одним из первых вопросов, который встает перед человеком, жедающим собрать некоторок приложение в репозитории РОСЫ - это как подготовить spec-файл для сборки RPM-пакета. Во многих случаях это можно сделать автоматически (по крайней мере, в первом приближении) - например, автоматические генераторы spec-файлов доступны для модулей Python, Perl, Ruby и так далее.

Однако модули - модулями, а многие приложения в Linux по-прежнему разрабатываются на компилируемых языках типа C/C++ и собираются с помощью GNU Autotools, CMake и аналогичных инструментов. До сих пор для таких приложений мы ограничивались шаблонами spec-файлов и политиками сборки. Для опытного мэйнтейнера этого достаточно, но у новичков нередко возникают трудности именно с первым шагом, так что мы решили еще больше упростить процесс и подготовили утилиту spec-gen, генерирующую заготовку spec-файла на основе анализа архива с исходным кодом.

Использовать утилиту очень просто - достаточно установить в РОСЕ пакет spec-gen и запустить команду spec-gen, передав ей в качестве аргумента имя архива с исходным кодом:

$ spec-gen my_tarball-1.0.tar.gz

С помощью опций -g, -s, -l и -u вы можете указать группу, короткое описание, лицензию и URL создаваемого пакета. Можно эти опции и не задавать, а заполнить соответсвующие поля в сгенерированном spec-файле. Имя и версию пакета утилита пытается угадать по имени архива, исходя из предположения, что большинство архивов называются "<имя_программы>-<версия>". Утилита подерживает все распространенные форматы архивов; впрочем, если вам попался неподдерживаемый архив - напишите нам, мы добавим код для его обработки.

В процессе работы утилита первым делом просмотрит содержимое архива на предмет наличия там файлов configure.in, configure.ac, CMakeLists.txt, *.cmake и setup.py. Если обнаружится последний, то spec-gen, не мудрствуя лукаво, запустит python setup.py bdist_rpm5 и выдаст вам spec-файл, сгенерированный этой командой. В случае же наличия файлов CMake или GNU Autotools, spec-gen произведет их анализ и попробует определить, какие пакеты необходимо установить для сборки приложения - иными словами, попробует сформировать перечень сборочных хависимостей (BuildRequires) для нового пакета.

Запускать spec-gen рекомендуется в той системе, под которую вы хотите создать пакет, поскольку информацию о доступных пакетах, предоставляющих ту или иную зависимость, утилита берет из репозиториев системы с помощью urpmq.

На выходе получится заготовка spec-файла с заполненным заголовком, перечнем BuildRequires, секциями %prep, %build и %install. Перечень файлов в секции %files необходимо будет доработать самостоятельно, равно как и произвести разбиение на подпакеты при необходимости. Безусловно, стопроцентной точности сгенерированного списка BuildRequires гарантировать нельзя - могут проявиться и неявные зависимости, не указанные в скриптах сборки, либо spec-gen может сделать неправильный выбор среди имеющихся альтернатив. Тем не менее, в большинстве случаев утилита отрабатывает корректно и создает spec-файл, с помощью которого уже можно начинать собирать пакет, и с немалой вероятностью вам останется только посмотреть на список файлов, созданных в ходе сборки пакета, и подправить секцию %files.

Возможно, в будущем мы продвинемся еще дальше, и сразу будем запускать сборку пакета с помощью полученного spec-файла, автоматически определять перечень файлов пакета и так далее. Простора для творчества здесь хватает. А пока что - устанавливайте, пробуйте и вносите свои идеи, предложения, а главное - патчи. Исходный код утилиты доступен здесь - https://abf.io/soft/spec-gen-dev.

В заключение отметим, что основа для утилиты spec-gen была разработана студентом НИУ ВШЭ Андреем Соловьевым в рамках производственной практики в РОСЕ.

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.