Come creare pacchetti Debian - How to make deb packages
by Joe Zonker (Oct. 24, 2003) Traduzione: roberto Premoli (Nov. 5, 2003)

Debian si posiziona al quarto posto tra le distribuzioni piu' usate per lo sviluppo di sistemi embedded come si puo' notare qui LinuxDevices.com's annual Embedded Linux Market Survey, con un crescente tasso di utilizzo. Gli sviluppatori che desiderano distribuire i binari ed i sorgenti del proprio software per renderlo disponibile per Debian dovranno imparare le basi per creare i pacchetti Debian (.deb). This dettagliato how-to mostra tutti i componenti necessari per un pachetto (package) e come metterli insieme pre creare un prodotto finito.

Come creare un pachetto DEB

Il sistema di pacchettizazione Debian e' uno dei piu' eleganti metodi disponibili di installazione, upgrade e rimozione del software. Per tutti voi, tifosi di altri sistemi di pacchettizzazione prima che mi mandiate i vostri flames, per favore notate che ho detto "uno dei" e non semplicemente "il migliore". Gli altri sistemi di pacchettizzazione hanno il loro fascino, ma in questo articolo io mi focalizzero' sul sistema di pacchettizzazione di Debian. Nello specifico, mi appresto a creare pacchetti Debian, cosi' sarai in grado di distribuire i tuoi pacchetti in formato .deb oppure semplicemente per il tuo proprio uso.

Partiro' dalle componenti base del pachetto cioe' cio' che ti serve per creare il pacchetto e alla fine li uniremo per creare il pacchetto finale.

Comprendere i pachetti Debian

In questa sezione, daremo una rapida occhiata a cosa e' un pacchetto Debian. I pacchetti Debian sono molto simili ai pacchetti RPM (Red Hat Package Manager), ma differiscono leggermente nei dettagli. Se hai gia' esperienza nella creazione di pacchetti RPM, non ti sara' difficile aggiungere la creazione dei pacchetti Debian al tuo repertorio.

Cosa e' un pacchetto, esattamente?

Per dirla molto semplicemente, un pacchetto e' una collezione di file con le istruzioni su come usarli. Un pacchetto solitamente contiene uno o piu' programmi, ma a volte solo documentazione, temi per un window manager, o altri tipi di file che sono piu' facilmente distribuibili se contenuti in un pacchetto installabile.

il pacchetto contiene le istruzioni su dove quei file dovrebbero risiedere all'interno del filesystem, da quali librerie o altri programmi (nel caso) dipendono i file contenuti nel pacchetto quali essere contenuti i file, le istruzioni di setup e gli script per la configurazione di base. Notate che molti pacchetti non devono o non dovrebbero essere usati con i settaggi di default contenuti nei loro file di configurazione. Con pacchetti come Apache, avrai ancora la necessita' di configurare l'installazione dopo che il pacchetto e' stato installato.

i pacchetti solitamente contengono del software precompilato, (binari) ma tu puoi "pacchettizzare" anche del codice sorgente. Alcuni amministratori potrebbero preferire installare partendo dai sorgenti, oppure quel'applicativo potrebbe necessitare di una parametrizzazione particolare prima che venga compilato, cosi' se tu stai distribuendo un software che e' sotto licenza free o opensource, tu potresti desiderare di creare un pacchetto di sorgenti cosi' come un pacchetto di binari.

Nota: I pacchetti precompilati sono solitamente chiamati "binari", sebbene questo sia una specie di errore (NDT: letteralmente: misnomer). Si, gli eseguibili sono in formato binario, ma lo sono anche JPEGs, MP3s, e molti altri file non eseguibili. Avrebbe forse piu' senso chiamare i software precompilati pacchetti "eseguibili".

Tutti i pacchetti Debian binari consistono in tre cose di base: un file di testo chiamato debian-binary, un file compresso in formato tarball chiamato control.tar.gz, e un altro file compresso in formato tarball chiamato data.tar.gz.

il file di testo debian-binary contiene un numero di versione per il pacchetto binario, e tale numero dovrebbe essere 2.0. Il file control.tar.gz contiene il file di controllo; il file postinst il quale contiene le istruzioni su cosa fare dopo l'isntallazione del file; ed il file prerm, che che contiene le istruzioni per la rimozione del pacchetto. Il file control.tar.gz puo' anche contenere un file con le informazioni inerenti i file di configurazione per il pacchetto chiamato conffiles e un file contenente il checksum MD5 per il paccheto chiamato md5sums (NDT: md5sums serve per verificare se il pacchetto e' giusto o se e' corrotto).

