## Creare pacchetti con Debhelper

Requisiti: I requisiti di la sezione chiamata “Pacchettizzare da zero” con l'aggiunta di debhelper e dh-make

Come creatore di pacchetti, raramente creerai pacchetti dal nulla come abbiamo fatto nella sezione precedente. Come puoi immaginare, gran parte delle procedure e delle informazioni nel file `rules`, per esempio, sono comuni ad altri pacchetti. Per rendere la creazione dei pacchetti più semplice e più efficiente, puoi usare debhelper per agevolare l'esecuzione di queste procedure. Debhelper è una seria di script Perl (con prefisso dh_) che automatizzano il processo della creazione dei pacchetti. Con questi script, creare un pacchetto Debian diventa piuttosto semplice.

In questo esempio, costruiremo ancora il pacchetto GNU Hello, ma questa volta confrontando il nostro lavoro con il pacchetto di Ubuntu hello-debhelper. Ancora una volta, crea una directory di lavoro:

    mkdir ~/hello-debhelper
    cd ~/hello-debhelper

Now, get the source code of GNU Hello from GNU Project's website:

    wget http://ftp.gnu.org/gnu/hello/hello-2.1.1.tar.gz

Quindi, scarica il pacchetto sorgente di Ubuntu:

    mkdir ubuntu
    cd ubuntu
    apt-get source hello-debhelper
    cd ..

Come nell'esempio precedente, la prima cosa da fare è scompattare l'archivio sorgente originale (upstream).

    tar -xzvf hello-2.1.1.tar.gz

Instead of copying the upstream tarball to `hello_2.1.1.orig.tar.gz`, as we did in the previous example, we will let dh_make do the work for us. It will also create a template of the debian/ directory.

The only thing you have to do is rename the source folder, so it is in the form of <packagename>-<version> where packagename is lowercase. In this case, we want to name the package hello-debhelper. So, we rename the directory:

    mv hello-2.1.1 hello-debhelper-2.1.1

Now, from the package's directory, run dh_make:

    cd hello-debhelper-2.1.1
    dh_make -e your.maintainer@address -f ../hello-2.1.1.tar.gz

dh_make will then ask you a series of questions about your package:

    Type of package: single binary, multiple binary, library, kernel module or cdbs?
    [s/m/l/k/b] s

    Maintainer name : Captain Packager
    Email-Address   : packager@coolness.com
    Date            : Thu,  6 Apr 2006 10:07:19 -0700
    Package Name    : hello
    Version         : 2.1.1
    License         : blank
    Type of Package : Single
    Hit <enter> to confirm: Invio

Esegui dh_make -e solo una volta. Se lo esegui nuovamente dopo la prima volta, non funzionerà correttamente. Se vuoi cambiarlo o hai commesso un errore, cancella la directory dei sorgenti e scompatta l'archivio nuovamente. Quindi entra nella directory dei sorgenti e riprova.

Lanciare dh_make -e effettua due operazioni:

1. Crea il file `hello_2.1.1.orig.tar.gz` nella directory superiore,

2. Crea i file base necessari in `debian/` e parecchi file modello (.ex) che possono essere utili.

Il programma Hello non è molto complesso e, come abbiamo potuto vedere in la sezione chiamata “Pacchettizzare da zero”, crearne un pacchetto non necessita di molto altro se non i file basilari. Quindi, rimuoviamo i file `.ex`:

    cd debian
    rm *.ex *.EX

For hello, you will also not need some of the files into the `debian` directory:

- `README.Debian`: the README file for specific Debian issues, not the program's README.

- `dirs`: Used by dh_installdirs to create needed directories.

- `docs`: Used by dh_installdocs to install program documentation.

- `info`: Used by dh_installinfo to install the info file.

Keep in mind that for most packages, these files are required. For more information on them, see la sezione chiamata “File esempio di dh_make”.

A questo punto, dovresti avere solo i file `changelog`, `compat`, `control`, `copyright`, and `rules` nella directory `debian`. Da la sezione chiamata “Pacchettizzare da zero”, l'unico file nuovo è `compat`, un file che contiene la versione di debhelper da usare (in this case 4).

Dovrai modificare il `changelog` leggermente in questo caso per mostrare che questo pacchetto è chiamato hello-debhelper invece che hello:

    hello-debhelper (2.1.1-1) edgy; urgency=low

      * Revisione iniziale

      -- Captain Packager <packager@coolness.com>  Thu,  6 Apr 2006 10:07:19 -0700

