How to create a GNU Hello RPM package/ru

From FedoraProject

Jump to: navigation, search

Это краткий, практический учебник по созданию пакетов RPM, показывающий, как быстро прийти к созданию простого исходного кода и бинарного прогрммного пакета. Материал учебника предполагает некоторое знакомство с использованием полу-подготовленных RPM пакетов и с порядком сборки FOSS (программ со свободным и открытым кодом)

Полная информация о том как создать RPM пакеты, включая более подробные советы, находится на стр. How to create an RPM package. Если вы планируете создать RPM пакет для хранилища Fedora, следуйте процессу, изложенному на стр. How to join the Fedora Package Collection Maintainers, включащему последующие различные руководства Fedora.

Этот учебник демонстрирует процесс создания программного пакета для GNU програмы "Hello world". Так как программа на языке C, печатающая строку 'Hello World!' в стандартный поток вывода, (т.е. подразумевается что вы вызовете команду, набрав её имя в консоли, программа выполнится и выдаст строку 'Hello World!' в эту же консоль.) проста, GNU версия этой программы содержит большинство обычных побочных компонентов, связанных с типичным проектом FOSS, в том числе окружения конфигурации/сборки/установки, документацию, интернационализацию и т.п. GNU версия, однако, традиционно состоит из файла tar, содержащего исходный код и сценарии настройки/сборки, но не включают в себя информацию о создании программного пакета. Таким образом, этот приемлемое средство для тренировки сборки пакетов RPM.

Contents

Окружение разработки

Чтобы собрать пакет RPM нам нужен набор инструментов для разработки. Это одноразовая установка, устанавливаемая выполнением этих команд из учётной записи системного администратора root:

# dnf install fedora-packager @development-tools

Чтобы протестировать процедуру сборки в чистом chroot вам нужно настроить вашу непривелигированную учётную запись чтобы стать участником группы 'mock':

# usermod -a -G mock <your username>

Это единственные команды требующие прав администратора root. Всю последующую работу следует выполнять из обычной, не привилегированной учётной записи, или даже из отдельной учётной записи, созданной только для разработки. Современные операционные системы на основе RPM, включая Fedora, настроены чтобы собирать и тестировать RPM пакеты исключительно в не привилегированной учетной записи. Команда

$ rpmdev-setuptree

настроит область для сборки RPM пакетов в вашем ~/rpmbuild каталоге. Этот каталог будет содержать несколько подкаталогов, для исходного кода программы, файлы настройки RPM и для исходного кода и для бинарного программного пакета.

Сборка программного пакета RPM "Hello World"

Нам нужен исходный код программы, для которой мы создаём программный пакет, часто называемый "основной веткой разработки" (upstream). Скачаем его с официального сайта программы в каталог ~/rpmbuild/SOURCE. Мы получаем сжатый архив, который является предпочтительной формой распространения для большинства проектов

$ cd ~/rpmbuild/SOURCES
$ wget http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz

Программный пакет RPM конфигурируется .spec файлом. Создадим шаблон файла hello.spec в нужном каталоге:

$ cd ~/rpmbuild/SPECS
$ rpmdev-newspec hello

Последние версиии редакторов Emacs и vi имеют режимы редактирования .spec файлов, в которых также можно будет создать подобный шаблон, после создания нового файла. Таким оразом, вы можете просто использовать, например, следующую команду, чтобы автоматически использовать шаблон.

$ vi hello.spec

Внутри файла .spec

Поля в нашем .spec файле нужно немного отредактировать. Следуйте инструкциям на стр. поля в файле .spec. В нашем случае, файл может начинаться следующим:

Примечание. Данный пример касается разработки на английском. Для примера как следует составлять .spec файл с локализованными полями, следует придерживаться инструкций GNU проекта "hello" в разделе перевода GNU проекта "hello".

Name:     hello
Version:  2.8
Release:  1
Summary:  The "Hello World" program from GNU
License:  GPLv3+
URL:      http://ftp.gnu.org/gnu/hello    
Source0:  http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz

%description
The "Hello World" program, done with all bells and whistles of a proper FOSS 
project, including configuration, build, internationalization, help files, etc.

%changelog
* Thu Jul 07 2011 The Coon of Ty <Ty@coon.org> - 2.8-1
- Initial version of the package

Поле Version (версия) должно показывать версию основной ветки разработки, тогда как поле Release (выпуск) показывает версию программы в Fedora.

Первая буква Summary (краткого изложения) должна быть заглавной, чтобы избежать конфликта rpmlint.

Ваша обязанность проверить статус License (лицензии) программы, проверив исходный код и/или его файлы LICENSE и/или переговорив с авторами.

Поле Group исторически используется для классификации пакета в соответствии со списком в /usr/share/doc/rpm-<version>/GROUPS. Он постепенно удаляется, поэтому вы не увидите его добавленным по умолчанию. Однако, в любом случае, добавить его не сложно.

