Назад | Перейти на главную страницу

rpmbuild на 64-разрядной версии CentOS 6.3 - сломанные зависимости

Я пытаюсь создать пакет с помощью rpmbuild на 64-битном сервере CentOS 6.3.

Здесь spec файл:

Name:           test-fms
Version:        1.0
Release:        1%{?dist}
Summary:        my FMS Package
Group:          Applications/Internet
License:        Nobody.
URL:            http://www.bla.com


Provides: test-fms = %{version}-%{release}

%description
test FMS server.

%prep

%build

%install
mkdir -p $RPM_BUILD_ROOT
cp -r /workspace/%{name}/* $RPM_BUILD_ROOT/

%post

%clean
\rm -rf %{buildroot}

%files
%defattr(-,root,root,-)
/opt/adobe/fms

При попытке установить пакет на другой 64-битный сервер CentOS 6.3 я получаю следующие ошибки:

--> Finished Dependency Resolution
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: /usr/local/bin/perl
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: librt.so.1
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libc.so.6
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libc.so.6(GLIBC_2.0)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libc.so.6(GLIBC_2.4)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libstdc++.so.6(GLIBCXX_3.4)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libpthread.so.0(GLIBC_2.1)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libpthread.so.0(GLIBC_2.0)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libgcc_s.so.1(GCC_3.0)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libgcc_s.so.1
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libc.so.6(GLIBC_2.1)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libcurl.so.3
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libstdc++.so.6
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libstdc++.so.6(CXXABI_1.3)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libdl.so.2
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libpthread.so.0(GLIBC_2.3.2)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libpthread.so.0
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libc.so.6(GLIBC_2.1.3)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libm.so.6
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Хотя RPM был построен на 64-битной платформе, для нее требуются 32-битные пакеты, например, для glibc пакет, у меня установлен 64-битный пакет, но для зависимостей RPM требуется libc.so.6:

[root@test ~]# yum provides libc.so.6
Loaded plugins: downloadonly, fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.spd.co.il
 * extras: centos.spd.co.il
 * updates: centos.spd.co.il
updates/primary_db     | 4.6 MB     00:04     
glibc-2.12-1.80.el6.i686 : The GNU libc libraries
Repo        : base
Matched from:
Other       : libc.so.6

Поиграв со спецификацией некоторое время, я заметил, что если я удалю %files часть из файла спецификации, то никаких требований не требуется.

Как я могу это исправить? Что я делаю не так?

Почему RPM автоматически добавляет требования? могу я как-нибудь это контролировать?

Эта проблема:

Прочитав ответ Игнасио Васкеса-Абрамса, я понял, что rpmbuild генерирует автоматический список требований. Потом, после пары гулей, я нашел Автоматические зависимости страница, которая говорит:

Когда пакет создается RPM, если какой-либо файл в списке% files пакета является разделяемой библиотекой, имя библиотеки автоматически добавляется в список возможностей, которые предоставляет пакет. Soname - это имя, используемое для определения совместимости между различными версиями библиотеки.

...

RPM делает это, запуская ldd для каждой исполняемой программы в списке% files пакета. Поскольку ldd предоставляет список общих библиотек, которые требуются каждой программе, обе части уравнения завершены - то есть пакеты, которые делают общие библиотеки доступными, и пакеты, которым требуются эти общие библиотеки, отслеживаются RPM. Затем RPM может учитывать эту информацию при установке, обновлении или удалении пакетов.

Решение:

Внизу страницы написано:

Могут быть случаи, когда автоматическая обработка зависимостей RPM нежелательна. В этих случаях тег autoreqprov может использоваться для его отключения. Этот тег принимает значение да / нет или 0/1. Например, чтобы отключить автоматическую обработку зависимостей, можно использовать следующую строку:

AutoReqProv: нет

Итак, я добавил AutoReqProv: no в мой файл спецификации (после Provides) часть, и все плохие зависимости исчезли!

Предупреждение:

Как писал Игнасио Васкес-Абрамс, обычно это плохое решение. Обычно вы хотите избавиться от всех 32-битных двоичных файлов и оставить только 64-битные. Мое решение работает на меня, поскольку я создаю RPM на основе чужого кода, и я не хочу начинать сортировать его файлы. С другой стороны, я знаю, какие зависимости нужны моему rpm, и могу записать их сам. Если это ваш случай - используйте AutoReqProv: no флаг. В противном случае - воспользуйтесь очень хорошим советом Игнасио и получите риг 32-битного кода.

Вы помещаете 32-битные двоичные файлы в 64-битный пакет. Не делай этого. Строить с --target из i386 вместо.