rpmbuild no CentOS 6.3 64 bits - dependências quebradas

3

Estou tentando construir um pacote usando o rpmbuild no servidor CentOS 6.3 de 64 bits.

Aqui está o arquivo 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

Ao tentar instalar o pacote em outro servidor CentOS 6.3 de 64 bits, recebo os seguintes erros:

--> 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

Embora o RPM tenha sido criado em 64 bits, ele requer pacotes de 32 bits, por exemplo, para o pacote glibc , eu tenho o pacote de 64 bits instalado, mas as dependências do RPM exigem 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

Depois de brincar com o arquivo de especificação por algum tempo, notei que, se eu excluir a parte %files do arquivo de especificação, não serão necessários requisitos.

Como posso consertar isso? O que estou fazendo de errado?

Por que o RPM adiciona automaticamente os requisitos? posso controlá-lo de alguma forma?

    
por Kuf 25.12.2012 / 10:12

2 respostas

2

O problema:

Depois de ler a resposta de Ignacio Vazquez-Abrams, percebi que o rpmbuild está gerando uma lista de requisitos automática. Depois de uma ou duas goole, encontrei a página Dependências automáticas , isso diz:

When a package is built by RPM, if any file in the package's %files list is a shared library, the library's soname is automatically added to the list of capabilities the package provides. The soname is the name used to determine compatibility between different versions of a library.

...

RPM does this by running ldd on every executable program in a package's %files list. Since ldd provides a list of the shared libraries each program requires, both halves of the equation are complete — that is, the packages that make shared libraries available, and the packages that require those shared libraries, are tracked by RPM. RPM can then take that information into account when packages are installed, upgraded, or erased.

A solução:

Na parte inferior da página, diz:

There may be times when RPM's automatic dependency processing is not desired. In these cases, the autoreqprov tag may be used to disable it. This tag takes a yes/no or 0/1 value. For example, to disable automatic dependency processing, the following line may be used:

AutoReqProv: no

Então, adicionei o AutoReqProv: no ao meu arquivo de especificação (após a parte Provides ) e todas as dependências ruins foram eliminadas!

Aviso:

Como escreveu Ignacio Vazquez-Abrams, normalmente esta é uma solução ruim. Normalmente, você gostaria de se livrar de todos os binários de 32 bits e deixar apenas os de 64 bits. Minha solução funciona comigo desde que eu estou construindo um RPM baseado no código de outra pessoa, e eu não quero começar a classificar seus arquivos. Por outro lado, eu sei quais dependências meu rpm precisa, e eu posso escrevê-las eu mesmo. Se esse for o seu caso, use o sinalizador AutoReqProv: no . Caso contrário - leve Ignacio a bons conselhos e obtenha o código de 32 bits.

    
por 25.12.2012 / 14:27
2

Você está colocando binários de 32 bits em um pacote de 64 bits. Não faça isso. Crie com --target de i386 .

    
por 25.12.2012 / 10:29