Apèndix A. Tècniques avançades

Sumari

A.1. Biblioteques compartides.
A.2. Gestionant debian/nom_del_paquet.symbols
A.3. Multi-arquitectura
A.4. Construint un paquet de biblioteca compartit
A.5. Paquet nadiu Debian

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 libnom_biblioteca.so.1: objdump -p libnom_biblioteca.so.1 | grep SONAME [89]

  • 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 /usr/bin/foo | grep NEEDED [90]

  • libnom_biblioteca1: el paquet de biblioteca de la biblioteca compartida libnom_biblioteca.so.1 amb la versió ABI del nom lògic («SONAME») 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]

  • libfoo1-dbg: el paquet de símbols de depuració que conté els símbols de depuració del paquet de la biblioteca compartida libfoo1.

  • libnom_biblioteca-dev: el paquet de desenvolupament amb els fitxers de capçalera i d'altres de la biblioteca compartida libnom_biblioteca.so.1.[93]

  • 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/nom_del_paquet.symbols 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:

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:

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]

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 libnom_biblioteca-1.tar.gz

  • el codi font d'una ordre bar-1.tar.gz escrit en un llenguatge compilat

  • el codi font d'una ordre baz-1.tar.gz escrit en un llenguatge 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:

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 libnom_biblioteca.so.1 | grep SONAME

[90] Alternativament: readelf -d libnom_biblioteca.so.1 | grep NEEDED

[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/.