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

Материал из Rosalab Wiki
Перейти к: навигация, поиск
Code-generation-banner.jpg

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

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

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

$ spec-gen.py 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.py рекомендуется в той системе, под которую вы хотите создать пакет, поскольку информацию о доступных пакетах, предоставляющих ту или иную зависимость, утилита берет из репозиториев системы с помощью urpmq.

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

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

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

Надеюсь, эта новость вас…

Ввела в экстаз ^_^40
75%
Порадовала :)7
13%
Оставила равнодушным -_-2
4%
Огорчила :(4
8%

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

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

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