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. Native Debian package

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

You may need to manually edit the packaging template files generated by the dh_make command to address topics covered in this chapter. The newer debmake command should address these topics better.

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:

It uses the triplet such as i386-linux-gnu and x86_64-linux-gnu for the install path of shared libraries. The actual triplet path is dynamically set into the $(DEB_HOST_MULTIARCH) variable using the dpkg-architecture(1) command for each binary package build. For example, the path to install multiarch libraries are changed as follows:[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ó.

If a package is maintained only for Debian or possibly only for local use, its source may contain all the debian/* files in it. There are 2 ways to package it.

You can make the upstream tarball by excluding the debian/* files and package it as the non-native Debian package as in Secció 2.1, «Pla de treball de la construcció de paquets Debian». This is the normal way which some people encourage to use.

The alternative is the workflow of the native Debian package.

  • 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

For example, if you have source files in ~/mypackage-1.0 without the debian/* files, you can create a native Debian package for it by issuing the dh_make command as follows:

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

After execution of the dpkg-buildpackage command, you will see the following files in the parent directory:

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