il file data.tar.gz contiene il "payload" attuale del pacchetto. Cioe', esso contiene un filesystem con tutti i relativi file per il programma che, una volta installato, piazzera' nei giusti posti del tuo filesystem.

Se tu vuoi vedere da te come appare un pacchetto Debian, scarica qualche pacchetto dal sito Debian (vedi il link Resources piu' avanti in questo articolo) ed esegui il comando ar -x nomepacchetto.deb. I pacchetti Debian sono semplici archivi dei file menzionati prima.

Devo essere uno sviluppatore Debian?

Tu non hai bisogno di essere uno sviluppatore ufficiale per creare e distrubuire dei pacchetti compatibili con Debian. Tuttavia, tu devi essere uno Sviluppatore Debian se vuoi attualmente deposirate i tuoi pacchetti .deb all'interno del sito di Debiana edevi essere un manutentore di pacchetti (NDT: letteralmente: package maintainer) per le versioni ufficiali di Debian. Se sei interessato a diventare uno Svilluppatore Debian, tu puoi iniziare leggendo la pagina "How You Can Help?" sul sito Debian (vedi Resources per il link).

Ci sono numerose compagnie e progetti che creano e distribuiscono il loro software sotto forma di pacchetti Debian. Questi sono pacchetti non "ufficiali" ma sono comunque un grande vantaggio per gli utenti Debian che desiderano essere in grado di installare il software utilizzando dpkg or APT (Advanced Packaging Tool).

Quello che ti serve per iniziare

Ovviamente, tu necessiti di un sistema Debian se stai per creare e testare dei pacchetti Debian. Tu avrai anche bisogno di qualcosa da pacchettizzare. Partiremo con l'assunzione che hai gia' queste due cose, e da qui proseguiremo.

Ci sono molti pacchetti dei quali avrai bisogno che siano installati per creare pacchetti su un sistema Debian. Molti di questi paccetti sono installati di default sul tuo PC. Tu avrai bisogno di dpkg, gcc, make e cosi' via: avrai bisogno anche dei pacchetti base dedicati alla creazione di pacchetti, build-essential e dpkg-dev i quali possono o non possono essere gia' installati sul tuo sistema.

Convenzione sui nomi usati nei pacchetti Debian

Se hai usato Debian da un po' di tempo, potresti esserti accorto di una certa convenzione nei nomi usati. ogni pacchetto Debian dovrrebbe avere un nome che segue questi formato: nomepacchetto_versione_architettura.deb, dove "nomepacchetto e' il nome del pacchetto, "versione" e' la versione del pacchetto, con i tre numeri maggiore, minore e revisione e "architettura" e' la cpu per la quale il pacchetto e' stato compilato.

Il nome stesso del pacchetto (non il nome del file, proprio il nome del pacchetto) puo' contenere lettere minuscole, numeri, e i segni di meno "-" e piu' "+" characters. (Potrebbe suonare strano che un pacchetto abbia un "+" nel nome, ma e' usato per molti pacchetti quali "doc++" -- una serie di documentazione per il codice C/C++ code.) Cosi "miopacchetto-2++" e' un nome di pacchetto perfettamente valido, mentre "MIO_pachetto" o "miopacchetto2.0" non lo sarebbe.

Ogni pacchetto deve avere un unico nome che gia' non esista nell'archivio Debian. Benche' tu tecnicamente non hai bisogno di aderire a queste specifiche per installare un pacchetto, tu dovresti essere sicuro che il nome del tuo pacchetto non vada in conflitto con i nomi ufficiali dei pacchetti Debian. Per esempio, se vuoi distribuire una versione particolarmente modificata di Apache come alternativa alla versione ufficiale, tu non dovresti usare il nome apache_X.X.X-i386.deb, perche' i ragazzi di Debian hanno gia' un pacchetto apache . Invece tu dovresti voler usare qualcosa come acme-apache_X.X.X-i386.deb.

Creare un pacchetto Debian

Ora che abbiamo visto le basi, cioe' che e' un pacchetto Debian e cosa di cui abbiamo bisogno, e' tempo di parlare dei dettagli nella costruzione dei pacchetti.

il file Control

Avrai bisogno di creare un file control per il tuo pacchetto. Non preoccuparti: non e' molto difficile e tutto cio' di cui hai bisogno e' in tuo editore di testi preverito e un po' di informazioni. Quello che segue e' un semplice esempio di file control. Nota che io ho incluso tutti i campi opzionali solo a scopo dimostrativo, -- difficilmente il tuo paccheto necessitera' di tutti questi campi..

Listato 1. Un semplice file control
Package: acme
Version: 1.0
Section: web
Priority: optional
Architecture: all
Essential: no
Depends: libwww-perl, acme-base (>= 1.2)
Pre-Depends: perl
Recommends: mozilla | netscape
Suggests: docbook
Installed-Size: 1024
Maintainer: Joe Brockmeier [jzb@dissociatedpress.net]
Conflicts: wile-e-coyote
Replaces: sam-sheepdog
Provides: acme
Description: The description can contain free-form text
describing the function of the program, what
kind of features it has, and so on.
.
More descriptive text.

I campi del file Control

La sintassi per i campi del control file e' molto semplice: il nome del campo, seguito dai due punti, e poi il valore da assegnare al campo. Cosii', "nomeCampo:valore" e' tutto cio' di cui hai bisogno. Alcuni campi necessitano un vadore di una parola, mentre altri permettono una forma libera per la descrizione o per l'impostazione di un valore.

In questa sezione vedremo il significato di ogni campo e quale valore gli dovra' essere assegnato. Molti di quei campi sono opzionali, cosi il tuo pacchetto.non dovra' per forza includere tutti i campi qui descritti se essi non hanno attinenza com vostro pacchetto. Per esempio un pacchetto non richiedera' il campo "Source" se il source (NDT: sorgente) del pacchetto non e' disponibile. Se il tuo pacchetto non andra' in conflitto con nessun altro pacchetto, non avrai bisogno di includere il campo "Conflicts", e cosi' via.

Il primo campo di ogni file control e' il campo "Package". In questo campo dovrai specificare il nome del pacchetto. Il campo successivo, "Version" e' il numero di versione del pacchetto. Puoi usare qualsiasi schema di numerazione che usa l'autore originale del pacchetto, ma non puoi usare il carattere lineetta "-" all'interno del nome. Qualunque cosa scritta dopo il carattere "-" viene considerata da Debian il numero di revisione del pacchetto. Per esempio, se per qualche ragione il nomero di versione e' dato come 1.01-1, il numero di versione verra' considerato "1.01" con il nubero di revisione Debian do "1" -- chiaramente, non il risultato che tu stavi cercando..

Il campo "Manutentore" (NDT: letteralmente: "Maintainer") dovrebbe essere il tuo nome, o il nome della societa' e l'indirizzo e-mail deve essere contenuto tra parentesi quadre come mostrato sopra. Il campo "Installed-Size" si spiega faclmente da solo.

Dipendenze

Come probabilmente gia' sai, una delle cose piu' carine inerenti i pacchetti Debian, e' la risoluzione delle dipendenze. Quando tu usi apt-get per cercare i pacchetti, esso automaticamente decide se hai gia' sul tuo sistema quello che ti serve per usare il paccehtto richiesto e si offre di risolvere i conflitti o cercare qualunque pacchetto ti serva. Questa capacita' dipende dalle ben impostate e correttamente settate dipendenze del pacchetto.

Ci sono molti campi opzionali che hanno a che fare con le dipendenze. Li analizzeremo brevemente qui. Assicurati di aver esattamente classificato (NDT: lett. sorted out) di quali pacchetti il tuo pacchetto potrebbe aver bisogno prima dell'installazione -- il sistema delle dipendenze e' tanto piu' intellegente solo quanto lo sono gli sviluppatori a fornirgli le corrette informazioni.

Le dipendenze danno fino a 5 campi nel file Control: Depends, Enhances, Pre-Depends, Recommends, and Suggests.

il campo Depends dovrebbe contenere il nome di ogni pacchetto che il tuo pacchetto richiede assolutamente per poter funzionare. se c'e' un pacchetto "nice to have" (NDT: carino ad aversi) in relazione al tuo, ma non necessario per un uso normale del tuo pacchetto, allora andrebbe posizionato nel campo "Recommends" o "Suggests". Noterai nell'esempio precedente che il campo "Recommends" ha due distinti pacchetti separati da una pipe (|). cio' significa che entrambi i pacchetti soddisferanno la dipendenza; non son entranbi richiesti.

beh, quale e' la differenza tre "Recommends" e "Suggests", allora? Tutti i pacchetti che dovresti probabilmente avere, ma che non sono assolutamente necessari vanno messi in "Recommends". In accodo con il manuale della policy: "list packages that would be found together with this one in all but unusual installations." Pacchetti che potrebbero essere utili ma che non sono in alcun modo richiesti dovrebbero essere messi nel campo "Suggests".

Per esempio, il pacchetto the DocBook XML DTD (docbook-xml) mostra il pacchetto the DocBook SGML (docbook) come pacchetto "Recommended" ed il pacchetto DocBook documentation (docbook-doc) come pacchetto "suggested". In molte circostanze, se tu hai XML DTD, allora probabilmente avrai anche il pacchetto SGML DTD -- ma non in ogni occasione. E' solitamente (leggi: sempre) una buona idea installare la documentazione riguardante un pacchetto i programmi correlati, come i DocBook docs, ma non sono necessari per la normale operativita del tuo programma.

Il campo "Enhances" indica che il tuo pacchetto potrebbe migliorare l'usabilita' di un altro pacchetto. Cosi', il pacchetto docbook-doc potrebbe avere un campo "Enhances" con docbook-xml quale uno dei pacchetti migliorati.

Il campo "Pre-Depends" e' riservato per casi speciali. Quando in pacchetto e' indicato come "Pre-Depends," esso forza il sistema ad assicurarsi che il pacchetto indicato sia completamente installato prima di tentare di installare il tuo pacchetto.

Infine, lavorando col numero di versione ci sono molti simboli che avrai bisogno di comprendere. Noterai che uno dei pacchetti indicati come dipendenze hanno un dato numero di versione, acme-base (>= 1.2). Cio' significa: "Questo pacchetto richiede il pacchetto una versione acme-base uguale o superiore alla 1.2."

LE relazioni disponibili sono strettamente precedente (<<), precedente o uguale (<=), uguale a only (=), uguale o successivo a (>=), e strettamente successivo a (>>).

Specificando i conflitti

I campi "Conflicts" e "Replaces" specificano i pacchetti che non sono dipendenze, ma indicano quei paccheti che non dovrebbero essere installati sullo stesso sistema sul quale stiamo installando il nostro pacchetto.

I pacchetti che confliggono totalmente col nostro pacchetto dovrebbero essere listati nel campo "Conflicts". Per esempio, sestai pacchettizzando una versione modificata di Apache, tu non vorresti che la versione normale di apache fosse installata sul tuo sistema instele alla tua versione, -- cosi' "apache" dovrebbe essere listato come in conflitto.

Infine, il file di controllo dovrebbe essere posizionatoall'interno di una directori chiamata DEBIAN, cosi' come dovrebbero esserlo gli script menzionati nella prossima sezione. Questa directory non verra' "turn up" (NDT: non ho saputo tradurre) nell'archivio finale .deb.

Scripts

Il tuo pacchetto necessitera' anche qualche script che il sistema eseguira' per installare o rimuovere il pacchetto. (Ricorda, non importa quanto fantastico il tuo programma sia, qualcuno potrebbe desiderare di rimuoverlo successivamente all'installazione.)

Lo script postinst dovrebbe contenere i passi necessari da fare dopo l'installazione del tuo programma.. Lo script prerm dovrebbe contenere le istruzioni su cio' che dovrebbe essere fatto per rimuovere il programma. Entrambi questi script sono richiesti (vedi Resources per ulteriori dettagli).

Il passo finale

Dopo tutto il lavoro preparatorio che va dentro il costruendo pacchetto Debian, l'attuale creazione del pacchetto e' qualcosa di anticlimactic (NDT: leteralmente: memo impegnativo di quanto non saresti portato a credere).

Tu userai il comando dpkg con l'opzione -b oppure --build option (-b and --build che e' lo stesso). La sistassi per la creazione di un pacchetto e' dpkg -b directory nomepacceetto.deb dove directory contiene l'albero di directories con tutti i file necessari per il tuo programma. Nota, tu puoi costruire un pacchetto senza speceficare il nome del nuovo pacchetto, ma poi esso sara' semplicemente piazzato all'interno di directory come ".deb" -- cio' potrebbe indurti a credere che il pacchetto non sia stato creato.

Cosi', per esempio, se il tuo programma ha un fole di configurazione all'interno di etc/, ed il programma stesso sara' in usr/bin/, e della documentazione inerente sara' in usr/share/doc/package/, tu dovrai ricreare lo stessoalbero di directories all'interno della directory che userai per creare il tuo pacchetto.

Superare la parte iniziale (NDT: lett. Beyond the basics)

Questo e' grosso modo tutto quello che serve per creare un pacchetto Debian. Questo potrebbe sembrare un po' complicato, ma veramente si tratta di una serie di piccoli passi. Nulla e' troppo complicato; devi semplicemente seguire le istruzioni.

Ci sono un po' di "intricacies" nella crazione dei pacchetti che sono oltre lo scopo di questo articolo. PEr esempio, se stai pacchettizzando un mail user agent o un mail transport agent, ci sono delle specifiche considerazioni da applicare. Questo articolo semplicemente copre le nude basi per la creazione di un pacchetto Debian. Sii sicuro ci veripicare il manuale della policy Debian (vedi Resources per il link) per essere sicuro di seguire pienamente le linee guida per la creazione di pacchetti..

Ci sono molte categorie di programmi che richiedono attenzioni extra, compresi ogni Web servers, demoni, programmi in Perl moduli, programmi X, e cosi' via.. Tu troverai quello che ti serve per adattare i tuoi programmi nella sezione Customized Programs del manuale della policy.

Risorse

  • Trova i pacchetti ufficiali su Debian Web site.

  • Leggi la pagina how to help per trovare informazioni su come supportare la manutenzione dei pacchetti Debian.

  • Perche' Debian? Come spiega debianPlanet, Debian e' piu' che una distribuzione e piu' di un Sistema Operativo. -- Debian e' una comunita'.In funzione di come ti senti oggi e di altre variabili, questo potrebbe suonare grande o potrebbe suonare come "a lot of hooey" (NDT: letteralmente: molta informazione errata). Meglio sospendere il giudizio finche non leggerai da te riguardo Debian.

  • Leggi linee guida di Debian Debian Free Software Guidelines sulle necessita di licenza per i pacchetti Debian ufficiali.

  • Il Debian Policy Manual contiene le istruzioni sulla costruzione di pacchetti Debian packages, con l'aggiunta di argomenti.

  • L' RPM-for-Unix HOWTO tratta converting Debian packages to RPM.

  • Tu puoi anche creare entrambi i pacchetti in entrambi i formati RPM and deb dallo stesso sorgente, usando dei tools come pkgwrite.

  • Leggi questa serie di articoli scritti da Dan Poirier sulla pacchettizzazione usando il formato RPM: Part 1 (developerWorks, November 2001), Part 2 (developerWorks, December 2001), and Part 3 (developerWorks, February 2002).

  • Per una alternativa basata sul formato tar, leggi Manage packages using Stow (developerWorks, February 2003).

  • Se sei interessato ad imparare di piu' su Debian o se stai avendo problemi, ci sono moltissime Mailing-list su Debian Debian mailing lists che possono aiutarti. Noi dobbiamo pesantemente sottolineare che, come sempre, dovresti verificare gli archivi the archives prima di scrivere alle liste in cerca di aiuto.

  • Basics of the Debian Package Management System contiene un semplice file control, tra altri utili esempi e spiegazioni.

  • The Debian Policy Manual, Chapter 6 ha piu' informazioni sugli script.

  • Non dimenticare di avere con te Debian Weekly News.

  • Per informazioni sulla costruzione della tua prossima applicazione usando i tool IBM tools e middleware, controlla Speed-start your next Linux app.

  • Trova ulteriori resources for Linux developers nella zona developerWorks Linux.

Riguardo l'autore -- Joe "Zonker" Brockmeier ha cominciato ad usare Linux fin dal 1996 e scrivendo riguardo ad esso in lungo ed in largo. Zonker scrive regolarmente per Linux Magazine e UnixReview.com ed e' co-autore di parecchi libri, compreso DocBook Publishing and Linux Routing. Tu puoi contattare Joe a jzb-at-dissociatedpress.net.



First published by IBM developerWorks. Reproduced by LinuxDevices.com with permission.