Иногда встречаются полезные программы, доступные только в виде исходных кодов (и/или в виде установочных пакетов для других ОС), но есть необходимость их установки на несколько компьютеров. Чтобы не выполнять компиляцию на каждом компьютере отдельно, можно на одном подготовить установочный пакет и установить его штатными средствами на других компьютерах.
Ниже приведён пример создания RPM пакета для Fedora 21 (для других версий Fedora процедура не отличается) из исходных текстов очень приятной и полезной программы Boomaga версии 0.7.0.
Готовим инструменты сборки RPM
Для начала я попытался установить необходимые инструменты (как мне посоветовала статья «How to create a GNU Hello RPM package»):
но эта команда не выполнилась, ссылаясь на отсутствие группы development-tools. Тогда я установил всё другой командой, которую мне подсказала статья «Создание RPM пакетов из исходников»:
sudo dnf groupinstall «Development Tools»
и ещё две команды из обеих вышеуказанных статей:
Научись Linux: сборка программ из исходников (эпизод 13)
sudo dnf install rpmdevtools sudo dnf install fedora-packager
Затем надо сгенерировать рабочее пространство для сборки RPM:
rpmdev-setuptree
В результате этой команды создадутся необходимые каталоги в домашнем каталоге текущего пользователя (показываю содержимое нового каталога rpmbuild):
В каталог SOURCES сразу перемещаю архив исходников (boomaga-0.7.0.tar.gz), как он есть. Кстати, тут есть небольшой подвох от github, — ссылка на закачку не даётся напрямую, а генерируется только после клика по ней. Из-за этого не получилось указать прямую ссылку на архив в интернете в SPEC файле, о котором пойдёт речь ниже.
Готовим SPEC файл
Для упаковки исходных текстов программы в RPM пакет нужен специальный файл с описанием необходимых действий. Сгенерируем шаблон:
rpmdev-newspec boomaga
В результате этой команды будет создан файл boomaga.spec в каталоге ~/rpmbuild/SPEC. Тут важно название SPEC файла. Оно должно совпадать с названием программы (т.е. без номера версии). После автоматической генерации SPEC файла переходим к его редактированию. В моём случае это получилось так:
- /etc/rpm/*
- /usr/lib/rpm
- /usr/lib/rpm/macros
rpm —showrc
Прокомментирую указанные значения.
Параметр Name должен совпадать с именем SPEC файла и названием программы (указывается без номера версии).
Параметр Source0 должен по-хорошему указывать на архив в интернете, который имеет такое же название, как и файл в каталоге ~/rpmbuild/SOURCES, но т.к. ссылки на boomaga-0.7.0.tar.gz в интернете я не нашёл, то указал локальную ссылку. Без пути. Только название файла и с использованием переменных (берутся из указанных выше одноимённых параметров).
Перед тем, как пытаться собрать RPM пакет, я пробовал скомпилировать программу обычным образом. Для этого понадобилось установить инструмент cmake и зависимости данной программы: cups-devel, poppler-devel, poppler-cpp-devel, qt5-qtbase-devel, qt5-qttools-devel, snappy-devel. Все эти пакеты я указал в параметре BuildRequires.
Linux: сборка пакетов из исходников
Т.к. boomaga может работать в роли виртуального принтера как прослойка между CUPS, то я указал cups в параметре Requires.
Далее идут макросы, которые будут выполняться при сборке RPM пакета.
После макроса %description делаем переход на новую строку и вставляем описание из родного сайта проекта.
Макрос %setup -q распаковывает исходные коды в каталог ~/rpmbuild/BUILD/%-%, т.е. в нашем случае — ~/rpmbuild/BUILD/boomaga-0.7.0
Далее начинается самое ответственное. Нужно описать всё для автоматической компиляции проекта. Я поступил так. Открыл официальную инструкцию по установке данного приложения и переделал под текущую ситуацию. Инструкция по установке оказалась весьма лаконичной и понятной:
mkdir ~/boomaga/build cd ~/boomaga/build cmake .. make sudo make install
В форме макросов в SPEC файле эти инструкции выразились так:
%build mkdir build cd build cmake .. %make_install
Первый макрос %build отвечает за сборку исходников. В этой фазе создаём каталог build в текущем каталоге (т.е. в ~/rpmbuild/BUILD/boomaga-0.7.0) и перемещаемся в него. Потом запуск cmake для генерации Makefile. Т.е. всё то, что написано в инструкции по обычной установке данной программы.
Затем макрос %make_install собирёт всё каталоге в ~/rpmbuild/BUILDROOT/boomaga-0.7.0-1.fc21.R.x86_64 так, как если бы шла нормальная установка. Т.е. там создаётся каталог usr со всеми задействованными подкаталогами.
Операции макросов %files (тут нужно указать список всех файлов, входящих в RPM пакет) и %doc (вся документация) заполнил в соответствии с подсказками после первых неудачных запусков, — при сборке пакета выводилось сообщение:
В результате успешной сборки формируются RPM пакеты:
~/rpmbuild/RPMS/x86_64/boomaga-0.7.0-1.fc21.R.x86_64.rpm
~/rpmbuild/RPMS/x86_64/boomaga-debuginfo-0.7.0-1.fc21.R.x86_64.rpm
~/rpmbuild/SRPMS/boomaga-0.7.0-1.fc21.R.src.rpm
А вот, собственно, как запускать сборку:
rpmbuild —target=x86_64 -ba ~/rpmbuild/SPECS/boomaga.spec
Команда отрабатывает за пару минут. В это время в консоли пролетают красивые разноцветные строчки.
Позже, когда дистрибутив Fedora обновится до следующей версии, можно будет попробовать перепаковать пакет boomaga-0.7.0-1.fc21.R.src.rpm такой командой:
rpmbuild —rebuild boomaga-0.7.0-1.fc21.R.src.rpm
Теоретически это позволит сократить время сборки RPM пакета.
Для проверки SPEC файла и формируемого пакета можно перейти в каталог ~/rpmbuild/SPEC и воспользоваться командой:
rpmlint boomaga.spec ../SRPMS/boomaga* ../RPMS/*/boomaga*
В результате будут показаны различные предупреждения и ошибки. В моём случае есть ошибки расположения файлов. Но для личного пользования подойдёт и так. Хотя с такими ошибками в официальные репозитории не пропустят.
Посмотреть описание ошибки можно, указав её название после ключа -I в следующей команде:
rpmlint -I hardcoded-library-path
Полезные ссылки
Различных параметров и макросов существует довольно много. В официальной документации Fedora есть исчерпывающие полезные и обширные материалы «How to create an RPM package» и «Packaging:Guidelines». Также есть пример с пояснениями SPEC файла в материале «Annotated spec file».
Делаем RPM лучше
Чтобы полученный RPM пакет не только выполнял свою функцию, но и делал это правильно, нужно избавиться от всех ошибок, на которые указывает rpmlint.
Основная ошибка состоит в том, что полученные файлы в системе устанавливаются не туда, куда положено. Во-первых, всё должно соответствовать стандарту Filesystem Hierarchy Standard, который недавно обновился. Во-вторых RPM пакет для Fedora должен соответствовать правилам этого дистрибутива.
Нужно избавиться от жёстко прописанных путей в секции %files. Для этого применяются макросы. В моём случае исходный код программы в нескольких местах имел жёстко прописанный путь в подкаталог lib, а для архитектуры x86_64 нужно было указывать lib64. Поэтому потребовалось немного подкорректировать исходный код программы.
В результате общения с разработчиками программы на github.com, SPEC файл пополнился также автоматическим прописыванием принтера в системе. Плюс программа Boomaga успела обновиться до версии 0.7.1. Результирующий SPEC файл:
Name: boomaga Version: 0.7.1 Release: 1% Summary: A virtual printer for viewing a document before printing License: GPLv2 and LGPLv2+ URL: http://boomaga.github.io Source0: %-%.tar.gz BuildRequires: cmake,cups-devel,poppler-devel,poppler-cpp-devel,qt5-qtbase-devel,qt5-qttools-devel,snappy-devel Requires: cups,snappy %description Boomaga (BOOklet MAnager) is a virtual printer for viewing a document before printing it out using the physical printer. The program is very simple to work with. Running any program, click “print” and select “Boomaga” to see in several seconds (CUPS takes some time to respond) the Boomaga window open.
If you print out one more document, it gets added to the previous one, and you can also print them out as one, and you can also print them out as one. Regardless of whether your printer supports duplex printing or not, you would be able to easily print on both sides of the sheet. If your printer does not support duplex printing, point this out in the settings, and Booklet would ask you to turn over the pages half way through printing your document. The program can also help you get your documents prepared a bit before printing. At this stage Boomaga makes it possible to: * Paste several documents together. * Print several pages on one sheet. * 1, 2, 4, 8 pages per sheet * Booklet.
Folding the sheets in two, you’ll get a book. %prep %setup -q %build %ifarch x86_64 %cmake -DLIB_SUFFIX=64 -DCUPS_BACKEND_DIR=%/cups/backend -DCUPS_FILTER_DIR=%/cups/filter . %else %cmake -DCUPS_BACKEND_DIR=%/cups/backend -DCUPS_FILTER_DIR=%/cups/filter . %endif make % %install make install DESTDIR=% %__mkdir -p %%/%/scripts %__install -m 755 scripts/installPrinter.sh %%/%/scripts/ chmod +x %%/%/scripts/installPrinter.sh # Add translation lang tags (cd % find . -name ‘*.qm’) | %__sed -e ‘s|^.||’ | sed -e ‘s:(.*/translations/boomaga_)([a-z_A-Z]+)(.*qm$):%lang(2) 123:’ >> %.lang %pre # Start cups if is stopped if [ «$(systemctl is-active cups.service)» != «active» ]; then systemctl start cups sleep 2 fi %post # Install the printer to cups backends if [ $1 = 1 ]; then sh %/%/scripts/installPrinter.sh fi %preun # Uninstall the printer lpadmin -x «Boomaga» %files %defattr(755,root,root,-) %/cups/backend/% %defattr(-,root,root,-) %/cups/filter/boomaga_pstopdf %/% %/%/boomagabackend %/%/boomagamerger %/applications/boomaga.desktop %/%/translations/* %/dbus-1/services/org.boomaga.service %/icons/hicolor/* %/mime/packages/boomaga.xml %/ppd/%/boomaga.ppd %/%/scripts/installPrinter.sh %doc COPYING GPL LGPL README.md %/man1/boomaga.1.gz %changelog * Tue Jun 30 2015 Oleg Ekhlakov 0.7.1-1.fc21.R — Initial version of the package
Источник: ekhlakov.blogspot.com
Собираем RPM пакеты для Fedora в mock
Ранее мы уже многократно описывали алгоритмы сборки RPM пакетов, однако делали это непосредственно внутри установленной системы при помощи прямого вызова инструмента rpmbuild. Существует и другой, более правильный, на наш взгляд, метод — mock.
Подготовка среды
Для начала нам потребуется установить и подготовить среду к работе. Установим сам mock, а также ряд необязательных, но необходимых для наших целей компонентов:
sudo dnf install mock rpmdevtools rpm-build
Если для сборки пакета нам потребуются не только базовые репозитории Fedora, но и RPMFusion, потребуется добавить готовые конфиги и для этого сценария:
sudo dnf install mock-rpmfusion-free
Получение прав на сборку
По умолчанию использовать mock имеют право только те пользователи, которые состоят в одноимённой группе, созданной при установке среды.
Первым делом необходимо добавить свою учётную запись в группу mock. Это можно сделать при помощи usermod:
sudo usermod -a -G mock $(whoami)
Теперь выполним повторную инициализацию пользовательского сеанса с регистрацией в новой группе (в качестве альтернативы можно просто выйти и повторно войти в систему):
newgrp mock
Подготовка пакета к сборке
Для запуска сборки в mock, мы должны использовать пакет с исходными текстами *.src.rpm (SRPM).
При отсутствии готового к сборке SRPM и наличии только SPEC-файла, нам потребуется сначала его сгенерировать.
Создадим базовую структуру каталогов rpmbuild для текущего пользователя:
rpmdev-setuptree
Загрузим все исходники, указанные внутри SPEC-файла, улититой spectool (они будут загружены в каталог ~/rpmbuild/SOURCES/):
spectool -g -R имя_пакета.spec
rpmbuild -bs имя_пакета.spec
Итоговый SRPM будет лежать в каталоге ~/rpmbuild/SRPMS/.
Запуск сборки пакета в mock
Итак, у нас есть пакет с исходниками и спеком — SRPM — поэтому приступим непосредственно к сборке:
mock -r fedora-$(rpm -E %fedora)-$(uname -m)-rpmfusion_free —rebuild ~/rpmbuild/SRPMS/имя_пакета*.src.rpm
В этом примере мы собираем пакет для текущей используемой версии Fedora ($(rpm -E %fedora)), текущей платформы ($(uname -m)) с добавлением поддержки репозитория RPMFusion во время сборки (-rpmfusion_free).
Сборка для иных версий Fedora и платформ
Если необходимо собрать пакет для другой версии Fedora или другой архитектуры, то сделать это очень просто. Для начала узнаем какие файлы конфигурации у нас установлены:
ls -l /etc/mock/*.cfg
Данные файлы конфигурации содержат список репозиториев и тулчейнов, которые будут использоваться при сборке. Необходимый конфигурационный файл следует указать после параметра -r без расширения. Если он не указан, то будет использоваться /etc/mock/default.cfg, который является симлинком. Допускается удалить данный симлинк и создать на его месте свой собственный конфиг по умолчанию (в качестве примера можно взять любой из существующих (это обычные текстовые файлы)).
Для Fedora 25 для архитектуры i386 (32-бита) без подключения RPMFusion:
mock -r fedora-25-i386 —rebuild ~/rpmbuild/SRPMS/имя_пакета*.src.rpm
Для Fedora 25 для архитектуры x86_64 (64-бита) с подключением RPMFusion:
mock -r fedora-25-x86_64-rpmfusion_free —rebuild ~/rpmbuild/SRPMS/имя_пакета*.src.rpm
Получение результата
Сборка будет происходить внутри создаваемого chroot окружения и никак не затронет основную систему. По её окончании временные файлы будут уничтожены.
Mock располагает свои файлы в следующих каталогах:
- /etc/mock — конфигурационные файлы;
- /var/cache/mock — кэш пакетов dnf (может быть очищен пользователем);
- /var/lib/mock — каталог хранения chroot окружений и результатов сборки (также может быть очищен пользователем).
По окончании работы собранные RPM пакеты, а также полные логи могут быть найдены в каталоге /var/lib/mock/ID_окружения/result/.
Источник: www.easycoding.org
Fedora: сборка пакетов из src.rpm
Записная книжка рассеянного [в пространстве и времени] программиста
Fedora: сборка пакетов из src.rpm
Чаще всего то не требуется обычному пользователю. Но бывает ситуации, когда пакет собран с поддержкой библиотеки исключенной из дистрибутива.
Недавно это случилось с chromium в centos, а с драйверами от epson случается постоянно.
$ cd imagescan-bundle-fedora-27-1.3.23.x64.rpm/ $ ./install.sh [sudo] пароль для penguin: Последняя проверка окончания срока действия метаданных: 2:53:00 назад, Сб 19 мая 2018 09:42:23. Ошибка: Проблема 1: conflicting requests — nothing provides libboost_filesystem.so.1.64.0()(64bit) needed by imagescan-3.33.0-1epson4fedora27.x86_64 Проблема 2: package imagescan-plugin-networkscan-1.1.1-1epson4fedora27.x86_64 requires imagescan >= 3.9.0, but none of the providers can be installed — conflicting requests — nothing provides libboost_filesystem.so.1.64.0()(64bit) needed by imagescan-3.33.0-1epson4fedora27.x86_64 Проблема 3: package imagescan-plugin-gt-s650-1.0.0-1epson4fedora27.x86_64 requires imagescan >= 3.28.0, but none of the providers can be installed — conflicting requests — nothing provides libboost_filesystem.so.1.64.0()(64bit) needed by imagescan-3.33.0-1epson4fedora27.x86_64 Проблема 4: package imagescan-plugin-ocr-engine-1.0.0-1epson4fedora27.x86_64 requires imagescan >= 3.14.0, but none of the providers can be installed — conflicting requests — nothing provides libboost_filesystem.so.1.64.0()(64bit) needed by imagescan-3.33.0-1epson4fedora27.x86_64
А еще это может потребоваться если мы хотим поставить пакет, который распространяется только в src.rpm.
Устанавливаем тулчейн для сборки
Нам потребуется группа пакетов для сборки RPM
$ sudo dnf group install «RPM Development Tools»
Источник: russianpenguin.ru