Creare pacchetti con Debhelper

[Importante]

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
[Attenzione]

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:

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