Sumari
Aquests són alguns consells i apunts d'aspectes avançats en la construcció de paquets que es probable que hagis de saber. Es recomana fermament llegir totes les referències suggerides aquí.
Pot ésser necessari editar manualment els fitxers de plantilla per a la construcció del paquet generats per l'ordre dh_make per seguir els detalls tractats en aquest capítol. La nova ordre debmake gestiona millor aquestes etapes de la construcció de paquets.
Abans de construir paquets de biblioteques compartides, has de llegir les següents referències bàsicques en detall:
Heus aquí alguns consells simplistes per a que pugis començar.
Les biblioteques compartides son fitxers objecte en format ELF que contenen codi compilat.
Les biblioteques compartides es distribueixen com a fitxers
*.so
(ni fitxers *.a
ni
*.la
).
Les biblioteques compartides s'utilitzen principalment per compartir codi comú entre diversos executables fent servir l'ordre ld.
Les biblioteques compartides, a vegades es fan servir per proporcionar complements («plugins») a un executable mitjançant el procediment dlopen.
Les biblioteques compartides exporten símbols que representen objectes compilats com a variables, funcions i classes, i permeten accedir-hi des dels executables enllaçats.
El SONAME (el nom lògic) de la biblioteca
compartida
lib
.nom_biblioteca
.so1
:
objdump -p
lib
[89]
nom_biblioteca
.so.1
| grep SONAME
El «SONAME» (nom lògic) d'una biblioteca compartida en general coincideix amb el nom del fitxer de la biblioteca (però no sempre).
El «SONAME» (nom lògic) de les biblioteques compartides enllaçades a
:
/usr/bin/foo
objdump -p
[90]
/usr/bin/foo
| grep
NEEDED
lib
:
el paquet de biblioteca de la biblioteca compartida
nom_biblioteca
1
lib
amb la versió ABI del nom lògic («SONAME»)
nom_biblioteca
.so.1
1
.[91]
Els guions del desenvolupador del paquet de la biblioteca han d'executar ldconfig en les circumstàncies específiques per generar els enllaços simbòlics necessaris per a «SONAME» (nom lògic).[92]
lib
:
el paquet de símbols de depuració que conté els símbols de depuració del
paquet de la biblioteca compartida foo
1
-dbglib
.
foo
1
lib
:
el paquet de desenvolupament amb els fitxers de capçalera i d'altres de la
biblioteca compartida
nom_biblioteca
-devlib
.[93]
nom_biblioteca
.so.1
En general, els paquets Debian no haurien de contenir fitxers «Libtool»
*.la
.[94]
En general, els paquets Debian no haurien de fer servir «RPATH».[95]
Encara que és una mica antiquat i és només una referència secundària, Debian Library Packaging Guide encara pot ésser útil.
Quan construeixes un paquet de biblioteca compartida, cal generar un fitxer
debian/
per gestionar la versió mínima associada a cada símbol pels canvis ABI
compatibles amb versions anteriors sota el mateix «SONAME» (nom lògic) de la
biblioteca per al mateix nom de paquet de biblioteca
compartida. [96] És recomanable que
llegeixis amb atenció les següents referències bàsiques:
nom_del_paquet
.symbols
dh_makeshlibs(1)
dpkg-gensymbols(1)
dpkg-shlibdeps(1)
deb-symbols(5)
Aquest és un exemple per generar el paquet libnom_biblioteca
per a la versió
1.3
de l'autor amb el fitxer
debian/libnom_biblioteca1.symbols
apropiat:
Prepara l'estructura de directoris Debian de les fonts fent servir el fitxer
original de l'autor libnom_biblioteca-1.3.tar.gz
Si és la primera vegada que es construeix un paquet de libnom_biblioteca1
, genera el fitxer
debian/libnom_biblioteca1.symbols
amb el contingut
buit.
Si la versió 1.2
anterior de l'autor es va empaquetar en
el paquet libnom_biblioteca1
amb el
fitxer debian/libnom_biblioteca1.symbols
apropiat en el
seu paquet font, fes-lo servir una altra vegada.
Si la versió 1.2
anterior de l'autor no s'ha empaquetat
amb el fitxer debian/libnom_biblioteca1.symbols
, genera
el fitxer symbols
a partir de tots els noms de paquets
binaris de la mateixa biblioteca compartida que tenguin el mateix «SONAME»
(nom lògic) de la biblioteca, per exemple, les versions
1.1-1
i 1.2-1
. [98]
$ dpkg-deb -x libfoo1_1.1-1.deb libfoo1_1.1-1 $ dpkg-deb -x libfoo1_1.2-1.deb libfoo1_1.2-1 $ : > symbols $ dpkg-gensymbols -v1.1 -plibfoo1 -Plibfoo1_1.1-1 -Osymbols $ dpkg-gensymbols -v1.2 -plibfoo1 -Plibfoo1_1.2-1 -Osymbols
Executa compilacions de prova dels directoris de les fonts amb eines com
debuild i pdebuild. Si es produeixen
errors degut a símbols perduts o d'altres, busca canvis ABI incompatibles
amb versions anteriors que requereixin el canvi del nom del paquet de la
biblioteca compartida a alguna cosa com libnom_biblioteca1a
i torna a començar.
$ cd libfoo-1.3 $ debuild ... dpkg-gensymbols: warning: some new symbols appeared in the symbols file: ... see diff output below --- debian/libfoo1.symbols (libfoo1_1.3-1_amd64) +++ dpkg-gensymbolsFE5gzx 2012-11-11 02:24:53.609667389 +0900 @@ -127,6 +127,7 @@ foo_get_name@Base 1.1 foo_get_longname@Base 1.2 foo_get_type@Base 1.1 + foo_get_longtype@Base 1.3-1 foo_get_symbol@Base 1.1 foo_get_rank@Base 1.1 foo_new@Base 1.1 ...
Si llegeixes el informe de canvis generat a continuació per l'ordre
dpkg-gensymbols, llista el fitxer
symbols
actualitzat adequadament per al paquet binari
generat de la biblioteca compartida. [99]
$ cd .. $ dpkg-deb -R libfoo1_1.3_amd64.deb libfoo1-tmp $ sed -e 's/1\.3-1/1\.3/' libfoo1-tmp/DEBIAN/symbols \ >libfoo-1.3/debian/libfoo1.symbols
Construir paquets per distribuir amb eines com debuild i pdebuild.
$ cd libfoo-1.3 $ debuild clean $ debuild ...
A més a més dels exemples anteriors, cal comprovar la compatibilitat ABI amb més atenció i actualitzar manualment les versions dels símbols (si és necessari). [100]
Encara que només és una referència secundària, Debian wiki UsingSymbolsFiles i els seus enllaços a altres pàgines web pot ésser d'utilitat.
La nova funció multi-arquitectura introduïda a la versió «wheezy» de Debian
integra el suport per a la instal·lació en més d'una arquitectura dels
paquets binaris (particularment a
i386
<->amd64
, però també amb
altres combinacions) en dpkg
i
apt
. És convenient que llegeixis les
següents referències detalladament:
Ubuntu wiki MultiarchSpec (original)
Debian wiki Multiarch/Implementation (estat a Debian)
S'utilitzen triplets com i386-linux-gnu
i
x86_64-linux-gnu
per als directoris d'instal·lació de les
biblioteques compartides. El triplet actual s'estableix de forma dinàmica al
valor $(DEB_HOST_MULTIARCH)
per dpkg-architecture(1) a cada compilació. Per exemple, el directori d'instal·lació
de les biblioteques multi-arquitectura es pot canviar de la següent
manera.[101]
Directori antic | directori multi-arquitectura i386 | directori multi-arquitectura amd64 |
---|---|---|
/lib/
|
/lib/i386-linux-gnu/
|
/lib/x86_64-linux-gnu/
|
/usr/lib/
|
/usr/lib/i386-linux-gnu/
|
/usr/lib/x86_64-linux-gnu/
|
A continuació tens alguns exemples típics de casos possibles de paquets per a vàries arquitectures per als següents paquets:
el codi font de la biblioteca
lib
nom_biblioteca
-1.tar.gz
el codi font d'una ordre
escrit en un
llenguatge compilat
bar
-1.tar.gz
el codi font d'una ordre
escrit en un
llenguatge interpretat
baz
-1.tar.gz
Paquet | Arquitectura | Multi-arquitectura: | Contingut del paquet |
---|---|---|---|
lib
|
any | same | la biblioteca compartida, és co-instal·lable |
lib
|
any | same | els símbols de depuració de la biblioteca compartida, són co-instal·lables |
lib
|
any | same | els fitxers de capçalera i d'altres d'un biblioteca compilada, co-instal·lable |
lib
|
any | foreign | els programes de suport en temps d'execució, no són co-instal·lables |
lib
|
all | foreign | els fitxers de documentació de la biblioteca compartida |
|
any | foreign | els fitxers del programa compilat, no són co-instal·lables |
|
all | foreign | els fitxers de documentació del programa |
|
all | foreign | els fitxers del programa interpretat |
Cal tenir en compte que el paquet de desenvolupament ha de tenir un enllaç
simbòlic a la biblioteca compartida associada sense
el número de versió. P. ex.:
/usr/lib/x86_64-linux-gnu/libfoo.so
->
libfoo.so.1
Pots construir un paquet de biblioteca Debian amb suport de multi-arquitectura activat fent servir dh(1) de la següent manera:
Actualitza debian/control
.
Afegeix Build-Depends: debhelper (>=9)
en la secció del
paquet font.
Afegeix Pre-Depends: ${misc:Pre-Depends}
per a cada
paquet binari de biblioteca compartida.
Afegeix el camp Multi-Arch:
per a cada secció de paquet
binari.
Posa debian/compat
a « 9 ».
Canvia el directori habitual /usr/lib/
al directori
multi-arquitectura /usr/lib/$(DEB_HOST_MULTIARCH)/
per a
tots els guions de la construcció del paquet.
Afegeix (primer) DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture
-qDEB_HOST_MULTIARCH)
a debian/rules
per
establir la variable DEB_HOST_MULTIARCH
Canvia /usr/lib/
per
/usr/lib/$(DEB_HOST_MULTIARCH)/
a
debian/rules
.
Si es fa servir ./configure
a l'objectiu
override_dh_auto_configure
del fitxer
debian/rules
, assegura't que ho canvies per
dh_auto_configure --
. [102]
Canvia cada repetició de /usr/lib/
per
/usr/lib/*/
als fitxers
debian/
nom_del_paquet
.install
Genera fitxers com
debian/
des de
nom_del_paquet
.linksdebian/
dinàmicament afegint un guió al objectiu
nom_del_paquet
.links.inoverride_dh_auto_configure
del fitxer
debian/rules
.
override_dh_auto_configure: dh_auto_configure sed 's/@DEB_HOST_MULTIARCH@/$(DEB_HOST_MULTIARCH)/g' \ debian/nom_del_paquet
.links.in > debian/nom_del_paquet
.links
Comprova que el paquet de biblioteca compartida conté només els fitxers que s'esperava i que el paquet «-dev» continua funcionant correctament.
Tots els fitxers instal·lats al mateix temps com el paquet de multi-arquitectura en el mateix directori ha de tenir exactament el mateix contingut de fitxer. Posa molta atenció en les diferències generades per l'ordre dels bits de dades i per l'algoritme de compressió.
Si el paquet es construeix només per a Debian o fins i tot només per fer-ho
servir en local, les seves fonts poden incloure tots els fitxers de
debian/*
. Hi ha dos mètodes per construir el paquet.
Pots fer que el fitxer tarball de l'autor excloent els fitxers de
debian/*
i construir el paquet com un paquet no natiu
Debian com s'explica a Secció 2.1, «Pla de treball de la construcció de paquets Debian». Aquest és el mètode
recomanat per moltes persones.
L'alternativa és seguir el model de treball pels paquets nadius Debian.
Genera un paquet nadiu de fonts Debian en el format 3.0
(native)
fent servir un únic arxiu comprimit en format «tar»
afegint tots els arxius.
nom_del_paquet
_versió
.tar.gz
nom_del_paquet
_versió
.dsc
Construcció de paquets binaris Debian des de paquets de fonts Debian nadius.
nom_del_paquet
_versió
_arquitectura
.deb
Per exemple, si els fitxers font estan a
~/el_meu_paquet-1.0
sense els fitxers
debian/*
, pots construir un paquet nadiu Debian per a
ells fent servir l'ordre dh_make de la següent manera.
$ cd ~/el_meu_paquet-1.0 $ dh_make --native
Llavors el directori debian
i el seu contingut es
genera igual que a Secció 2.8, «Paquet Debian no nadiu inicial.». No es genera un
arxiu «tarball» degut a que es tracta d'un arxiu nadiu Debian. Però aquesta
és l'única diferència. La resta de les etapes de construcció del paquet són
pràcticament iguals.
Després d'executar l'ordre dpkg-buildpackage, veuràs els següents fitxers en el directori superior:
el_meu_paquet_1.0.tar.gz
Aquest és el «tarball» del codi font generat a partir del directori
el_meu_paquet-1.0
per l'ordre
dpkg-source (el seu sufix no és
orig.tar.gz
).
el_meu_paquet_1.0.dsc
Aquest és el resum del contingut del codi font dels paquets no nadius Debian (no te la revisió Debian).
el_meu_paquet_1.0_i386.deb
Aquest és el paquet binari complet en el cas dels paquets no nadius Debian (no hi ha la revisió Debian)..
el_meu_paquet_1.0_i386.changes
Aquest arxiu descriu els canvis realitzats en la versió actual del paquet de la mateixa forma que en els paquets Debian no nadius (no hi ha el codi de revisió Debian).
[89]
Alternativament: readelf -d
lib
nom_biblioteca
.so.1
| grep SONAME
[90]
Alternativament: readelf -d
lib
nom_biblioteca
.so.1
| grep NEEDED
[92] Consulta Debian Policy Manual, 8.1.1 "ldconfig".
[93] Consulta Debian Policy Manual, 8.3 "Static libraries" i Debian Policy Manual, 8.4 "Development files".
[94] Consulta Debian wiki ReleaseGoals/LAFileRemoval.
[95] Consulta Debian wiki RpathIssue.
[96] Els canvis ABI incompatibles amb versions anteriors, normalment requereixen l'actualització del «SONAME» (nom lògic) de la biblioteca i del paquet de la biblioteca compartida a d'altres nous.
[97] Per a biblioteques C++ i altres casos pels quals el maneig individual de símbols és difícil, es millor guiar-se per Debian Policy Manual, 8.6.4 "The shlibs system".
[98]
Totes les versions anteriors dels paquets Debian estan disponibles a http://snapshot.debian.org/. La revisió Debian del
paquet segueix a la versió per facilitar el manteniment de versions
anteriors («backport») del paquet: 1.1
<<
1.1-1~bpo70+1
<< 1.1-1
i
1.2
<< 1.2-1~bpo70+1
<<
1.2-1
[99]
La revisió Debian es deriva de la versió per facilitar el manteniment de
versions anteriors («backport») del paquet: 1.3
<<
1.3-1~bpo70+1
<< 1.3-1
[101] Antics directoris de biblioteques de propòsit especial com
/lib32/
i /lib64/
ja no es faran
servir més.
[102]
Alternativament, pots afegir els arguments
--libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)
and
--libexecdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)
a
./configure
. Fitxa't que --libexecdir
especifica el directori predeterminat per instal·lar programes executables
que són engegats per altres programes més que no pas pels usuaris. El valor
predeterminat per «Autotools» és /usr/libexec/
però a
Debian és /usr/lib/
.