User Tools

Site Tools


doc:appunti:linux:sa:creazione_pacchetto_deb

Creazione di un pacchetto Debian

Le note che seguono sono state prese durante la debianizzazione del pacchetto mod_auth_shadow, su un sistema Debian GNU/Linux Etch.

Installazione pacchetti necessari

Esperimenti fatti su Debian Etch. Installati i pacchetti essenziali che ci dovrebbero già essere, i compilatori necessari ed eventuali auto-tools (se il pacchetto usa lo script ./configure o simili):

  • dpkg-dev
  • file
  • gcc
  • g++
  • libc6-dev
  • make
  • patch
  • perl
  • autoconf e automake

Poi i pacchetti aggiuntivi che facilitano il compito:

  • build-essential
  • dh-make
  • debhelper
  • dpatch

Compilazione con modifiche di pacchetto già debianizzato

In una directory vuota si scompatta (o si preleva da svn) il tarball originale, si aggiusta il nome della directory in <package>-<upstreamversion> e si crea l'archivio <package>_<upstreamversion>.orig.tar.gz (notare il trattino normale nel primo caso, l'underscore nel secondo).

Quindi si aggiunge la directory con i Debian file e si esegue dpkg-buildpackage. Esempio:

mkdir qgis-build-20061104
cd qgis-build-20061104
svn co https://svn.qgis.org/repos/qgis/trunk/qgis qgis_unstable
mv qgis_unstable qgis-0.8unstable20061104
tar zcvf qgis_0.8unstable20061104.orig.tar.gz qgis-0.8unstable20061104

cd qgis-0.8unstable20061104
svn co https://svn.qgis.org/repos/qgis/trunk/debian
cd ..

echo "Change the Debian files as you need..."
dpkg-buildpackage -rfakeroot

La procedura potrebbe bloccarsi con il seguente errore:

 dpkg-source -b navit-0.5.0~svn4445+dfsg.1
dpkg-source: error: can't build with source format '3.0 (quilt)': no orig.tar file found

in tal caso si aggiunge l'opzione -b a dpkg-buildpackage in modo che non vengano creati i pacchetti sorgente, ma solo quelli con gli eseguibili (binari).

Debianizzazione ex-novo di pacchetto

Preparazione sorgenti

In una directory vuota si mette il mod_auth_shadow-2.1.tar.gz originale e lo si scompatta.

Il nome del pacchetto deve contenere solo lowercase letters, numbers, and the “-” and “+” characters. Nel caso nostro si sceglie libapache2-mod-auth-shadow perché il nome originale contiene degli underscore e non è valido (mod_auth_shadow).

Quindi al dh_make si indica il nome del pacchetto da creare e il file con l'archivio originale:

cd mod_auth_shadow-2.1/
dh_make -e niccolo@rigacci.org --packagename libapache2-mod-auth-shadow -f ../mod_auth_shadow-2.1.tar.gz

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

Maintainer name : Niccolo Rigacci
Email-Address   : niccolo@rigacci.org
Date            : Tue, 18 Oct 2005 16:52:53 +0200
Package Name    : libapache2-mod-auth-shadow
Version         : 2.1
License         : blank
Type of Package : Single
Hit <enter> to confirm:
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the libapache2-mod-auth-shadow Makefiles install into $DESTDIR and not in / .

Viene creata la sottodirectory debian/ con tutti gli script Debian e nella directory padre viene creata una copia dell'archivio originale con il nuovo nome libapache2-mod-auth-shadow_2.1.orig.tar.gz.

ATTENZIONE non eseguire nuovamente dh_make, il pacchetto viene debianizzato una sola volta.

Modifiche ai file originali

Vedere più avanti come si utilizza dpatch, per gestire queste modifiche. Ad ogni modo queste sono le modifiche fatte nel caso in esame.

makefile

Il makefile deve essere modificato in modo che installi tutto il necessario con il prefisso $(DESTDIR). Attenzione: nel nostro caso il modulo Apache veniva installato con apxs2 -i, ma questa azione non è rilocabile in una directory a piacere, quindi sono state utilizzate al suo posto opportune righe di install.

Altri file

Aggiunto il file di supporto auth_shadow.load, serve a semplificare il caricamento dei moduli Apache2 in Debian.

Usare dpatch

La pacchettizzazione Debian prevede che le differenze rispetto al tarball originale siano racchiuse in un archivio .diff separato. A volte sarebbe comodo che la debianizzazione fosse racchiusa nel tarball originale.

Per questo si può utilizzare dpatch(1), tutta la debianizzazione viene salvata nella directory debian/, basta includere questa ai sorgenti originali e il gioco è fatto.

Anzitutto si devono aggiungere alcuni target al file debian/rules (i più importanti patch e unpatch), per questo basta includere un pezzetto in debian/rules:

# Include dpatch stuff.
include /usr/share/dpatch/dpatch.make

