Creare un pacchetto .deb dai sorgenti, e' un'operazione d'obbligo se vogliamo avere un'installazione tracciabile dei nostri programmi.
Problema: Seguiamo un progetto e suoi sviluppi, e dobbiamo compilare i sorgenti per ottenere gli eseguibili. In questo caso compilando i sorgenti non possiamo tenere d'occhio tutti i file installati nel sistema dal file di configurazione in fase di compilazione. E siamo costretti a tenere la directory di compilazione per un'eventuale disinstallazione.
La soluzione e' la creazione di un pacchetto. Ogni distribuzione ha un suo formato di cui i piu' diffusi sono sicuramente i .deb (Debian e derivati, quindi anche Ubuntu), e .rpm (OpenSuse e derivate).
Per una conversione tra i due formati si puo' utilizzare alien, di cui abbiamo gia' parlato, ma qui discuteremo la creazione ex-novo di un pacchetto avendo solamente i sorgenti. Lo so, in giro per la rete si trovano migliaia di guide su come creare pacchetti, ma qui voglio approfondire l'argomento, dato che l'operazione di impacchettamento non e' univoca, e ci possono essere svariati problemi, dipendenti dal linguaggio utilizzato, e dal toolkit di compilazione.
Per aver un maggior controllo sulla creazione del pacchetto, vediamo innanzittutto la sua struttura.
All'interno di un file .deb, sono contenuti un file "
debian-binary" (che specifica la versione del formato Deb), e due tarball:
control.tar.gz
data.tar.gz
L'archivio control.tar.gz contiene informazioni riguardanti il pacchetto, le sue dipendenze e gli script che vengono lanciati per l'installazione o la rimozione. In particolare il file "
control" contiene informazioni come il nome del pacchetto, la sua versione, la priorita', l'architettura, le dipendenze, ecc.
L'archivio data.tar.gz, contiene tutti i file che effettivamente verranno installati nel sistema. Quindi, per prima cosa, si devono compilare i sorgenti e nel caso in cui il programma sia scritto in Python, si puo' procedere subito alla creazione del pacchetto.
A questo punto possiamo utilizzare due strade.
- La prima e' creare la struttura richiesta da un file .deb, manualmente, creando il file control e le directory necessarie:
dirPacchetto/DEBIAN/control
La directory DEBIAN, va creata all'interno del directory dirPacchetto, al cui interno verra' creato il file "control", editato seguendo le specifiche spiegate sopra.
dirPacchetto/usr/bin
All'interno di questa directory, ci deve trovare posto l'eseguibile principale, contenente la classe main.py
dirPacchetto/usr/share
All'interno vi possono essere create 3 directory opzionali: "application", "doc", "nomeProgramma"
Se presenti, in "doc", ovviamente ci saranno tutti i file di documentazione, nonche' le licenze d'uso e d'installazione.
In "Application", ci sara' il file nomeProgramma.desktop che specifica dove mettere il collegamento al programma nel menu di sistema.
E la directory "nomeProgramma", conterra' ovviamente tutti i file componenti il programma, in questo caso, si deve modificare la directory dirPacchetto/usr/bin, inserendo un file testo "nomeProgramma", contenente 3 righe, e che va reso eseguibile:
#!/bin/bash
cd /usr/share/nomeProgramma #prova è il nome del programma
env python Main.py #Main.py è la classe main del programma nomeProgramma.
- La seconda opzione per creare la struttura necessaria alla creazione del pacchetto, e' utilizzare un comando (dh_make), che creera' per noi tutto quello che e' necessario, e che si potra' poi modificare in base alle nostre esigenze.
Innanzitutto ci servono dei tool di sviluppo, che installeremo con il seguente comando:
sudo apt-get install dpkg-dev dh-make
Creiamo una directory con il nome del programma seguito dal numero di versione (per fare un'esempio, "mypaint-0.80") e vi copiamo all'interno il file tar.gz contenente i sorgenti. Scompattiamo il file tar.gz all'interno della directory creata.
A questo punto tramite il comando "cd", ci portiamo all'interno della directory e diamo un comando del tipo:
dh_make -e lomdav@tin.it -c GPL -f NomeDelFile.tar.gz
Le opzioni che abbiamo usato del comando dh_make sono:
-e specifica l'indirizzo email del maintainer (colui che ha creato il pacchetto)
-c specifica la licenza di distribuzione (in questo caso la licenza GPL, e' pienamente libera, e intende la ridistribuzione dei sorgenti per future modifiche).
-f specifica la tarball contente i sorgenti.
Il comando dh_make ci chiedera' il tipo di pacchetto se non specificato tramite opzioni sulla riga di comando (per esempio -s per binario singolo), che puo' essere di diversi tipi:
singolo, multiplo, libreria, modulo kernel o cdbs.
Il caso piu' comune e' che il programma sia un singolo binario.
Per creare il pacchetto si utilizzera' il comando:
dpkg-deb -b directoryProgramma nomeProgramma_versione_architettura.deb
Il formato del nome del pacchetto include oltre al numero di versione, anche l'architettura del sistema per cui e' stato compilato il sorgente, tipo i386, i686, amd64, oppure all (se e' indipendente dal processore utilizzato).
Nota bene: come mi ha fatto notare Sandro, se si vuole appronfondire l'argomento e' bene che si legga il
Debian Policy Manual, disponibile anche in Italiano.