пятница, 7 сентября 2018 г.

Модифицикация стороннего rpm-пакета

Шпаргалка


  1. Исходная версия модифицируемого пакета установлена.
  2. Кладём файлы (если требуется добавить файлы) в необходимые места на своей системе.
  3. Вызываем rpmrebuild -e <package-name> 
  4. В vi-редакторе модифицируем spec-файл и сохрняем (:wq)
  5. Забираем пересобранный пакет из ~/rpmbuild/RPMS/<arch>/<package>

История


Потребовалось собрать Qt5 SQL драйвер для Oracle Database в виде отдельного пакета для Oracle Linux 7. По аналогии с имеющимися в public репозитории аналогичными пакетами аналогичных драйверов для других баз данных. Для сборки были скачаны rpm-ки oracle-instantclient18.3 c оффициального сайта и требуемый драйвер был собран. Все эти рпм-ки были помещены в локальный репозиторий. Но при запуске

sudo yum  install qt5-qtbase-oci

yum ругался следующим образом:


[grin@grinol7 ~]$ sudo yum install qt5-qtbase-oci
Loaded plugins: langpacks, ulninfo
Resolving Dependencies
--> Running transaction check
---> Package qt5-qtbase-oci.x86_64 0:5.9.2-3el7 will be installed
--> Processing Dependency: libclntsh.so.18.1()(64bit) for package: qt5-qtbase-oci-5.9.2-3el7.x86_64
--> Finished Dependency Resolution
Error: Package: qt5-qtbase-oci-5.9.2-3el7.x86_64 (topaz)
           Requires: libclntsh.so.18.1()(64bit)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest


Проверка показала, что требуемая библиотека находится (как сам файл так и Provides запись к нему) в пакете oracle-instantclient18.3-basic.

[grin@grinol7 tmp]$ rpm -ql oracle-instantclient18.3-basic
/usr/lib/oracle/18.3/client64/bin/adrci
/usr/lib/oracle/18.3/client64/bin/genezi
/usr/lib/oracle/18.3/client64/lib/libclntsh.so.18.1
/usr/lib/oracle/18.3/client64/lib/libclntshcore.so.18.1
/usr/lib/oracle/18.3/client64/lib/libipc1.so
/usr/lib/oracle/18.3/client64/lib/libmql1.so
/usr/lib/oracle/18.3/client64/lib/libnnz18.so
/usr/lib/oracle/18.3/client64/lib/libocci.so.18.1
/usr/lib/oracle/18.3/client64/lib/libociei.so
/usr/lib/oracle/18.3/client64/lib/libocijdbc18.so
/usr/lib/oracle/18.3/client64/lib/libons.so
/usr/lib/oracle/18.3/client64/lib/liboramysql18.so
/usr/lib/oracle/18.3/client64/lib/network/admin/README
/usr/lib/oracle/18.3/client64/lib/ojdbc8.jar
/usr/lib/oracle/18.3/client64/lib/xstreams.jar
/usr/share/oracle/18.3/client64/doc/BASIC_README
[grin@grinol7 tmp]$ rpm -q --provides oracle-instantclient18.3-basic

libclntsh.so.18.1
oracle-instantclient18.3-basic = 18.3.0.0.0-1
oracle-instantclient18.3-basic(x86-64) = 18.3.0.0.0-1


Но если вчитаться в лог об ошибке, то qt5-qtbase-oci требует не просто libclntsh.so.18.1, а libclntsh.so.18.1()(64bit). Также видно, что oracle-instantclient18.3 в качестве "provides" дважды указывает сам себя, причём второй раз дополнительно в скобках пишет архитектуру.

oracle-instantclient18.3-basic = 18.3.0.0.0-1
oracle-instantclient18.3-basic(x86-64) = 18.3.0.0.0-1


Следовательно нужно пересобрать oracle-instantclient18.3-basic, с добавленной в spec-file "Provides" записью для libclntsh.so.18.1()(64bit).

Помимо этого можно добавить файл конфигурации для ld (например в моём случае /etc/ld.so.conf.d/oracle-instantclient18.3.conf).

Редактировать (пересобирать новую rpm) будем через утилиту rpmrebuild.
Предварительно создадим файл в своей файловой системе /etc/ld.so.conf.d/oracle-instantclient18.3.conf, в который запишем путь к библиотекам oracle

/usr/lib/oracle/18.3/client64/lib

Напоминаю,  что в моём случае oracle-instantclient18.3-basic уже был установлен. Далее выполняем команду

rpmrebuild -e oracle-instantclient18.3-basic

После этого в терминале откроется vi редактор spec-файла для нового пакета.

В моём случае необходимо было добавить строку 

Provides:      libclntsh.so.18.1()(64bit)
 

и строку

%attr(0644, root, root) "/etc/ld.so.conf.d/oracle-instantclient-18.3.conf"

в соответствующие им места spec-файла.
После этого закрываем редактор с сохранением изменений (:wq).
Возвращаемся в терминал, где на запрос rmprebuild

Do you want to continue ? (y/N) 

отвечаем утвердительно.

В моём случае новый пакет  был собран в течении секунд 20-ти (т.е. не сразу - у кого-то быстрее, у кого-то дольше). Если ошибок не пишет - то значит всё ок, просто работает. В конце rpmbuild уведомляет что пакет создан и указывает где:

result: /home/grin/rpmbuild/RPMS/x86_64/oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm
Дальше я положил пакет  в свой локальный репозиторий (выполнил createrepo на сервере где расположен репозитори) и переустановил его

sudo yum clean expire-cache
sudo yum reinstall oracle-instantclient18.3-basic

После этого qt5-qtbase-oci успешно установился.