[ precedente ] [ Contenuti ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ successivo ]


Guida per il nuovo Maintainer
Capitolo 3 - Modificare i sorgenti


Non c'è spazio qui per approfondire tutti i dettagli su come modificare i sorgenti originali, ma verranno trattati alcuni passaggi fondamentali e le problematiche più comuni.


3.1 Configurare quilt

Il programma quilt offre il metodo base per registrare le modifiche dei sorgenti per la pacchettizzazione di Debian. Siccome è norma che il sistema di pacchettizzazione di Debian abbia alcune piccole differenze nelle impostazioni predefinite, si deve impostare il ~/. quiltrc come segue.[11]"

     d=. ; while [ ! -d "$d/debian" -a `readlink -e $d` != / ]; do d="$d/.."; done
     
     if [ -d "$d/debian" ] && [ -z "$QUILT_PATCHES" ]; then
     
         # Debian packaging case and unset $QUILT_PATCHES
     
         QUILT_PATCHES=debian/patches
     
         QUILT_PATCH_OPTS="--unified-reject-files"
     
         QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
     
         QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
     
         QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33"
     
         if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi
     
     fi

Per l'utilizzo di quilt vedere quilt(1) e /usr/share/doc/quilt/quilt.html.


3.2 Correggere i bug nel sorgente originale

Si supponga di trovare un errore, nel file Makefile distribuito con il programma originale, ad esempio la stringa "install: gentoo" avrebbe dovuto essere "install: gentoo-target".

     install: gentoo
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

Si può correggere questo errore e registrarlo, con il comando quilt utilizzando come file fix-gentoo-target.patch. [12]

     $ mkdir debian/patches
     $ quilt new fix-gentoo-target.patch
     $ quilt add Makefile

Si modifichi il file Makefile come segue.

     install: gentoo-target
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

Adesso bisogna chiedere a quilt di aggiornare e creare la patch debian/patches/fix-gentoo-target.patch e di aggiungere una descrizione.

     $ quilt refresh
     $ quilt header -e
     ... describe patch

3.3 Installazione in una sotto-directory

Normalmente, i programmi si auto-installano in sottodirectory di /usr/local. I pacchetti Debian invece non devono usare quella directory, dal momento che è riservata agli amministratori (o utenti) del sistema per uso privato, ma dovrebbero usare le directory di sistema come la sottodirectory /usr/bin, conformi allo Standard di Gerarchia dei Filesystem (FHS, /usr/share/doc/debian-policy/fhs/fhs-2.3.html).

Normalmente, make(1) è usato per costruire automaticamente il programma, invece l'esecuzione di "make install" installa il programma direttamente nella destinazione prestabilita. Questa è configurata nella sezione install del file Makefile. Per far in modo che Debian fornisca dei pacchetti binari, il sistema di compilazione installa i programmi in un'immagine dell'albero dei file, creata dentro una directory temporanea, anziché nella destinazione prestabilita.

Le 2 differenze tra (1) la normale installazione di un programma e (2) l'installazione tramite il sistema di pacchettizzazione Debian può essere affrontato in modo trasparente dal pacchetto debhelper, attraverso i comandi dh_auto_configure e dh_auto_install, se le seguenti condizioni sono soddisfatte.

I programmi che usano GNU autoconf sono automaticamente conformi alle convenzioni GNU e la loro pacchettizzazione è quasi automatica. Con questi ed altri accorgimenti, si stima che il pacchetto debhelper funzioni sul quasi il 90% dei pacchetti senza apportare pesanti modifiche al loro sistema di compilazione. La pacchettizzazione non è così complicata come potrebbe sembrare.

Se è necessario apportare modifiche al file Makefile, ci si dovrebbe assicurare che supporti la variabile $(DESTDIR). La variabile $(DESTDIR) non è impostata nel Makefile, è anteposta ad ogni percorso del file, utilizzato per l'installazione del programma. Lo script di pacchettizzazione imposta la variabile $(DESTDIR) in una directory temporanea.

La directory temporanea, utilizzata dal comando dh_auto_install, è debian/pacchetto per i pacchetti binari singoli. [13] Tutto quello contenuto nella directory temporanea verrà installato sul sistema dell'utente, appena si installa il pacchetto, l'unica differenza è che dpkg installerà i file nella radice del file system.

Bisogna tenere in considerazione che, anche se il programma viene installato in debian/pacchetto, deve comunque rispettare i percorsi convenzionali, una volta posizionato nella radice, ad es. quando si installa un pacchetto .deb. Per questo motivo non bisogna consentire al sistema di compilazione di utilizzare stringhe impostate manualmente come costanti, ad esempio /home/me/deb/package-version/usr/share/pacchetto nel file del pacchetto.

Questa è la parte più importante del Makefile del pacchetto gentoo [14]:

     # Where to put binary on 'make install'?
     BIN     = /usr/local/bin
     
     # Where to put icons on 'make install'?
     ICONS   = /usr/local/share/gentoo

Da notare che i file verranno installati in /usr/local. Si modifichino questi percorsi con:

     # Where to put binary on 'make install'?
     BIN     = $(DESTDIR)/usr/bin
     
     # Where to put icons on 'make install'?
     ICONS   = $(DESTDIR)/usr/share/gentoo

