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

Материал из Rosalab Wiki
Перейти к: навигация, поиск
(Created page with "В РОСЕ, как и во многих других дистрибутивах, много внимания уделяется автоматизации различных ...")
 
м
 
Строка 1: Строка 1:
В РОСЕ, как и во многих других дистрибутивах, много внимания уделяется автоматизации различных задач и снижению "входного порога" для потенциальных мэйнтейнеров. Одним из первых вопросов, который встает перед человеком, жедающим собрать некоторок приложение в репозитории РОСЫ - это как подготовить spec-файл для сборки RPM-пакета. Во многих случаях это можно сделать автоматически (по крайней мере, в первом приближении) - например, автоматические генераторы spec-файлов доступны [http://wiki.rosalab.ru/ru/index.php/Python_policy#bdist_rpm5 для модулей Python], [http://wiki.rosalab.ru/ru/index.php/Perl_policy#Tools Perl], [http://wiki.rosalab.ru/ru/index.php/Ruby_policy#gem2rpm5 Ruby] и так далее.
+
[[File:code-generation-banner.jpg|192px|right]]
  
Однако модули - модулями, а многие приложения в Linux по-прежнему разрабатываются на компилируемых языках типа C/C++ и собираются с помощью GNU Autotools, CMake и аналогичных инструментов. До сих пор для таких приложений мы ограничивались [http://wiki.rosalab.ru/en/index.php/Template_Spec_Files шаблонами spec-файлов] и [http://wiki.rosalab.ru/ru/index.php/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:Packaging_Policies политиками сборки]. Для опытного мэйнтейнера этого достаточно, но у новичков нередко возникают трудности именно с первым шагом, так что мы решили еще больше упростить процесс и подготовили утилиту spec-gen, генерирующую заготовку spec-файла на основе анализа архива с исходным кодом.
+
В РОСЕ, как и во многих других дистрибутивах, много внимания уделяется автоматизации различных задач и снижению «входного порога» для потенциальных мэйнтейнеров. Одним из первых вопросов, который встает перед человеком, желающим собрать некоторое приложение в репозитории РОСЫ — это как подготовить spec-файл для сборки RPM-пакета. Во многих случаях это можно сделать автоматически (по крайней мере, в первом приближении) — например, автоматические генераторы spec-файлов доступны [http://wiki.rosalab.ru/ru/index.php/Python_policy#bdist_rpm5 для модулей Python], [http://wiki.rosalab.ru/ru/index.php/Perl_policy#Tools Perl], [http://wiki.rosalab.ru/ru/index.php/Ruby_policy#gem2rpm5 Ruby] и так далее.
  
Использовать утилиту очень просто - достаточно установить в РОСЕ пакет {{pkg|spec-gen}} и запустить команду {{prog|spec-gen}}, передав ей в качестве аргумента имя архива с исходным кодом:
+
Однако модули — модулями, а многие приложения в Linux по-прежнему разрабатываются на компилируемых языках типа C/C++ и собираются с помощью <tt>GNU Autotools</tt>, <tt>CMake</tt> и аналогичных инструментов. До сих пор для таких приложений мы ограничивались [http://wiki.rosalab.ru/en/index.php/Template_Spec_Files шаблонами spec-файлов] и [http://wiki.rosalab.ru/ru/index.php/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:Packaging_Policies политиками сборки]. Для опытного мэйнтейнера этого достаточно, но у новичков нередко возникают трудности именно с первым шагом, так что мы решили еще больше упростить процесс и подготовили утилиту <tt>spec-gen</tt>, генерирующую заготовку spec-файла на основе анализа архива с исходным кодом.
  
$ spec-gen my_tarball-1.0.tar.gz
+
Использовать утилиту очень просто — достаточно установить в РОСЕ пакет {{pkg|spec-gen}} и запустить команду {{prog|spec-gen.py}}, передав ей в качестве аргумента имя архива с исходным кодом:
  
С помощью опций -g, -s, -l и -u вы можете указать группу, короткое описание, лицензию и URL создаваемого пакета. Можно эти опции и не задавать, а заполнить соответсвующие поля в сгенерированном spec-файле. Имя и версию пакета утилита пытается угадать по имени архива, исходя из предположения, что большинство архивов называются "<имя_программы>-<версия>". Утилита подерживает все распространенные форматы архивов; впрочем, если вам попался неподдерживаемый архив - напишите нам, мы добавим код для его обработки.
+
$ spec-gen.py my_tarball-1.0.tar.gz
  
В процессе работы утилита первым делом просмотрит содержимое архива на предмет наличия там файлов {{file|configure.in}}, {{file|configure.ac}}, {{file|CMakeLists.txt}}, {{file|*.cmake}} и {{file|setup.py}}. Если обнаружится последний, то {{prog|spec-gen}}, не мудрствуя лукаво, запустит {{cmd|python setup.py bdist_rpm5}} и выдаст вам spec-файл, сгенерированный этой командой. В случае же наличия файлов CMake или GNU Autotools, {{prog|spec-gen}} произведет их анализ и попробует определить, какие пакеты необходимо установить для сборки приложения - иными словами, попробует сформировать перечень сборочных хависимостей (BuildRequires) для нового пакета.
+
С помощью опций <tt>-g</tt>, <tt>-s</tt>, <tt>-l</tt> и <tt>-u</tt> вы можете указать группу, короткое описание, лицензию и URL создаваемого пакета. Можно эти опции и не задавать, а заполнить соответсвующие поля в сгенерированном spec-файле. Имя и версию пакета утилита пытается угадать по имени архива, исходя из предположения, что большинство архивов называются «<имя_программы>-<версия>». Утилита подерживает все распространенные форматы архивов; впрочем, если вам попался неподдерживаемый архив — напишите нам, мы добавим код для его обработки.
  
Запускать {{prog|spec-gen}} рекомендуется в той системе, под которую вы хотите создать пакет, поскольку информацию о доступных пакетах, предоставляющих ту или иную зависимость, утилита берет из репозиториев системы с помощью {{prog|urpmq}}.
+
В процессе работы утилита первым делом просмотрит содержимое архива на предмет наличия там файлов {{file|configure.in}}, {{file|configure.ac}}, {{file|CMakeLists.txt}}, {{file|*.cmake}} и {{file|setup.py}}. Если обнаружится последний, то {{prog|spec-gen}}, не мудрствуя лукаво, запустит {{cmd|python setup.py bdist_rpm5}} и выдаст вам spec-файл, сгенерированный этой командой. В случае же наличия файлов CMake или GNU Autotools, {{prog|spec-gen}} произведет их анализ и попробует определить, какие пакеты необходимо установить для сборки приложения — иными словами, попробует сформировать перечень сборочных хависимостей (BuildRequires) для нового пакета.
  
На выходе получится заготовка spec-файла с заполненным заголовком, перечнем BuildRequires, секциями {{macro|%prep}}, {{macro|%build}} и {{macro|%install}}. Перечень файлов в секции %files необходимо будет доработать самостоятельно, равно как и произвести разбиение на подпакеты при необходимости. Безусловно, стопроцентной точности сгенерированного списка BuildRequires гарантировать нельзя - могут проявиться и неявные зависимости, не указанные в скриптах сборки, либо {{prog|spec-gen}} может сделать неправильный выбор среди имеющихся альтернатив. Тем не менее, в большинстве случаев утилита отрабатывает корректно и создает spec-файл, с помощью которого уже можно начинать собирать пакет, и с немалой вероятностью вам останется только посмотреть на список файлов, созданных в ходе сборки пакета, и подправить секцию %files.
+
Запускать {{prog|spec-gen.py}} рекомендуется в той системе, под которую вы хотите создать пакет, поскольку информацию о доступных пакетах, предоставляющих ту или иную зависимость, утилита берет из репозиториев системы с помощью {{prog|urpmq}}.
  
Возможно, в будущем мы продвинемся еще дальше, и сразу будем запускать сборку пакета с помощью полученного spec-файла, автоматически определять перечень файлов пакета и так далее. Простора для творчества здесь хватает. А пока что - устанавливайте, пробуйте и вносите свои идеи, предложения, а главное - патчи. Исходный код утилиты доступен здесь - https://abf.io/soft/spec-gen-dev.
+
На выходе получится заготовка spec-файла с заполненным заголовком, перечнем BuildRequires, секциями {{macro|%prep}}, {{macro|%build}} и {{macro|%install}}. Перечень файлов в секции <tt>%files</tt> необходимо будет доработать самостоятельно, равно как и произвести разбиение на подпакеты при необходимости. Безусловно, стопроцентной точности сгенерированного списка BuildRequires гарантировать нельзя — могут проявиться и неявные зависимости, не указанные в скриптах сборки, либо {{prog|spec-gen}} может сделать неправильный выбор среди имеющихся альтернатив. Тем не менее, в большинстве случаев утилита отрабатывает корректно и создает spec-файл, с помощью которого уже можно начинать собирать пакет, и с немалой вероятностью вам останется только посмотреть на список файлов, созданных в ходе сборки пакета, и подправить секцию <tt>%files</tt>.
 +
 
 +
Возможно, в будущем мы продвинемся еще дальше, и сразу будем запускать сборку пакета с помощью полученного spec-файла, автоматически определять перечень файлов пакета и так далее. Простора для творчества здесь хватает. А пока что устанавливайте, пробуйте и вносите свои идеи, предложения, а главное патчи. Исходный код утилиты доступен здесь https://abf.io/soft/spec-gen-dev.
  
 
В заключение отметим, что основа для утилиты {{pkg|spec-gen}} была разработана студентом НИУ ВШЭ Андреем Соловьевым в рамках производственной практики в РОСЕ.
 
В заключение отметим, что основа для утилиты {{pkg|spec-gen}} была разработана студентом НИУ ВШЭ Андреем Соловьевым в рамках производственной практики в РОСЕ.
  
 
+
<poll>
 
+
<!--
+
<poll>  
+
 
ALTERNATIVE
 
ALTERNATIVE
 
OPEN_RESULTS
 
OPEN_RESULTS
UNSAFE_ID=good-news-2013-09-30
+
UNSAFE_ID=good-news-2014-07-21
 
Надеюсь, эта новость вас…
 
Надеюсь, эта новость вас…
 
Ввела в экстаз <tt>^_^</tt>
 
Ввела в экстаз <tt>^_^</tt>
Строка 32: Строка 31:
 
Огорчила <tt>:(</tt>
 
Огорчила <tt>:(</tt>
 
</poll>
 
</poll>
-->
 
  
 
[[Category:ToROSAPoint]]
 
[[Category:ToROSAPoint]]
 
{{wl-publish: 2014-07-15 18:17:38 +0400 | Denis.silakov }}
 
{{wl-publish: 2014-07-15 18:17:38 +0400 | Denis.silakov }}

Текущая версия на 17:16, 29 июля 2014

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%

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

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

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