Раздел %changelog (изменения) должен описывать работу над подготовкой RPM, особенно, если существуют исправления безопасности и программных ошибок над кодом в основной ветке разработки. Информация об изменениях может отображаться командой rpm --changelog -q <packagename>, которая очень полезна для установленной программы чтобы найти если определённые программные ошибки и исправления безопасности были включены в установленную программу, благодаря кропотливой работе сопровождающих программные пакеты Fedora, которые включают эту информацию с соответствующими номерами CVE (Распространённые уязвимости и риски).

Многострочные разделы, такие как %changelog или %description начинаются с новой строки под указателем и заканчивается пустой строкой.

Строки, которые не нужны (например, BuildRequires и Requires) теперь могут быть закоментированы символом "решетки" (#).

Большинство строк в шаблоне вовсе не нужно изменять, по крайней мере во время первых попыток.

Сборка программного пакета

Мы готовы к первому запуску чтобы собрать исходный код, бинарные пакеты и пакеты для отладки:

$ rpmbuild -ba hello.spec

Этот процесс перечислит неупакованные файлы, т.е. файлы, которые будут установлены в системе, которые не были объявлены, как принадлежащие программному пакету. Нужно объявить их в разделе %files. Не используйте конкретные пути, например /usr/bin/, вместо этого используйте системные переменные, например %{_bindir}/hello. Страницы руководства должны быть объявлены в подсекции %doc: %doc %{_mandir}/man1/hello.1.*.

Это повторяющийся, итеративный процесс: после редактирования файла .spec, перезапустите команду rpmbuild.

Так как наша программа должна поддерживать локализацию и интернационализацию, будет много необъявленных файлов i18n (интернационализации). Рекомендуемый способ их объявить:

  • найдите имя файла в разделе %install: %find_lang %{name}
  • добавьте требуемую зависимость для сборки: BuildRequires: gettext
  • используйте найденное имя файла %files -f %{name}.lang

Если программа испльзует файлы справочной системы GNU info, вам нужно убедиться что установка и удаление программного пакета не повлияет на другие программ в системе. Используйте этот шаблон:

  • удалите файл dir в %install: rm -f %{buildroot}/%{_infodir}/dir
  • Requires(post): info и Requires(preun): info
  • и эти команды:
%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :

%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi

Этот фрагмент копируется непосредственно из Packaging:ScriptletSnippets#Texinfo. Эта страница содержит решения множества распространённых задач. Если возможно, попытайтесь скопировать их оттуда, вместо разработки ваших собственных решений.

Полное содержимое файла hello.spec

Вот исходная версия файла hello.spec:

Name:           hello
Version:        2.8
Release:        1%{?dist}
Summary:        The "Hello World" program from GNU

License:        GPLv3+
URL:            http://ftp.gnu.org/gnu/%{name}
Source0:        http://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.gz

BuildRequires: gettext
      
Requires(post): info
Requires(preun): info

%description 
The "Hello World" program, done with all bells and whistles of a proper FOSS 
project, including configuration, build, internationalization, help files, etc.

%prep
%autosetup

%build
%configure
make %{?_smp_mflags}

%install
%make_install
%find_lang %{name}
rm -f %{buildroot}/%{_infodir}/dir

%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :

%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi

%files -f %{name}.lang
%{_mandir}/man1/hello.1.*
%{_infodir}/hello.info.*
%{_bindir}/hello

%doc AUTHORS ChangeLog NEWS README THANKS TODO
%license COPYING

%changelog
* Tue Sep 06 2011 The Coon of Ty <Ty@coon.org> 2.8-1
- Initial version of the package

С этим файлом .spec, вы можете успешно завершить процесс сборки и создания исходного и бинарного пакетов RPM.

Далее вы должны проверить их на соответствие правилам разработки RPM, запустив команду rpmlint для файла .spec и всех пакетов RPM:

$ rpmlint hello.spec ../SRPMS/hello* ../RPMS/*/hello*

Если нет ошибок или предупреждений, нам удалось. В противном случае, используйте команду rpmlint -i или rpmlint -I <error_code> чтобы увидеть более подробное описание результата диагностики программы rpmlint.

Сборка mock (макета)

Чтобы проверить что сборка программного пакета будет успешна в ограниченной сборочной среде Fedora, проверьте её на сборке mock (макета).

$ mock --verbose ../SRPMS/hello-2.8-1.fc20.src.rpm

Ссылки

История редактирования файла

Przemek Klosowski wrote this tutorial when he worked through Christoph Wickert's IRC session on building RPMs using Rahul Sundaram suggestion of GNU "Hello World" as a test case. After he wrote up his experience, he found out about the excellent and extensive How to create an RPM package page on this wiki, as well as the Christian Lyder Jacobsen's website. However, Christian isn't planning to update his site, and it seemed that a 5-minute 'fast food' alternative to the more extensive article might suit some people. More in-depth information on using and building RPM packages is available from other sources.