Usando debhelper, l'unica cosa da modificare in `control` sono il nome (sostituendo hello con hello-debhelper) e aggiungendo debhelper (>= 4.0.0) al campo Build-Depends relativo al pacchetto sorgente. Il pacchetto per Ubuntu di hello-debhelper assomiglia a:

    Source: hello-debhelper
    Section: devel
    Priority: extra
    Maintainer: Capitan Packager <packager@coolness.com>
    Standards-Version: 3.6.1
    Build-Depends: debhelper (>= 4)

    Package: hello-debhelper
    Architecture: any
    Depends: ${shlibs:Depends}
    Conflicts: hello
    Provides: hello
    Replaces: hello
    Description: The classic greeting, and a good example
     The GNU hello program produces a familiar, friendly greeting.  It
     allows non-programmers to use a classic computer science tool which
     would otherwise be unavailable to them.
     .
     Seriously, though: this is an example of how to do a Debian package.
     It is the Debian version of the GNU Project's `hello world' program
     (which is itself an example for the GNU Project).
     .
     This is the same as the hello package, except it uses debhelper to
     make the deb.  Please see debhelper as to what it is.

Possiamo copiare il file `copyright` e gli script `postinst` e `prerm` dal pacchetto per Ubuntu hello-debhelper dato che non sono stati modificati rispetto a la sezione chiamata “Pacchettizzare da zero”. Copiamo anche il file `rules` in modo da poterlo analizzare.

    cp ../../ubuntu/hello-debhelper-2.1.1/debian/copyright .
    cp ../../ubuntu/hello-debhelper-2.1.1/debian/postinst .
    cp ../../ubuntu/hello-debhelper-2.1.1/debian/prerm .
    cp ../../ubuntu/hello-debhelper-2.1.1/debian/rules .

L'ultimo file che dobbiamo analizzare è `rules`, dove la potenza dello script debhelper può essere messa in rilievo. La versione debhelper di `rules` è leggermente più piccola (54 linee contro le 72 nella versione da la sezione chiamata “rules”).

La versione di debhelper assomiglia a:

     #!/usr/bin/make -f

    package = hello-debhelper

    CC = gcc
    CFLAGS = -g -Wall

    ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
      CFLAGS += -O2
    endif

    #export DH_VERBOSE=1

    clean:
            dh_testdir
            dh_clean
            rm -f build
            -$(MAKE) -i distclean

    install: build
            dh_clean
            dh_installdirs
            $(MAKE) prefix=$(CURDIR)/debian/$(package)/usr \
                    mandir=$(CURDIR)/debian/$(package)/usr/share/man \
                    infodir=$(CURDIR)/debian/$(package)/usr/share/info \
                    install

    build:
            ./configure --prefix=/usr
            $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)"
            touch build

    binary-indep: install
    # Non ci sono file dipendenti da una specifica architettura da
    # caricare generati da questo pacchetto. Se ce ne fossero stati,
    # sarebbero dovuti essere inclusi qui.

    binary-arch: install
            dh_testdir -a
            dh_testroot -a
            dh_installdocs -a NEWS
            dh_installchangelogs -a ChangeLog
            dh_strip -a
            dh_compress -a
            dh_fixperms -a
            dh_installdeb -a
            dh_shlibdeps -a
            dh_gencontrol -a
            dh_md5sums -a
            dh_builddeb -a

    binary: binary-indep binary-arch

    .PHONY: binary binary-arch binary-indep clean checkroot

Osserva che le procedure quali controllare se sei nella giusta directory(dh_testdir), accertarsi che tu stia creando il pacchetto con i privilegi di root (dh_testroot), installare la documentazione (dh_installdocs e dh_installchangelogs), e fare pulizia dopo la creazione (dh_clean) sono gestite automaticamente. Parecchi pacchetti molto più complicati di hello hanno file `rules` non più grandi dato che gli script di debhelper gestiscono la maggior parte delle procedure. Per una lista completa degli script di debhelper, si veda la sezione chiamata “Elenco degli script debhelper”. Inoltre sono molto ben documentati nelle rispettive pagine man. E' un utile esercizio leggere le pagine di manuale (sono scritte molto bene e non sono lunghe) per ogni script usato nel file `rules` precedente.

### Creare il pacchetto sorgente

Ora che abbiamo analizzato i file nella directory `debian` per hello-debhelper, possiamo costruire i pacchetti sorgenti (and binari). Per prima cosa, entriamo nella directory dei sorgenti:

    cd ..

Ora costruiamo il pacchetto sorgente usando debuild, un script interprete per dpkg-buildpackage:

    debuild -S

il pacchetto binario, usando pbuilder:

    sudo pbuilder build ../*.dsc

infine controllare il pacchetto sorgene per errori frequenti usando lintian:

    cd ..
    lintian -i *.dsc

Pacchettizzare da zero |  | Creazione dei pacchetti con CDBS