Tout d'abord, ton paquet devrait installer les librairies partagés sous
leurs noms normaux. Par exemple, le paquet libgdbm1
devrait
installer libgdbm.so.1.7.3
comme
/usr/lib/libgdbm.so.1.7.3
. Les fichiers ne devraient pas être
renommés ou liés par les scripts prerm et postrm; dpkg
s'occupera
de renommer les choses doucement sans troubler les programmes exécutés
et essayer d'interférer avec lui mène aux problèmes.
Ensuite, ton paquet doit inclure le lien symbolique que ldconfig
doit créer pour les librairies partagées. Par exemple, le paquet
libgdbm1
doit inclure un lien symbolique de
/usr/lib/libgdbm.so.1.7.3
vers libgdbm.so.1.7.3
. Ceci est
nécessaire pour que ld.so
trouve la librairie pendant que
dpkg
l'installe et ldconfig
est exécuté dans le script
postinst
. De plus, et c'est important, la librairie doit
être placée avant le lien qui pointe sur elle dans le fichier
.deb
. C'est afin que le temps que dpkg
installe le lien
symbolique (en écrasant le lien précédent pointant sur une version plus
ancienne de la librairie), la nouvelle librairie soit déjà en place.
Pour l'instant, la seule façon d'assurer que l'ordre est respecté est
d'installer la librairie dans le répertoire debian/tmp/.../lib
approprié avant de créer le lien symbolique, en mettant les commandes
dans debian/rules
dans l'ordre approprié.
Troisièmement, le paquet de développement devrait contenir un lien
symbolique pour la librairie partagée sans un numéro de version. Par
exemple, le paquet libgdbm1-dev
devrait inclure un lien
symbolique de /usr/lib/libgdbm.so
vers libgdbm.so.1.7.3
.
Ce lien symbolique est nécessaire pour ld
quand il compile les
paquets, il cherchera seulement libgdbm.so
et libgdbm.a
pour compiler dynamiquement ou statiquement, respectivement.
Si tu fait ce qu'il y a au dessus, ton paquet n'a pas besoin d'appeler
ldconfig
dans ses scripts de maintenance. C'est spécialement
important de ne pas appeler ldconfig
dans les scripts postrm ou
preinst dans le cas où le paquet est mis à jour
voir Détails des phases d'installation et de mise à jour, section 6.3),
étant donné que ldconfig
verra les noms temporaires que dpkg
utilise pour
les fichiers pendant leur installation et fera les liens des librairies
partagées pointer sur eux, juste avant que dpkg
continue
l'installation et enlève les liens !!!
shlibs
dpkg-shlibdeps
et est nécessaire quand
ton paquet fourni des librairies partagées.Chaque ligne est de la forme:
nom-librairie version-ou-ainsinommé dépendances ...nom-librairie est le nom de la librairie partagée, par exemple
libc5
.
version-ou-ainsinommé est le nom de la librairie - c'est à dire
la chose qui doit coller exactement pour que la librairie soit reconnue
par ld.so
. Généralement, c'est le numéro majeur de la version de
la librairie.
dépendances a la même syntaxe que le champ dépendance dans le fichier de contrôle des paquets binaires. Il devrait donner les détails sur quels paquets sont nécessaires pour satisfaire une construction binaire par rapport à la version de librairie contenue dans le paquet. Voir La syntaxe des champs de relations, section 8.1.
Par exemple, si le paquet foo
contient libfoo.so.1.2.3
ou
le nom de la librairie est libfoo.so.1
, et la première version du
paquet qui contient les numéros mineurs d'au moins 2.3
était
1.2.3-1, alors le shlibs du paquet peut dire:
libfoo 1 foo (>= 1.2.3-1)La dépendance de version spécifique est d'éviter les avertissements de
ld.so
sur l'utilisation des anciennes librairies partagées avec
des nouveaux binaires.
shlibs
shlibs
?
debian/shlibs
fournit une façon de vérifier les
dépendances des librairies partagées des paquets binaires.
Ils sont utilisés par les mainteneurs de paquet pour rendre leur vie
plus facile.
Les autres fichiers shlibs
qui existent sur un système Debian
sont:
/etc/dpkg/shlibs.default
/etc/dpkg/shlibs.override
/var/lib/dpkg/info/*.shlibs
debian/shlibs.local
dpkg-shlibdeps
à la création d'un
paquet binaire.
dpkg-shlibdeps
?
dpkg-shlibdeps
appelle ldd
pour déterminer les librairies
partagées utilisées par les binaires compilés passés en paramètre sur sa
ligne de commande.
Pour chaque librairie partagée, dpkg-shlibdeps
a besoin de savoir
debian/shlibs.local
/etc/dpkg/shlibs.override
/var/lib/dpkg/info/*.shlibs
/etc/dpkg/shlibs.default
shlibs
?
/etc/dpkg/shlibs.default
- le mainteneur de dpkg/var/lib/dpkg/info/
paquet.shlibs
- le
mainteneur de chaque paquet/etc/dpkg/shlibs.override
- l'administrateur système localdebian/shlibs.local
- le mainteneur du paquetshlibs.default
est géré par dpkg
. Les
entrées dans shlibs.default
qui sont fournies par dpkg
,
sont juste là pour fixer les choses le temps que les paquets de
librairie partagée ont toutes leurs fichiers shlibs
.
dpkg-shlibdeps
et les fichiers shlibs
?
dpkg-shlibs
dans ton fichier
debian/rules
. Si ton paquet contient seulement des binaires
(aucun scripts) utilise:
dpkg-shlibdeps debian/tmp/usr/{bin,sbin}/*Si
dpkg-shlibdeps
ne se plaint pas, c'est bon. Sinon, tu dois
créer ton propre fichier debian/shlibs.local
.
debian/shlibs
et laisse debian/rules
l'installer dans la zone de contrôle:
install -m644 debian/shlibs debian/tmp/DEBIANSi ton paquet contient des binaires supplémentaires voir ci-dessus.
debian/shlibs.local
?
/var/lib/dpkg/*.shlibs
.
Supposons que tu crées un paquet binaire foo
. Ta sortie doit
ressembler à cela pendant la construction du paquet.
$ ldd foo libbar.so.1 => /usr/X11R6/lib/libbar.so.1.0 libc.so.5 => /lib/libc.so.5.2.18 libX11.so.6 => /usr/X11R6/lib/libX11.so.6.0Et quand tu exécutes
dpkg-shlibdeps
$ dpkg-shlibdeps -o foo dpkg-shlibdeps: warning unable to find dependency information for shared library libbar (soname 1, path /usr/X11R6/lib/libbar.so.1.0, dependency field Depends) shlibs:Depends=elf-x11r6lib, libc5 (>= 5.2.18)Le binaire
foo
dépend de la librairie partagée libbar
,
mais aucun paquet ne semblent fournir un fichier *.shlibs
dans
/var/lib/dpkg/info/
. Déterminons le paquet responsable:
$ dpkg -S /usr/X11R6/lib/libbar.so.1.0 bar1: /usr/X11R6/lib/libbar.so.1.0 $ dpkg -s bar1 | grep Version Version: 1.0-1Ce qui nous indique que le paquet
bar1
, version 1.0-1 est celui
qu'on utilise. Maintenant nous pouvons créer notre propre
debian/shlibs.local
pour fixer temporairement, les problèmes ci-
dessus. Inclus la ligne suivante dans ton fichier
debian/shlibs.local
.
libbar1 bar1 (>= 1.0-1)Maintenant ton paquet construit doit fonctionner. Dès que le mainteneur de
libbar1
fournir un fichier shlibs
, tu peux enlever ton
fichier debian/shlibs.local
.