lunedì 22 febbraio 2010

Creare pacchetti .deb da sorgente

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.

4 commenti:

  1. Ma cos'e' questo?? Questo non e' un tutorial, e' una ricetta per creare uno schifo di .deb, e continuare a rilasciare pacchetti di bassissima qualita'.

    Per chiunque sia interessato, che si legga la Debian Policy, Developers References, a qualceh pacchetto sorgente (i .dsc) per capire DAVVERO come si fa un pacchetto Debian.

    RispondiElimina
  2. Questo non vuole assolutamente essere un tutorial definitivo, per creare pacchetti debian e diventare MOTU.
    Questa e' solo la descrizione sommaria delle esperienze , un PUNTO DI PARTENZA per creare pacchetti ad uso personale.
    Invece di criticare, Sandro, perche' non fai critiche costruttive, contribuendo alla divulgazione delle informazioni, del tuo sapere?
    Se hai suggerimenti, su come impostare, un'articolo sulla creazione dei pacchetti, perche' non me lo esponi? ... ci si puo' confrontare e realizzare qualcosa di piu' di qualche post frammentario (che e' tutto quello che sono riuscito a trovare in italiano).
    Sono a completa disposizione:
    la email: lomdav@tin.it

    RispondiElimina
  3. Nono, tu dichiari che "qui voglio approfondire l'argomento" quindi non vuoi che sia un punto di partenza, ma ti metti come fonte autoritativa di informazioni, mentre quello che descrivi e' un accrocchio di manipolazioni di file che devono essere automaticamente generati da tool che sanno quello ceh fanno. (e gia' il fatto che menzioni MOTU mi fa capire qual'e' il tuo obiettivo).

    Riguardo la costruttivita' del mio commento, ti riscrivo quello che avevo gia' detto sopra (repetita iuvant): "Per chiunque sia interessato, che si legga la Debian Policy, Developers References, a qualceh pacchetto sorgente (i .dsc) per capire DAVVERO come si fa un pacchetto Debian."

    RispondiElimina
  4. I tool che "sanno quello che fanno", sono stati menzionati e quel "qui voglio approfondire l'argomento" e riferito al fatto che volevo spiegare (evidentemente non ci sono riuscito) quello che questi tool effettivamente fanno, i file che vengono generati (per quello che sono le mie conoscenze).
    Per quanto riguarda le Debian Policy, ti ringrazio per avermelo fatto notare, dato che non conoscevo nemmeno l'esistenza della disponibilita' di questo documento in lingua italiana.

    Te lo ripeto, la costruttivita' del tuo commento e' certo degna di nota, come consiglio, ma non certo nei toni.

    RispondiElimina

Related Posts Plugin for WordPress, Blogger...