Product SiteDocumentation Site

Capitolo 15. Creazione di un pacchetto Debian

15.1. Rigenerare un pacchetto dai suoi sorgenti
15.1.1. Ottenere i sorgenti
15.1.2. Apportare modifiche
15.1.3. Iniziare la rigenerazione del pacchetto
15.2. Creare il primo pacchetto
15.2.1. Meta-pacchetti o pacchetti finti
15.2.2. Semplice file di archivio
15.3. Creazione di un repository di pacchetti per APT
15.4. Diventare un maintainer di pacchetti
15.4.1. Imparare a creare pacchetti
15.4.2. Processo di accettazione
È abbastanza comune, per un amministratore che gestisce regolarmente i pacchetti Debian, sentire la necessità di creare dei propri pacchetti, o di modificarne uno già esistente. Questo capitolo serve proprio a rispondere alle domande più comuni sulla pacchettizzazione e fornire gli elementi necessari per utilizzare l'infrastruttura Debian nel migliore dei modi. Con po' di fortuna, dopo essersi cimentati con i pacchetti locali, si può anche sentire il bisogno di andare oltre e aderire al progetto Debian!

15.1. Rigenerare un pacchetto dai suoi sorgenti

Rigenerare un pacchetto binario può rendersi necessario per una serie di motivi. In alcuni casi, l'amministratore ha bisogno di una funzionalità presente nel software che richiede la compilazione dello stesso dai sorgenti, con una particolare opzione di compilazione; in altri casi, il software pacchettizzato per la versione di Debian installata non è abbastanza recente. In quest'ultimo caso, l'amministratore di solito costruisce un pacchetto più recente prendendolo da una nuova versione di Debian — come Testing o addirittura Unstable — in modo che questo nuovo pacchetto funzioni nella distribuzione Stable; questa operazione è chiamata "backporting". Come al solito, prima di cominciare, è necessario controllare se qualcun altro ha già effettuato quest'attività — un rapido sguardo alle pagine del sistema di tracciamento dei pacchetti può darci le informazioni che cerchiamo.

15.1.1. Ottenere i sorgenti

