====== Creazione di un pacchetto Debian ====== * Una guida alla pacchettizazione (in italiano): [[http://www.debian.org/doc/maint-guide/ch-start.it.html]] * Strumenti per la manutenzione dei pacchetti Debian: [[http://wiki.debian.org/madduck/adoptions]] Le note che seguono sono state prese durante la debianizzazione del pacchetto [[http://sourceforge.net/sourceforge/mod-auth-shadow/|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 **%%-%%** e si crea l'archivio **%%_.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 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 //// | Dice se la patch è applicata o meno | | dpatch patch //// | Applica la patch indicata | | dpatch unpatch //// | 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 | ^ 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//**''. ===== 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: [[http://grass.osgeo.org/wiki/GRASS_Debugging#Using_gdb_on_command_line|GRASS debugging]]