v1.0, 12 Febbraio 2003
Questo tutorial fornisce le istruzioni per la creazione di pacchetti deb
per Debian GNU/Linux partendo da un file sorgente in formato tar.gz e le
istruzioni per la creazione di un repository di pacchetti Debian sia locale
che in rete.
Traduzione ed adattamenti in italiano a cura di
Hugh Hartmann <hhartmann[AT]libero.it>
e revisione a cura di
Kriss <chgwor[AT]tin.it>
.
Questo tutorial vi insegnerà a realizzare un pacchetto Debian (.deb) da un file sorgente tar.gz e ad impostare un repository di pacchetti Debian in modo che ognuno possa installare i vostri pacchetti (e le loro relative dipendenze) con una singola chiamata di 'apt-get install'.
Questo documento può servire come tutorial per i principianti e come promemoria per quelli che hanno già alcune esperienze con il sistema Debian GNU/Linux e con i relativi strumenti di gestione dei pacchetti deb.
Si descriverà la maniera con 'deb-make', lavorando su sistemi Debian Woody e Sid. Lo strumento deb-make rende molto facile la realizzazione di un pacchetto Debian dalla distribuzione sorgente tar.gz di un programma. Usando questa guida si può creare ed installare il primo pacchetto Debian in 60 minuti.
Questi sono i vantaggi più importanti della creazione di un pacchetto Debian:
si può installare il programma rapidamente su molte macchine con 'dpkg -i' o con 'apt-get install';
si può rimuovere il pacchetto con 'dpkg -r' o con 'dpkg --purge';
le dipendenze sono verificate prima dell'installazione con 'dpkg -i';
attraverso 'apt-get install' si scaricano e si installano tutte le dipendenze (cioè tutti i pacchetti da cui dipende un determinato pacchetto) in modo semi-automatico;
si possono distribuire i file *.deb ai propri amici che non sono ancora in grado di compilare il software da soli.
Per la creazione di un pacchetto deb sono necessari i seguenti pacchetti:
doc-debian: per la directory /usr/share/doc/debian/FAQ
debian-policy: per il file /usr/share/doc/debian-policy/policy.txt.gz (questo pacchetto sostituisce il packaging-manual)
dpkg: la versione più recente del gestore dei pacchetti debian
apt: la versione più recente dell'altro gestore dei pacchetti debian
make g++ gcc perl autoconf sed: un ambiente minimo per la compilazione
debmake: per l' eseguibile /usr/bin/deb-make
devscripts: per lo script Perl /usr/bin/dch (solo i file dch e debchange di questo pacchetto sono necessari)
fakeroot: per l'eseguibile /usr/bin/fakeroot
Per installare i pacchetti precedenti eseguire da root:
apt-get update apt-get install doc-debian debian-policy apt-get install dpkg apt apt-get install make g++ gcc perl autoconf sed apt-get install debmake devscripts fakeroot |
Usare wget(1) o il proprio gestore di download preferito per scaricare i sorgenti di un pacchetto software non-Debian. Per estrarre il file sorgente usare:
tar xzvf NOMEFILE.tar.gz (o tar xvf NOMEFILE.tar) |
Rinominare la directory del pacchetto (cioè la directory creata da tar quando estrae l'archivio) a nomepacchetto-versione. Si possono avere tanti trattini (-) nel nome del pacchetto quanti se ne desiderano, ma non devono esserci spazi o segni di sottolineatura (_). Per favore si modifichino tutte le lettere maiuscole in minuscole.
Eseguire il comando appropriato 'cvs import' se si progetta di includere questo pacchetto nel proprio repository CVS.
Prima della creazione di qualsiasi pacchetto Debian si è pregati di leggere la seguente documentazione:
leggere attentamente: 'man 1 debmake'
scorrere rapidamente: 'man 1 debstd'
leggere attentamente: /usr/share/doc/debmake/HOWTO.first_time
leggere attentamente: /usr/share/doc/debmake/README.debian
Ricordarsi la posizione della seguente documentazione per una successiva lettura:
'man 1 debstd'
/usr/share/doc/debian-policy/policy.txt.gz: Debian Packaging Manual
/usr/share/doc/debian/FAQ/index.html
Seguire la procedura usuale per la compilazione di un pacchetto UNIX, completamente scorrelata alla Debian. (il tempo di questo passaggio non è parte dei 60 minuti necessari alla creazione del primo pacchetto Debian. Questa procedura può richiedere 2 minuti o 2 giorni, dipendentemente del proprio sistema e dalla propria esperienza). Se ci si aspetta di essere uno sperimentatore in questa area, la procedura descritta qui non è cosi dettagliata.
Scorrere rapidamente i file README e INSTALL
Prima scaricare e installare tutte le dipendenze del pacchetto
Fare qualsiasi cosa presente nelle istruzioni in README o INSTALL
Eseguire './configure --help'
Eseguire './configure' con gli argomenti appropriati
Eseguire 'make'
Eseguire 'make test' o 'make check' se appropriato
Passaggio opzionale: eseguire 'make install' per testarlo, eseguire 'make uninstall' per disinstallarlo (non sempre disponibile!)
Ricordarsi delle modifiche che si sono fatte per rendere il software compilabile sul proprio sistema. Possibilmente si sottopongano queste modifiche all'autore del software.
Eseguire 'autoconf' solo se esiste un file configure.in, ma non il file configure. Eseguire anche 'automake' se esiste un file *.am. Molti utenti non necessitano di eseguire 'autoheader'.
Eseguire 'deb-make' o 'deb-make native' (se non si prevede di creare un file diff) all'interno della directory del pacchetto.
Se si vuole creare un file diff successivamente, si deve sapere che 'deb-make' crea la directory nomepacchetto-ver.sione.orig contenente i file del pacchetto originale. Sovrascrivere questa directory con il reale contenuto originale se sono state fatte delle modifiche dopo aver estratto il sorgente .tar.gz.
Creare il Makefile a meno che non esista già. Solo tre target (obiettivi) sono necessari. Di seguito vengono forniti esempi di Makefile:
Esempio di Makefile per un semplice programma in C (foo.c):
.PHONY: all install clean all: gcc -s -O2 -W -Wall foo.c -o foo # ^^^ si aggiunga -pedantic e/o -ansi se si preferisce clean: rm -f *.o foo install: cp foo $(DESTDIR)/usr/bin/foo chmod 755 $(DESTDIR)/usr/bin/foo cp -p foo.man $(DESTDIR)/usr/man/man1/foo.1 chmod 644 $(DESTDIR)/usr/man/man1/foo.1 rm -rf $(DESTDIR)/usr/share/doc/foo cp -a docs $(DESTDIR)/usr/share/doc/foo |
Esempio di Makefile per uno script Perl (foo.pl):
.PHONY: all install clean all: @echo "Non necessario per compilare :-)" clean: ; install: grep -q '^=begin' foo.pl && pod2man foo.pl foo.1 [ -f foo.1 ] && cp -p foo.1 $(DESTDIR)/usr/man/man1/foo.1 chmod 644 $(DESTDIR)/usr/man/man1/foo.1 chmod 755 $(DESTDIR)/usr/bin/foo cp -p foo.man $(DESTDIR)/usr/man/man1/foo.1 |
Si deve installare il tutto in $(DESTDIR) e non in '/'.
Questa è la sintassi del Makefile, in questo modo i tab all'inizio della linea sono significativi. Non si deve convertire i tab in spazi o viceversa, e si preservi l'indentazione originale di ogni linea.
Se c'è un file 'Makefile.in' (e un possibile script 'configure') allora si modifichi 'Makefile.in'. Altrimenti si modifichi il 'Makefile'.
Se esiste un target 'install:', verificare che esso installi ogni cosa sotto la directory @prefix, $(prefix) o $(DESTDIR). Se non esiste, aggiungere $(DESTDIR) prima di ogni nome di file e di directory del target.
Impostare la variabile CFLAGS (che contiene flag aggiuntivi per il compilatore C gcc) in maniera adeguata alle proprie necessità. Esempi:
CFLAGS = -s -O2 -W -Wall CLAGSS = -g -W -Wall CFLAGS = -s -O2 -W -Wall -ansi -pedantic CFLAGS = -s -O2 -W -Wall -ansi -pedantic -Wstrict-prototypes -Wtraditional -Wnested-externs -Winline -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wmissing-prototypes -Wmissing-declarations -Wunused |
Anche il file debian/rules ha la sintassi come il Makefile, così i tab all'inizio della linea risultano significativi. Quindi, non si devono convertire i tab in spazi e viceversa e si deve preservare l'indentazione originale di ogni linea.
Modificare la linea contenente '$(MAKE) install' nel modo seguente:
(indentazione con un singolo carattere tab all'inizio) $(MAKE) install prefix=`pwd`/debian/tmp/usr DESTDIR=`pwd`/debian/tmp |
Se c'è una riga breve dopo 'build:' contenente './configure' aggiungere le opzioni appropriate per lo script 'configure'. La maggior parte delle volte non è necessaria alcuna opzione (eccetto per --prefix=usr). Per favore consultare il file README del pacchetto e/o './configure --help' per le opzioni addizionali.
Aggiornare la linea contenente '$(MAKE) CFLAGS=' a $(MAKE) se non si vuole che debian/rules sovrascriva il CFLAGS che si è impostato nel Makefile o nel Makefile.in.
Aggiungere le righe seguenti alla sezione 'clean:'
-rm -f core DEADJOE a.out -rm -f config.status config.cache config.h -rm -rf autom4te.cache |
Aggiungere le seguenti righe:
.PHONY: source source: clean DIR="`pwd`";DIR="$${DIR##*/}"; cd .. && dpkg-source -b "$$DIR" |
Aggiungere/modificare le seguenti voci nella prima sezione (Source:):
Maintainer: mettere il proprio nome e indirizzo e-mail appropriato
Build-Depends: elencare tutti i pacchetti Debian richiesti per la costruzione di questo pacchetto. Includere sempre il pacchetto 'debmake'
Esempi:
Build-Depends: debmake, gcc, make, sed, bash Build-Depends: debmake, g++, perl, wget | wget-ssl, libz-dev |
Aggiungere/modificare le seguenti voci nella seconda sezione (Binary:):
Depends: rimuovere '${shlibs:Depends}' a meno che non si compilino programmi (e si creino binari ELF). Aggiungere una virgola a ogni dipendenza (eccetto per le librerie necessarie per i binari ELF)
Esempi:
Depends: mtools, bash, grub, sed Depends: ${shlibs:Depends}, apache (>= 1.1) | apache-ssl |
Recommends: consigli di pacchetti importanti (necessario per molti utenti)
Suggests: suggerimento di pacchetti meno importanti (altri pacchetti che accrescono la funzionalità di questo pacchetto)
Replaces: pacchetti che hanno uno o più file che questo pacchetto sostituisce
Description: una singola linea di descrizione di questo pacchetto. Aggiungere una (ulteriore) descrizione di più righe dopo questa, indentata con uno spazio
Esempio:
Description: convert raster images to EPS and PDF and others sam2p is a UNIX command line utility written in ANSI C++ that converts many raster (bitmap) image formats into Adobe PostScript or PDF files. The images are not vectorized. sam2p gives full control to the user to specify standards-compliance, compression, and bit depths. In some cases sam2p can compress an image 100 times smaller than the PostScript output of many other common image converters. sam2p provides ZIP, RLE and LZW (de)compression filters even on Level1 devices. . Questo è il secondo paragrafo. |
Per il formato delle voci 'Depends:' e 'Build-Depends' si consulti il Debian Packaging Manual (descritto nella sezione "Leggere la documentazione relativa alla creazione di un pacchetto Debian".
Consultare /var/lib/dpkg/status per diversi esempi di 'Depends' etc.
Non è necessario fornire una voce per 'Version:', deb-make la estrarrà dal file debian/changelog.
Aggiungere tutte le directory necessarie, ma non quelle create dal target 'install:' nel Makefile o nel Makefile.in.
Esempio:
usr/bin
usr/sbin
usr/share/man/man1
Modificare la riga contenente il numero di versione, aggiungere una versione relativa alla costruzione del pacchetto.
Esempio:
vecchia riga: sam2p (0.43) unstable; urgency=low nuova riga: sam2p (0.43-1) unstable; urgency=low |
Nella maggioranza dei casi tutti gli altri file sono a posto. I file debian/*.ex contengono degli esempi. Se è necessaria la loro funzionalità, rinominarli senza l'estensione .ex (example) e modificarli in modo appropriato.
Assicurarsi che la propria variabile d'ambiente EDITOR sia impostata correttamente. Le impostazioni più comuni sono:
export EDITOR=vi export EDITOR=emacs export EDITOR=joe export EDITOR=mcedit export EDITOR=nano export EDITOR=nano-tiny |
Opzionalmente, aggiungere una di queste impostazioni di editor al proprio ~/.bashrc e al ~/.bash_profile.
Eseguire 'dch -i' per aggiungere la documentazione per la nuova versione del pacchetto appena creato. Si avvierà il proprio editor, e si posizionerà il cursore alla linea che inizia con un ' * '. Aggiungere qui la documentazione appropriata.
Esempio:
sam2p (0.43-2) unstable; urgency=low * Added proper Description:, Depends: and Build-Depends: to debian/changelog, modified the Makefile to respect $(DESTDIR) etc. -- Szabó Péter <pts@winter> Fri, 7 Feb 2003 14:11:17 +0100 sam2p (0.43-1) unstable; urgency=low * Initial Debian release. -- Szabó Péter <pts@winter> Fri, 7 Feb 2003 14:04:44 +0100 Local variables: mode: debian-changelog End: |
Assicurarsi che l'informazione della versione ('0.43-2' nell'esempio) sia corretta, dev'essere maggiore di quella della precedente esecuzione di 'debian/rules binary'.
Si può omettere la documentazione se si ha una fretta notevole ma si devono sempre verificare i numeri della versione. Mai salvare un file non conforme alla sintassi, perché questo impedirà di costruirsi altri binari. Se non si è sicuri, prima fare un backup, o guardare i vari file /usr/share/doc/*/changelog.gz.
Usare dch -a per aggiungere altri cambiamenti documentati (una voce extra che inizia con ' * ') all'attuale versione del pacchetto costruito.
Eseguire debian/rules build per costruire i binari. Questo (processo) può richiedere diverso tempo. Eseguirà il configure ogni volta che è richiamato. Questa è un'operazione normale.
Se ci sono messaggi di errore, fissare gli errori, rimuovere il file 'build', possibilmente eseguendo 'debian/rules clean' e ripetere ancora questo passaggio.
Eseguire 'debian/rules source' per costruire i file sorgente .tar.gz e .dsc. Questo passaggio è opzionale. È generalmente giudizioso creare questi archivi sorgenti, perché possono essere caricati dentro un repository di pacchetti Debian, e così gli altri utenti saranno capaci di ricompilare il pacchetto appena rilasciato con il comando:
apt-get -b source nomepacchetto |
Vedere i repository dei pacchetti Debian successivamente in questo tutorial.
Verificare che la versione costruita sia corretta e nella parte più alta del file debian/changelog.
Eseguire:
rm -f *~ fakeroot debian/rules build |
Se esiste un file 'files' (non 'debian/files') contenente i nomi dei file importanti, aggiungere a questo tutti i file 'debian/*', eccetto per debian/files* e debian/substvars -- ma prima si dovrebbe eseguire debian/rules clean.
Eseguire cvs add debian/* per includere questi file nel CVS (se applicabile).
Questo passaggio è opzionale. Eseguire qualcosa come:
debian/rules clean (cd ..; diff -ru nomepacchetto-ver.sione{.orig,} >nomepacchetto-ver.sione.patch) |
Installare il pacchetto con dpkg -i. Si deve dare questo comando come root (non fakeroot). Eseguire qualcosa come:
dpkg -i ../nomepacchetto_versione_i386.deb |
Se c'è qualcosa che non funziona con il pacchetto installato, modificare i file nella directory sorgente e tornare alla sezione "Creare il Makefile".
Se non si è l'autore del software, inviare un file .patch all'autore, così che possa incorporare il vostro lavoro di porting e/o di fissaggio di bug nelle versioni successive del software.
Così altri utenti possano beneficiare del vostro lavoro. Non ci si dimentichi di comprimere nuovamente l'albero del sorgente originale a un file .tar.gz, e rendere pubblico anche i sorgenti, così anche gli utenti non Debian possano beneficiare del vostro lavoro, e il programma sia disponibile compilato in differenti versioni di libc.
Così ogni utente del proprio sistema può installare i vostri pacchetti con apt-get install e ricompilarli con apt-get -b source.
Non è necessario essere root per creare un repository di pacchetti. Verrà spiegato il caso più semplice, senza sub-directory o conflitti di nomi dei pacchetti.
Step0. Eseguire:
apt-get install dpkg-dev gzip bash |
Step1. Creare una directory vuota che conterrà tutti i pacchetti Debian (sorgenti e binari) che si vogliono distribuire. Chiamarla '/var/ftp/debian-local'. Lasciarla sulla macchina 'fooserver.org'.
Step2. Creare un file vuoto '/var/ftp/debian-local/Override'
Step3. Creare un file eseguibile '/var/ftp/debian-local/update.sh':
#! /bin/bash -- set -ex MYDIR="${0%/*}"; [ "$MYDIR" != "$0" ] && cd "$MYDIR" [ -f update.sh ] [ -f Override ] dpkg-scanpackages . Override > Packages; gzip -f Packages dpkg-scansources . Override > Sources ; gzip -f Sources Comprimere con gzip il file Packages e Sources che saranno indispensabili per i repository FTP e HTTP descritti successivamente in questo tutorial. |
Step4. Come 'root@fooserver.org' aggiungere la righe seguenti al file /etc/apt/sources.list:
deb file:/var/ftp/debian-local ./ deb-src file:/var/ftp/debian-local ./ |
Step5. Copiare alcuni pacchetti binari (*.deb) in '/var/ftp/debian-local/'
Step6. Copiare alcuni pacchetti sorgenti (*.tar.gz, *.dsc) in '/var/ftp/debian-local/'
Step7. Eseguire /var/ftp/debian-local/update.sh
Step8. Come 'root@fooserver.org', eseguire 'apt-get update'
Step9. Come 'root@fooserver.org', tentare la compilazione e l'installazione di alcuni pacchetti:
apt-get -d install nomepacchetto apt-get install nomepacchetto apt-get -b source nomepacchetto |
Step10. Ripetere dallo Step5 se si hanno dei nuovi pacchetti da aggiungere al repository
In questo modo chiunque può installare sul proprio sistema i vostri pacchetti con 'apt-get install' e ricompilarli con 'apt-get -b source'.
Step21. Prima seguire i passaggi di {Creare un repository di pacchetti Debian}.
Step22. Creare un file vuoto '/var/ftp/debian-local/Release'. Per un confronto, viene mostrato un esempio di file Release da un sito Debian:
Archive: stable Version: 3.0r1a Component: contrib Origin: Debian Label: Debian Architecture: i386 |
Step23. Impostare un server FTP. Questo sistema dovrebbe funzionare anche con un server HTTP ma non viene descritto in questo testo. Il modo possibilmente più facile di configurare un server FTP temporaneo se non si è root è il seguente:
# Dare questi comandi in una nuova finestra di terminale: wget http://www.inf.bme.hu/~pts/pts-ftpd-latest.tar.gz tar xzvf pts-ftpd-latest.tar.gz cd pts-ftpd-1* debian/rules build cp bftpd.noss /var/ftp/debian-local/pts-ftpd chmod 111 /var/ftp/debian-local/pts-ftpd cd /var/ftp/debian-local ./pts-ftpd -Na |
Ora pts-ftpd è avviato. I messaggi di log sono scritti al terminale. La prima riga contiene l'URL in cui il server è disponibile. Per fermarlo, chiudere la finestra del terminale o premere CTRL-C. L'URL è ftp://fooserver.org:2121/. Verificare che il file ftp://fooserver.org:2121/Packages.gz sia scaricabile.
Step24. Come 'root@anymachine.org' aggiungere le seguenti righe al file /etc/apt/sources.list:
deb ftp://fooserver.org:2121/ ./ deb-src ftp://fooserver.org:2121/ ./ |
Se si hanno voci simili a http:// o file:/ (in /etc/apt/sources.lists) per fooserver.org, si devono togliere i commenti.
Step25. Come 'root@anymachine.org' eseguire 'apt-get update'
Step26. Come 'root@anymachine.org' tentare di compilare e installare alcuni pacchetti:
apt-get -d install nomepacchetto apt-get install nomepacchetto apt-get -b source nomepacchetto |
Step27. Se si hanno nuovi pacchetti da aggiungere al repository: ripetere i passaggi 5--7 di {Creare un repository di pacchetti Debian} e poi dal passaggio 2.5
Step28. Pubblicare un link al proprio repository sulla propria home page
26. Divertirsi con i propri pacchetti Debian!
Questa è la fine del tutoria step-by-step.
D1. Come si possono creare due file .deb da un singolo file .tar.gz?
R1. Questo è sotto-documentato. Aggiungere voci multiple al campo 'Package: ' nel file debian/control. Duplicare alcuni file nella directory debian. Aggiungere le voci appropriate nel campo Replaces: per i file di documentazione.
D2. Come si possono creare due file .deb da un singolo file .tar.gz, con differenti opzioni di --configure?
R2. Modificare la sezione 'build:' del file debian/rules di conseguenza. Dopo di che si è lasciati al proprio destino.