Quindi si deve agganciare il target patch all'inizio della creazione del pacchetto, ad esempio aggiungendolo subito all'inizio del target configure:

configure: patch configure-stamp

Il target unpatch invece lo si può agganciare subito dopo al clean, rinominando questo clean-patched e aggiungendo:

clean: clean-patched unpatch
clean-patched:
        # Clean actions
        ...

Per correttezza si aggiungono i target all'elenco .PHONY:

.PHONY: build clean binary-indep binary-arch binary install configure \
        patch unpatch clean-patched

Bisogna poi creare la directory ./debian/patches/, dentro ci va messo il file 00list che è l'elenco ordinato della patch da applicare e un file per ogni patch. Per creare uno di questi file.dpatch prima lo si elenca in 00list e poi si usa il comando:

dpatch-edit-patch patch 01_debianize_makefile

Dopo aver lanciato questo comando ci si trova in una shell interattiva, si fanno tutte le modifiche che si devono fare e poi si termina con exit. All'uscita della shell, dpatch-edit-patch analizza tutte le differenze tra il prima e il dopo e crea il file .dpatch (debian/patches/01_debianize_makefile.dpatch nel nostro caso). All'uscita della shell l'intera directory dei sorgenti viene ripristinata al suo stato originale. Per abortire il dpatch-edit-patch basta fare un exit 230.

Il programma dpatch-edit-patch, prima di lanciare la shell interattiva, applica tutte le patch che precedono nell'ordine di 00list, fino alla patch stessa compresa. Questo è il motivo per cui le patch devono essere elencate in 00list prima di essere create.

Ricordarsi di aggiungere dpatch ed eventualmente fakeroot o simili come Build-Depends del pacchetto.

Comandi utili dpatch
Comando Scopo
dpatch list-all Lista tutte le patch disponibili
dpatch status <patch_name> Dice se la patch è applicata o meno
dpatch patch <patch_name> Applica la patch indicata
dpatch unpatch <patch_name> Rimuove la patch indicata

Modifiche ai file Debian

debian/control

Section web
Build-Depends debhelper (>= 4.0.0), fakeroot, dpatch, apache2-dev | apache2-prefork-dev
Depends ${shlibs:Depends}, apache2-common
Description An Apache2 module for authentication using /etc/shadow

debian/copyright

It was downloaded from http://sourceforge.net/projects/mod-auth-shadow/
Copyright Holder Brian Duggan bduggan@matatu.org
License This software may be distributed under the terms of the
GNU General Public License (GPL).
On Debian systems, the complete text of the GNU General Public
License can be found in /usr/share/common-licenses/GPL file.

debian/rules

Controllare che i target facciano cose sensate. Aggiunte tutto il necessario per dpatch (vedi sopra). Rimosse le seguenti righe (attenzione a non rimuovere i target!):

touch configure-stamp
touch build-stamp

debian/prerm

Si deve disabilitare il modulo prima del remove o purge del pacchetto.

debian/dirs

Elenco di directory che devono esistere, ma che non vengono create dal makefile. Osserva che lo slash prefisso non è incluso. Nel nostro caso:

etc/apache2/mods-available
usr/lib/apache2/modules

debian/changelog

Documentate le modifiche rispetto all'upstream, le modifiche alla pacchettizzazione Debian, ecc.

debian/README.Debian

Documentare le discrepanze tra la versione upstream e quella debianizzata.

debian/docs

Elenco dei file di documentazione originali che dovranno essere copiati in /usr/share/doc/<package-name>/.

Compilazione del pacchetto

Per creare il pacchetto .deb:

dpkg-buildpackage -rfakeroot

Con il parametro -r si indica come guadagnare i privilegi di root (se necessario) durante la fase di compilazione e installazione fittizia (nella sottodirectory debian/). La policy Debian prevede che non debbano servire i privilegi di root per questo, quindi fakeroot dovrebbe essere sufficiente per evitare errori su operazioni di chown o simili.

Tra l'altro le opeazioni chown o chmod vengono di solito annullate da debian/rules durante la fase di build, chiamando dh_fixperms(1).

Per ripulire il tutto invece:

fakeroot ./debian/rules clean

Opzioni di compilazione

Se il debian/rules è fatto per bene dovrebbe essere possibile controllare la compilazione con la variabile DEB_BUILD_OPTIONS, ad esempio per disabilitare l'ottimizzazione:

export DEB_BUILD_OPTIONS="noopt"

Per passare più opzioni (ad esempio per abilitare il debugging):

export DEB_BUILD_OPTIONS="noopt debug nostrip"

Non sempre funziona, ad esempio non funziona per GRASS, vedere le istruzioni: GRASS debugging

doc/appunti/linux/sa/creazione_pacchetto_deb.txt · Last modified: 2011/04/21 13:36 by niccolo