Fedora: сборка пакетов из src.rpm

19 May 2018

2018-05-19-12:35:39_1076x631Чаще всего то не требуется обычному пользователю. Но бывает ситуации, когда пакет собран с поддержкой библиотеки исключенной из дистрибутива.

Недавно это случилось с 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"

Подготавливаем окружение

$ rpmdev-setuptree

Команда подготовит необходимую структуру папок в домашнем каталого.

/home/penguin/rpmbuild/  
├── BUILD  
├── BUILDROOT  
├── RPMS  
├── SOURCES  
├── SPECS  
└── SRPMS

Достаем пакет с исходниками

Вы же видели репозитарии source (например, russianfedora-nonfree-updates-testing-source. Все эти репозитарии откючены в конфиге и включать их нет необходимости потому что пакеты из них обычным способом поставить нельзя.

Установка src.rpm осуществляется под аккаунтом пользователя и производится в каталог rpmbuild, который был подготовлен выше.

Сначала пакет нужно скачать (либо руками, либо из репозитария). В случае репозитария это делается через dnf.

$ dnf download --source xmoto

Установка зависимостей

Для сборки многим пакетам требуются заголовочые файлы или библиотеки для линковки, которые принадлежат другим пакетам. Все зависимости описываются в самом файле с исходниками и для их установки нужно только вызвать команду builddep.

$ sudo dnf builddep package.src.rpm

Установка исходников

Теперь пакет нужно поставить (не забываем, что все операции выполняются под аккаунтом текущего пользователя, а не рута).

$ rpm -ivh imagescan-3.33.0-1epson4fedora27.src.rpm

Сборка

Для сборки следует проверить, что спецификация нужного пакета появилась в каталоге ~/rpmbuild/SPECS и собрать его при помоощи rpmbuild. Сначала используем опцию -bp, которая выполнит подготовку к сборке и тем самым мы сможем убедиться (хотя бы теоретически), что тулчейн заработал и это вообще можно собрать. И тольео после того, как все прошло удачно заюзаем -ba или -bb.

$ cd ~/rpmbuild  
$ rpmbuild -bp SPECS/imagescan.spec
$ rpmbuild -bp SPECS/imagescan.spec  
ошибка: uversion undefined, define to match source archive  
ошибка: строка 2: %{!?uversion: %{error: uversion undefined, define to match source archive}}

В случае imagescan весь процесс происходит очень болезненно. Поэтому я пропущу детали поиска решения и лишь покажу процесс.

$ rpmbuild -bp --define "uversion 0.33.0" SPECS/imagescan.spec

Дополнительная опция –define позволяет определять и переопределять макросы, которые будут использоваться тулчейном.

/usr/include/gtk-2.0/gtk/gtkstatusicon.h:76:8: error: unnecessary parentheses in declaration of '__gtk_reserved1' [-Werror=parentheses]  
void (*__gtk_reserved1);  
^  
/usr/include/gtk-2.0/gtk/gtkstatusicon.h:77:8: error: unnecessary parentheses in declaration of '__gtk_reserved2' [-Werror=parentheses]  
void (*__gtk_reserved2);  
^  
cc1plus: all warnings being treated as errors  
make[2]: *** [Makefile:573: dialog.lo] Error 1  
make[2]: Leaving directory '/home/penguin/rpmbuild/BUILD/utsushi-0.33.0/gtkmm'  
make[1]: *** [Makefile:604: all-recursive] Error 1  
make[1]: Leaving directory '/home/penguin/rpmbuild/BUILD/utsushi-0.33.0'  
make: *** [Makefile:511: all] Error 2  
ошибка: Неверный код возврата из /var/tmp/rpm-tmp.hKyez0 (%build)

Таких ошибок встретится превеликое множество из-за довольно старых исходников, которые не адаптированы под свежий стандарт c++. Решением будет установка целой группы флагов через глобальную переменную CXXFLAGS.

CXXFLAGS="-fPIC -Wno-parentheses -Wno-sizeof-pointer-div" rpmbuild -bb --define "uversion 0.33.0" --define "debug_package %{nil}" SPECS/imagescan.spec

Флаг debug_package добавлен из-за того, что попытка сборки пакета debugpackage приподит к ошибке из-за отсутствия нужных определений в файле спецификации.

Установка пакета

$ sudo dnf install RPMS/x86_64/imagescan-3.33.0-1.fc28.x86_64.rpm

Литература

Теги: linux rpm

Категории: HowTo