La prima cosa da fare per rigenerare un pacchetto Debian è quella di procurarsi i sorgenti. Il modo più semplice è quello di utilizzare il comando apt-get source source-package-name. Questo comando richiede che sia presente una riga con deb-src nel file /etc/apt/sources.list e che i file di indice siano aggiornati (ad esempio con apt-get update). Se si sono seguite le istruzioni nel capitolo che tratta la configurazione di APT (si veda Sezione 6.1, «Compilazione del file sources.list»), questi requisiti dovrebbero già essere soddisfatti. Si noti, tuttavia, che verranno scaricati i pacchetti sorgente della versione di Debian riportata nella riga deb-src. Se si ha bisogno di un'altra versione, potrebbe essere necessario scaricarla manualmente da un mirror Debian o dal sito web. Questo comporta il recupero di due o tre file (con estensione *.dsc, per i Debian Source Control, *.tar.comp e a volte *.diff.gz o *.debian.tar.compcomp prendendo un valore tra gz, bz2 o xz a seconda dello strumento di compressione che è stato utilizzato), e l'esecuzione del comando dpkg-source -x file.dsc. Se il file *.dsc è accessibile direttamente da un determinato URL, c'è un modo ancora più semplice per recuperare il tutto, con il comando dget URL. Questo comando (che si trova nel pacchetto devscripts) recupera il file *.dsc dall'indirizzo indicato, analizza il suo contenuto, e recupera automaticamente il file o i file a cui fa riferimento. Una volta che tutto è scato scaricato, estrare il pacchetto sorgente (a meno che non venga utilizzata l'opzione -d or --download-only).

15.1.2. Apportare modifiche

Il sorgente del pacchetto è ora disponibile in una directory con lo stesso nome del pacchetto sorgente e della sua versione (per esempio, samba-4.1.17+dfsg); qui è dove verranno effetuate tutte le modifiche locali.
La prima cosa da fare è cambiare il numero di versione del pacchetto, in modo che i pacchetti rigenerati possano essere distinti dai pacchetti originali forniti da Debian. Supponendo che la versione corrente sia la 2:4.1.17+dfsg-2, possiamo creare la versione 2:4.1.17+dfsg-2falcot1, che indica chiaramente l'origine del pacchetto. In questo modo il numero di versione del pacchetto sarà superiore a quello fornito da Debian, così il pacchetto verrà installato come un aggiornamento del pacchetto originale. Questa modifica può essere effettuata dal comando dch (Debian CHangelog) del pacchetto devscripts, eseguendolo in questo modo: dch --local falcot. Questo comando richiama un editor di testo (sensible-editor, dovrebbe essere l'editor preferito se è stato impostato nelle variabili d'ambiente VISUAL o EDITOR altrimenti verrà utilizzato quello predefinito) per permettere di documentare le modifiche effettuate da questa rigenerazione del pacchetto. Questo editor mostra che dch ha modificato veramente il file debian/changelog.
Quando è necessario cambiare delle opzioni di compilazione, devono essere apportate delle modifiche al file debian/rules, che definisce il processo di compilazione del pacchetto. Nei casi più semplici, le righe che riguardano la configurazione iniziale (./configure …) o la versione corrente ($(MAKE) … o make …) sono facili da individuare. Se questi comandi non sono chiamati esplicitamente, sono probabilmente un effetto collaterale di un altro comando esplicito, in questo caso si rimanda alla loro documentazione per saperne di più su come modificare il comportamento predefinito. Con i pacchetti che usano dh, potrebbe essere necessario aggiungere un override per i comandi dh_auto_configure o dh_auto_build (si vedano le rispettive pagine di manuale per le spiegazioni su come fare).
A seconda delle modifiche locali apportate ai pacchetti, può essere richiesto un aggiornamento anche nel file debian/control, che contiene una descrizione dei pacchetti generati. In particolare, questo file contiene le righe Build-Depends che permettono di controllare la lista delle dipendenze che devono essere soddisfatte nel momento della generazione del pacchetto. Queste spesso si riferiscono alle versioni dei pacchetti contenuti nella distribuzione da cui proviene il pacchetto sorgente, ma che potrebbero non essere disponibili nella distribuzione utilizzata per la rigenerazione. Non esiste un modo automatico per determinare se una dipendenza è reale o è specificata solamente per garantire che la costruzione deve essere eseguita solamente con l'ultima versione di una libreria. Questo è l'unico modo possibile per forzare un autobuilder ad utilizzare una determinata versione del pacchetto durante la costruzione, ed è il motivo per cui i maintainer Debian spesso utilizzano le dipendenze per la compilazione con versioni specifiche.
Se si sa per certo che queste dipendenze per la compilazione sono troppo stringenti, si possono rendere meno rigide localmente. I file che documentano il modo predefinito di costruire il software, spesso chiamati INSTALL, aiuteranno a capire quali sono le dipendenze appropriate. Idealmente, tutte le dipendenze devono poter essere soddisfatte dalla distribuzione utilizzata per la rigenerazione del pacchetto, se non lo sono, si avvia un processo ricorsivo, per cui per i pacchetti indicati nel campo Build-Depends deve essere fatto un «backport» prima che il pacchetto in questione sia costruito. Alcuni pacchetti non necessitano di backporting, e possono essere installati così come sono durante il processo di creazione (un esempio degno di nota è debhelper). Si noti che il processo di backporting può rapidamente diventare complesso se non si è attenti. Pertanto, i backport dovrebbero essere ridotti al minimo indispensabile, quando possibile.

15.1.3. Iniziare la rigenerazione del pacchetto

Quando sono state apportate tutte le modifiche necessarie ai sorgenti, si può iniziare a generare il pacchetto binario (il file .deb). L'intero processo è gestito dal comando dpkg-buildpackage.

Esempio 15.1. Rigenerazione di un pacchetto

$ dpkg-buildpackage -us -uc
[...]
Il comando precedente può fallire se i campi Build-Depends non sono stati aggiornati o se i relativi pacchetti non sono installati. In questo caso è possibile saltare questo controllo passando l'opzione -d al comando dpkg-buildpackage. Tuttavia, ignorando esplicitamente queste dipendenze si corre il rischio che una fase successiva del processo di generazione fallisca. O peggio ancora, il pacchetto può sembrare generato correttamente, ma si comporta in modo anomalo: alcuni programmi disabilitano automaticamente alcune delle loro caratteristiche quando non è disponibile una libreria richiesta in fase di compilazione.
Il più delle volte, gli sviluppatori Debian utilizzano un programma di alto livello come debuild. Questo esegue dpkg-buildpackage e richiama un programma che avvia molti controlli per convalidare le policy Debian del pacchetto generato. Questo script fa in modo che le variabili d'ambiente locali non «inquinino» la fase di generazione del pacchetto. Il comando debuild è uno degli strumenti della suite devscripts, che condividono la stessa consistenza e configurazione, per rendere il compito più facile ai maintainer.