Le note che seguono sono state prese durante la debianizzazione del pacchetto mod_auth_shadow, su un sistema Debian GNU/Linux Etch.
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
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).
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.
Vedere più avanti come si utilizza dpatch
, per gestire queste modifiche. Ad ogni modo queste sono le modifiche fatte nel caso in esame.
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
.
Aggiunto il file di supporto auth_shadow.load
, serve a semplificare il caricamento dei moduli Apache2 in Debian.
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.
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 |
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 |
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. |
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
Si deve disabilitare il modulo prima del remove o purge del pacchetto.
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
Documentate le modifiche rispetto all'upstream, le modifiche alla pacchettizzazione Debian, ecc.
Documentare le discrepanze tra la versione upstream e quella debianizzata.
Elenco dei file di documentazione originali che dovranno essere copiati in /usr/share/doc/<package-name>/
.
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
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