Я пытаюсь создать пакет с помощью 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
вместо.