3 votes

rpmbuild sur CentOS 6.3 64-bit - dépendances brisées

J'essaie de construire un paquet en utilisant rpmbuild sur un serveur CentOS 6.3 64 bits.

Voici le spec archivo:

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

Lorsque j'essaie d'installer le paquet sur un autre serveur CentOS 6.3 64 bits, j'obtiens les erreurs suivantes :

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

Bien que le RPM ait été construit en 64 bits, il nécessite des paquets 32 bits, par exemple pour le programme glibc j'ai installé le paquet 64 bits, mais les dépendances du RPM requièrent 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

Après avoir joué avec le fichier spec pendant un certain temps, j'ai remarqué que si je supprime l'élément %files du fichier de spécification, alors aucune exigence n'est nécessaire.

Comment puis-je réparer cela ? Qu'est-ce que je fais mal ?

Pourquoi le RPM ajoute-t-il automatiquement les exigences ? Puis-je le contrôler d'une manière ou d'une autre ?

2voto

David Points 344

Vous mettez des binaires 32 bits dans un paquetage 64 bits. Ne faites pas cela. Construisez avec un --target de i386 à la place.

2voto

Frank M Points 296

Le problème :

Après avoir lu la réponse d'Ignacio Vazquez-Abrams, j'ai réalisé que rpmbuild génère une liste d'exigences automatique. Ensuite, après une ou deux recherches, j'ai trouvé la réponse suivante Dépendances automatiques page, qui dit :

Lorsqu'un paquet est construit par RPM, si un fichier de la liste %files du paquet est une bibliothèque partagée, le soname de la bibliothèque est automatiquement ajouté à la liste des capacités fournies par le paquet. Le soname est le nom utilisé pour déterminer la compatibilité entre les différentes versions d'une bibliothèque.

...

RPM fait cela en exécutant ldd sur chaque programme exécutable dans la liste %files d'un paquet. Puisque ldd fournit une liste des bibliothèques partagées dont chaque programme a besoin, les deux moitiés de l'équation sont complètes - c'est-à-dire que les paquets qui rendent les bibliothèques partagées disponibles, et les paquets qui ont besoin de ces bibliothèques partagées, sont suivis par RPM. RPM peut alors prendre en compte ces informations lorsque les paquets sont installés, mis à jour ou effacés.

La solution :

En bas de la page, il est écrit :

Il peut arriver que le traitement automatique des dépendances par RPM ne soit pas souhaité. Dans ces cas, la balise autoreqprov peut être utilisée pour le désactiver. Cette balise prend une valeur oui/non ou 0/1. Par exemple, pour désactiver le traitement automatique des dépendances, la ligne suivante peut être utilisée :

AutoReqProv : non

J'ai donc ajouté le AutoReqProv: no à mon fichier spec (après le Provides ), et toutes les mauvaises dépendances ont disparu !

Attention :

Comme l'a écrit Ignacio Vazquez-Abrams, c'est normalement une mauvaise solution. Normalement, vous voudriez vous débarrasser de tous les binaires 32 bits et ne laisser que les binaires 64 bits. Ma solution fonctionne pour moi puisque je construis un RPM basé sur le code de quelqu'un d'autre, et je ne veux pas commencer à trier ses fichiers. D'un autre côté, je sais de quelles dépendances mon RPM a besoin, et je peux les écrire moi-même. Si c'est le cas pour vous - utilisez la fonction AutoReqProv: no drapeau. Sinon, suivez le très bon conseil d'Ignacio et débarrassez-vous du code 32 bits.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X