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"
Подготавливаем окружение
$ 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
Литература
-
[Re: Disabling warning: suggest parentheses around && within ](https://gcc.gnu.org/ml/gcc-help/2009-05/msg00118.html) - Passing conditional parameters into a rpm build
- Manually Prepare the RPM Building Environment
- How do I install a src rpm with dnf?
- Установка софта из “сырых” RPM
- 3.8 Options to Request or Suppress Warnings
- rpmbuild: how to skip generation of “debuginfo” packages (without change SPEC file ; neither .rpmmacros)
Категории: HowTo