[ precedente ] [ Contenuti ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ successivo ]
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.
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
.
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
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.
Il file Makefile
è conforme alle convenzioni GNU supportando la
variabile $(DESTDIR)
(/usr/share/doc/gnu-standards/standards.html#Makefile-Conventions
).
Il sorgente è conforme allo Standard di Gerarchia dei Filesystem (FHS)
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.
Correzione del bug riguardante il sorgente originale:
debian/patches/fix-gentoo-target.patch
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.
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-22 12:44:34 UTCjoy-mg@debian.org
kalos@nerdrug.org
jacopo.reggiani@gmail.com