Ma perché in questa directory e non altrove? Perché i pacchetti Debian non installano mai dei file nella directory /usr/local -- questo percorso è riservato all'amministratore di sistema. Questi file, invece, nei sistemi Debian vanno posizionati in /usr.

L'esatta posizione dei binari, delle icone, della documentazione, ecc. è specificata nella Gerarchia dei Filesystem (vedere /usr/share/doc/debian-policy/fhs/). Si consiglia di sfogliarlo e leggere le sezioni riguardanti il pacchetto interessato.

Si dovrà installare, quindi, il binario in /usr/bin anziché in /usr/local/bin, la pagina di manuale in /usr/share/man/man1 anziché /usr/local/man/man1, ecc. Da notare che nel Makefile del pacchetto gentoo non è presente una pagina di manuale, ma dal momento che la policy di Debian prevede che ogni programma ne abbia una, ne verrà creata una e sarà installata in /usr/share/man/man1.

Alcuni programmi non usano le variabili nel Makefile per definire dei percorsi come questi. Questo indica che potrebbe essere necessario modificare qualche sorgente in C, per fargli usare il percorso giusto. Ma dove cercarlo, e per farci cosa? Lo si può scoprire eseguendo questo:

     $ grep -nr -e 'usr/local/lib' --include='*.[c|h]' .

grep cercherà tutte le corrispondenze in maniera ricorsiva attraverso tutto l'albero dei sorgenti, indicando il nome del file e il numero della riga.

Si modifichino quei file in quelle righe, sostituendo usr/local/lib con /usr/lib.

     $ vim '+argdo %s/usr\/local\/lib/usr\/lib/gce|update' +q \
           $(find . -type f -name '*.[c|h]')

Si faccia attenzione a non pasticciare il resto dei sorgenti! :-)

A questo punto si dovrebbe trovare il percorso di destinazione per l'installazione (si cerchi la riga che inizia con install:, di solito è quella corretta) e modificare tutti i riferimenti alle directory diverse da quelle definite nel Makefile.

Dopo aver corretto il bug, il percorso di destinazione per l'installazione del pacchetto gentoo riporterà:

     install: gentoo-target
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

Si può correggere e registrare la modifica con il comando quilt salvandola come debian/patches/install.patch.

     $ quilt new install.patch
     $ quilt add Makefile

Per il pacchetto debian si modifichi come segue, utilizzando un editor:

     install: gentoo-target
             install -d $(BIN) $(ICONS) $(DESTDIR)/etc
             install ./gentoo $(BIN)
             install -m644 icons/* $(ICONS)
             install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc

Si sarà sicuramente notato che c'è adesso un comando "install -d" prima degli altri, nella regola. Il Makefile originale non ce l'ha perché generalmente usa /usr/local/bin e altre directory che già esistono nel sistema su cui si esegue "make install". Tuttavia, dal momento che verrà installato nella nostra directory vuota (o anche inesistente), si dovrà creare ogni singola directory.

È possibile anche aggiungere altre cose alla fine della regola, come l'installazione di documentazione aggiuntiva che gli autori originali talvolta omettono:

             install -d $(DESTDIR)/usr/share/doc/gentoo/html
             cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html

Dopo un'attenta analisi, se tutto è andato bene, si può aggiornare con quilt la patch creando il file debian/patches/install.patch ed aggiungendogli una descrizione.

     $ quilt refresh
     $ quilt header -e
     ... describe patch

Adesso si avranno una serie di patch.

  1. Correzione del bug riguardante il sorgente originale: debian/patches/fix-gentoo-target.patch

  1. Modifica specifica per il sistema di pacchettizzazione Debian: debian/patches/install.patch

Ogni volta che si apportano delle modifiche che non sono specificatamente legate alla pacchettizzazione Debian, come debian/patches/fix-gentoo-target.patch, bisogna assicurarsi di inviare le modifiche al manutentore originale, in modo che possano essere incluse nella prossima versione del programma e possano beneficiarne altri utenti. Ci si ricordi, di creare delle correzioni portabili, ovvero di non renderle specifiche per Debian o Linux (o altri Unix!), prima di inviarle. Questo renderà più semplice applicare le correzioni.

Da notare che non è necessario inviare i file debian/* all'autore originale.


3.4 Distinguere le librerie

C'è un altro problema comune: le librerie sono spesso diverse da piattaforma a piattaforma. Per esempio, il Makefile può contenere un riferimento a una libreria che non esiste nei sistemi Debian. In tal caso occorre cambiare il riferimento ad una libreria che serve allo stesso scopo e che esista in Debian.

Così, se c'è una riga nel Makefile del programma (o nel Makefile.in) che dice qualcosa tipo (e il programma non compila) [15]:

     LIBS = -lcurses -lsomething -lsomethingelse

Si cambi curses con ncurses e si salvi la correzione come debian/patches/ncurse.patch.

     $ quilt new ncurse.patch
     $ quilt add Makefile
     $ sed -i -e "s/-lcurses/-lncurses/g" Makefile
     $ quilt refresh
     $ quilt header -e
     ... describe patch

[ precedente ] [ Contenuti ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ successivo ]


Guida per il nuovo Maintainer

version 1.2.25, 2010-12-21 14:06:56 UTC

Josip Rodin joy-mg@debian.org
Traduzione: Calogero Lo Leggio kalos@nerdrug.org
Traduzione: Jacopo Reggiani jacopo.reggiani@gmail.com
Traduzione: Francesco P. Lovergine