[ precedente ] [ Contenuti ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ A ] [ successivo ]
Normalmente, i programmi si auto-installano in sottodirectory di /usr/local I
pacchetti Debian invece non usano quella directory, dal momento che è riservata
agli amministratori (o utenti) del sistema per uso privato. Questo significa
che dovrai dare una occhiata al sistema di compilazione del programma, partendo
generalmente dal Makefile. Questo script sarà utilizzato da
make(1)
per creare automaticamente il programma. Per maggiori
dettagli sui Makefile dai una occhiata a Il
file `rules', Sezione 4.4.
Osserva che se il tuo programma utilizza l'utilità GNU automake(1)
e/o autoconf(1)
, questo significa che i sorgenti includono un
Makefile.am e/o Makefile.in rispettivamente, e avrai bisogno di modificare
questi ultimi file, poiché ogni esecuzione di automake provoca la riscrittura
di Makefile.in con informazioni generate a partire dal suo file Makefile.am, e
ogni esecuzione di ./configure farà lo stesso con il corrispondente Makefile,
con i dati ricavati dal file Makefile.in. Modificare i file Makefile.am
richiede qualche conoscenza di automake - del quale puoi leggere la relativa
documentazione in formato info - mentre modificare Makefile.in è molto simile a
modificare i Makefile, in più ponendo attenzione alle variabili, ovvero
qualsiasi stringa di caratteri compresa fra `@', come ad esempio @CFLAGS@ or
@LN_S@, che viene sostituita con l'effettivo valore ad ogni invocazione di
./configure. Assicurati di leggere
/usr/share/doc/autotools-dev/README.Debian.gz
prima di procedere.
Nota anche che in questo documento, non c'è spazio sufficiente per entrare in tutti i dettagli di come fare le modifiche, ma di seguito ecco alcuni problemi che spesso si incontrano.
La maggior parte dei programmi ha una qualche maniera di installarsi in una struttura di directory pre-esistente del tuo sistema, in modo che i binari vengano inclusi nel $PATH, e si possano trovare le pagine di manuale e i programmi in locazioni comuni. Tuttavia, se facessi questo, il programma sarebbe installato tra ogni altra cosa già presente sul tuo sistema. Questo renderebbe difficile per i programmi di pacchettizzazione capire quali file appartengono al tuo pacchetto e quali no.
Perciò dovrai fare qualcosa di diverso: installa il programma in una sotto-directory temporanea dalla quale gli strumenti di manutenzione costruiranno un pacchetto .deb operativo. Ogni file contenuto in tale directory sarà installato sul sistema dell'utente, quando questi installa il tuo pacchetto, la sola differenza è che dpkg installerà i file a partire dalla radice.
Questa directory temporanea è generalmente creata sotto la tua directory
debian/ nell'albero dei sorgenti spacchettato. Si chiama generalmente
debian/nomepacchetto
.
Tieni a mente che anche se avrai bisogno che il programma venga installato in debian/nomepacchetto, deve funzionare correttamente quando piazzato nella radice, cioè quando viene installato a partire dal pacchetto .deb. Così, non dovrai consentire che il sistema di compilazione inserisca stringhe come /home/me/deb/gentoo-0.9.12/usr/share/gentoo nei file del pacchetto. Con programmi che usano GNU autoconf, questo è piuttosto semplice, La maggior parte di questi programmi hanno makefile che sono creati per default per consentire installazioni in directory casuali, sebbene mantengano /usr (ad esempio) come prefisso canonico. Quando si accorgerà che il programma usa autoconf, dh_make fornirà i comandi per fare tutto questo automaticamente, per cui potresti saltare la lettura di questa sezione. Invece con altri programmi, dovrai probabilmente esaminare e modificare i Makefile.
Questa è la parte rilevante del Makefile di gentoo:
# Where to put binary on 'make install'? BIN = /usr/local/bin # Where to put icons on 'make install'? ICONS = /usr/local/share/gentoo/
Osserva che il file sono configurati per installare sotto
/usr/local
. Modifica questi percorsi in:
# 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 quella directory, e non altrove? Perchè i pacchetti Debian non
installano mai file sotto /usr/local
-- quella gerarchia è
riservata all'uso dell'amministratore di sistema. Tali file in sistemi Debian
vanno invece posti sotto /usr
.
Le locazioni più corrette per binari, icone, documentazione ecc. sono specificate nello Standard per la Gerarchia del Filesystem (vedi /usr/share/doc/debian-policy/fhs/). Ti raccomando di visionarlo e leggere le sezioni che possono riguardare il tuo pacchetto.
Così, dobbiamo installare i binari in /usr/bin invece di /usr/local/bin, la pagina di manuale in /usr/share/man/man1 invece di /usr/local/man/man1, ecc. Nota come non ci sia una pagina di manuale menzionata nel makefile di gentoo, ma dal momento che la Policy Debian richiede che ogni programma ne abbia una, ne faremo una più in là e la installeremo in /usr/share/man/man1.
Ma perché in quella directory e non in qualche altra? Perchè Debian ha definito alcune regole su dove i programmi devono essere installati. Questo è specificato nello Standard della Gerarchia del Filesystem (vedi /usr/share/doc/debian-policy/fhs/). Così dovremmo installare il binario in /usr/X11R6/bin invece che in /usr/local/bin e le pagine di manuale (non esistono in questo caso, ma quasi ogni programma ne ha una, per cui ne faremo una dopo) in /usr/share/man/man1 invece che in /usr/local/man/man1.
Alcuni programmi non usano variabili di makefile per definire percorsi come questi. Questo significa che potrai dover editare alcuni sorgenti C allo scopo di correggerli per usare le locazioni giuste. Ma dove e come cercarle? Puoi trovarle eseguendo:
grep -rn usr/local/lib *.[ch]
Grep eseguirà ricorsivamente sull'albero dei sorgenti e ti dirà il nome di un file e la riga in esso quando trova una occorrenza.
Edita questi file e in quelle righe sostituisci /usr/local/* con usr/* -- e questo e tutto. Fa attenzione a non sconvolgere il resto del codice! :-)
Dopo di questo, dovresti trovare il target install (cerca la riga che inizia con `install:') e rinomina tutti i riferimenti a directory diverse da quelle definite all'inizio del Makefile. In precedenza, il target install di gentoo diceva:
install: gentoo install ./gentoo $(BIN) install icons $(ICONS) install gentoorc-example $(HOME)/.gentoorc
Dopo la modifica invece:
install: gentoo-target install -d $(BIN) $(ICONS) $(DESTDIR)/etc install ./gentoo $(BIN) install -m644 icons/* $(ICONS) install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc
Avrai sicuramente notato che c'è adesso un comando install -d prima degli altri nella regola. Il makefile originale non ce l'ha perchè generalmente /usr/local/bin e le altre directory già esistono sul sistema su cui si lancia `make install`. Tuttavia, dal momento che installeremo nella nostra directory vuota (o anche inesistente), dovremo creare ogni singola directory.
Possiamo anche aggiungere altre cose alla fine della regola, come l'installazione di documentazione che l'autore upstream talvolta omette:
install -d $(DESTDIR)/usr/share/doc/gentoo/html cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html
Se sei un lettore attento, avrai notato che ho modificato `gentoo' in `gentoo-target' nella riga `install:'. Questo è quello che si definisce un bug fix :-)
Qualora effettuassi delle modifiche che non sono specificatamente legate alla pacchettizzazione Debian, assicurati di inviarle all'upstream maintainer, in modo che possa includerle nella prossima revisione del programma e possano essere utili ad ogni altro. Ricorda anche di rendere i tuoi fix non specifici per Debian o Linux (o anche Unix!) prima di inviarli -- rendili portabili. Questo renderà la tua correzione molto più semplice da applicare.
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 in sistemi Debian. In tal caso occorre modificarlo in una libreria che esiste in Debian, e serva allo stesso scopo.
Così, se c'è una riga nel Makefile del programma (o nel Makefile.in) che dice qualcosa del tipo (e il programma non compila):
LIBS = -lcurses -lsomething -lsomethingelse
Modificala come segue, e molto probabilmente funzionerà:
LIBS = -lncurses -lsomething -lsomethingelse #LIBS = -lcurses -lsomething -lsomethingelse
(L'autore si rende conto che questo non è il migliore esempio considerato che il nostro pacchetto libncurses adesso è distribuito con un link simbolico libcurses.so, ma non gliene veniva uno migliore. Suggerimenti sono benvenuti :-)
[ precedente ] [ Contenuti ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ A ] [ successivo ]
Guida per il nuovo Maintainer
versione 1.2.3, 18 January 2005.joy-mg@debian.org
frankie@debian.org