[ precedente ] [ Contenuti ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ successivo ]


APT HOWTO
Capitolo 5 - Compilazione dei sorgenti


5.1 Recupero dei pacchetti sorgente

È cosa comune nel mondo del software libero studiare il codice sorgente e farci delle correzioni nel caso contenga dei bug. Compilare i sorgenti può essere utile anche per attivare delle funzionalità che sono disattivate nel pacchetto ufficiale o per disattivare qualcosa che è stata attivata. APT fornisce un modo semplice per scaricare i sorgenti dei programmi che fanno parte della distribuzione, compresi i file necessari per creare il pacchetto .deb.

Un altro uso comune dei sorgenti è compilare su una distribuzione stable i pacchetti di testing o di unstable dato che quelli presenti in quest'ultime sono più recenti. Infatti, compilando un pacchetto su stable, sarà creato un .deb le cui dipendenze sono automaticamente aggiustate per operare in questa distribuzione.

Per farlo deve essere specificata almeno una riga deb-src in /etc/apt/sources.list che punti ai pacchetti di testing o di unstable. Vedere Il file /etc/apt/sources.list, Sezione 3.1.

Aptitude, il gestore di pacchetti Debian, è ottimizzato per i pacchetti binari. Per maneggiare i pacchetti sorgente si deve usare apt-get al suo posto. Per scaricare un pacchetto sorgente si può usare il seguente comando:

     $ apt-get source nomepacchetto

Questo scaricherà tre file: un .orig.tar.gz, un .dsc e un .diff.gz. Nel caso di un pacchetto nativo per Debian, l'ultimo fra quelli elencati non è scaricato e al primo della lista mancherà ".orig" nel nome.

Il file .dsc è usato da dpkg-source per decomprimere il pacchetto sorgente nella directory nomepacchetto-versione. Dentro tutti i pacchetti sorgente, una volta scompattati, c'è dentro una directory debian/ che contiene i file necessari per la costruzione del pacchetto .deb.

Per automatizzare la costruzione del pacchetto, dopo aver scaricato i sorgenti, è sufficiente aggiungere l'opzione -b nella riga di comando:

     $ apt-get -b source nomepacchetto

Se dopo aver scaricato il pacchetto non si vuole creare il .deb si può farlo successivamente con il seguente comando eseguito all'interno della directory che è stata creata per il pacchetto dopo averlo scaricato:

     $ dpkg-buildpackage -rfakeroot -uc -b

Notare che per compilare la maggior parte dei pacchetti sono necessari almeno i seguenti pacchetti: devscripts, dpkg-dev, debhelper e fakeroot; controllare Installazione e reinstallazione dei pacchetti, Sezione 4.4 e installarli prima di andare avanti. Molti pacchetti dipendono anche dagli strumenti di compilazione, quindi può essere utile installare anche il pacchetto build-essential. Altri pacchetti possono necessari, vedere Pacchetti necessari alla compilazione di un pacchetto sorgente, Sezione 5.2 per maggiori informazioni.

Per installare i pacchetti compilati con i comandi precedenti si deve usare direttamente il gestore di pacchetti, si consulti Installazione di pacchetti scaricati manualmente o creati in locale, Sezione 4.5. Uno strumento utile è fornito nel pacchetto devscripts: debi. Se si esegue debi all'interno della directory con i sorgenti del pacchetto, il programma cerca il file .changes nella directory superiore per scoprire quali pacchetti binari sono prodotti e poi esegue dpkg per installarli. Questo programma non è molto utile se il pacchetto sorgente produce pacchetti binari in conflitto fra loro. Ovviamente sono necessari i poteri di root per effettuare quest'operazione.

C'è una differenza fra il metodo source e gli altri messi a disposizione da apt-get: tale metodo può essere usato da tutti gli utenti senza che questi abbiano i privilegi di root. I file sono scaricati nella directory dalla quale è stato lanciato il comando apt-get source pacchetto.


5.2 Pacchetti necessari alla compilazione di un pacchetto sorgente

Normalmente per compilare un pacchetto sorgente è necessario aver installato header e librerie appropriate. Tutti i pacchetti sorgente hanno nei loro file di controllo un campo chiamato "Build-Depends:" che indica quali pacchetti devono essere installati per costruire il pacchetto dai sorgenti. Inoltre sono necessari altri pacchetti di base, vedere Recupero dei pacchetti sorgente, Sezione 5.1 prima di continuare.

APT possiede un metodo veramente semplice per scaricare questi pacchetti. È sufficiente lanciare apt-get build-dep pacchetto, dove "pacchetto" è il nome del pacchetto che si vuole compilare. Per esempio:

     # apt-get build-dep gmc
     Reading Package Lists... Done
     Building Dependency Tree... Done
     The following NEW packages will be installed:
       comerr-dev e2fslibs-dev gdk-imlib-dev imlib-progs libgnome-dev libgnorba-dev
       libgpmg1-dev 
     0 packages upgraded, 7 newly installed, 0 to remove and 1  not upgraded.
     Need to get 1069kB of archives. After unpacking 3514kB will be used.
     Do you want to continue? [Y/n]

Saranno installati i pacchetti necessari per la corretta compilazione del pacchetto gmc. È importante notare che questo comando non recupera il pacchetto sorgente che si vuole compilare, per scaricarlo va eseguito prima apt-get source.

Se invece si è interessati solo a controllare quali pacchetti sono necessari per compilare un certo pacchetto c'è una variante del comando apt-cache show (vedere Informazioni sui pacchetti, Capitolo 6), che mostra fra le varie informazioni la riga Build-Depends in cui sono elencati questi pacchetti.

     # apt-cache showsrc pacchetto

5.3 Creazione di un pacchetto per il debug

Se si vuole creare un pacchetto con lo scopo di fare del debug, per esempio per segnalare un bug o per correggerne uno, si possono usare delle semplici variabili di ambiente supportate dalla maggioranza dei pacchetti Debian.

Per compilare un pacchetto che contiene dei binari completi[6] tutto ciò che si deve fare è usare il prefisso DEB_BUILD_OPTIONS=nostrip. Le ottimizzazioni possono anche complicare il debug, si possono disattivare aggiungendo la stringa noopt sempre alla variabile DEB_BUILD_OPTIONS. Per esempio:

     $ DEB_BUILD_OPTIONS="nostrip noopt" dpkg-buildpackage -rfakeroot -uc -b

5.4 Personalizzazione della compilazione di un pacchetto

Se si vuole personalizzare il modo con cui viene compilato un pacchetto è necessario modificare il file debian/rules. Questo significa che dentro la directory principale creata quando sono stati estratti i sorgenti del pacchetto c'è una directory debian che contiene molti file, uno di questi è speciale: il file rules.

Questo file è solitamente un Makefile con target per configurare, compilare, installare e creare il pacchetto. Per esempio, per avere luola[7] compilato senza suono si può, dopo aver scaricato e estratto i sorgenti, modificare il file debian/rules:

     [...]
     configure: configure-stamp
     configure-stamp:
     	dh_testdir
     	# Add here commands to configure the package.
     	./configure $(confflags) \ 
     	 	--prefix=/usr         \ 
     	 	--mandir=share/man    \ 
     	 	--infodir=share/info  \ 
     	 	--datadir=share/games \ 
     	 	--bindir=games        \ 
     	 	--enable-sound
     #	 	 --enable-sdl-gfx
     
     	touch configure-stamp
     [...]

Notare l'opzione --enable-sound, rimuovendola o sostituendola con --disable-sound e poi ricompilando il pacchetto con la tecnica descritta in Recupero dei pacchetti sorgente, Sezione 5.1 si ottiene il pacchetto luola con i suoni disattivati.

Se veramente si vuole maneggiare pacchetti sorgente quotidianamente si suggerisce la lettura di Debian New Maintainers Guide e di Debian Policy. Può essere utile anche la documentazione disponibile dall'Angolo degli Sviluppatori Debian.


5.5 Uso di materiale non-Debian

Qualche volta si vuole usare una specifica versione di un programma disponibile solo tramite i sorgenti, senza alcun pacchetto Debian ma questo può essere un problema per il sistema di gestione dei pacchetti. Supponiamo che si voglia compilare una nuova versione del server e-mail. Non ci sarebbero problemi, ma molti pacchetti di Debian dipendono da un MTA (Mail Transfer Agent) e, quando si installa qualcosa che abbiamo compilato in proprio, il sistema di gestione dei pacchetti non può sapere nulla del nuovo software.

Qui entra in scena equivs. Per usarlo installare il pacchetto omonimo. Equivs crea un pacchetto vuoto che è capace di soddisfare qualunque dipendenza, facendo credere al sistema di gestione dei pacchetti che le dipendenze sono soddisfatte.

Prima di iniziare è bene ricordare che esistono modi più sicuri per compilare un programma già impacchettato per Debian con opzioni differenti e che non si dovrebbe usare equivs per rimpiazzare le dipendenze se non si sa quali possono essere le conseguenze sul sistema. Vedere Recupero dei pacchetti sorgente, Sezione 5.1 per ulteriori informazioni.

Continuando con l'esempio del MTA: si è appena installato il neo-compilato postfix e ora si vuole installare mutt, però mutt richiede di installare un altro MTA. Ma ce ne già uno installato!

Cambiare directory (/tmp, per esempio) ed eseguire:

     # equivs-control nome

Mettere al posto di nome il nome del file di controllo da creare. Il file creato sarà il seguente:

     Section: misc
     Priority: optional
     Standards-Version: 3.5.10
      
     Package: <enter package name; defaults to equivs-dummy>
     Version: <enter version here; defaults to 1.0>
     Maintainer: Your Name <yourname@foo.com>
     Pre-Depends: <packages>
     Depends: <packages>
     Recommends: <packages>
     Suggests: <package>
     Provides: <(virtual)package>
     Architecture: all
     Copyright: <copyright file; defaults to GPL2>
     Changelog: <changelog file; defaults to a generic changelog>
     Readme: <README.Debian file; defaults to a generic one>
     Extra-Files: <additional files for the doc directory, commaseparated>
     Description: <short description; defaults to some wise words>
      long description and info
      .
      second paragraph

Ora è necessario modificarlo in modo che faccia quello che si vuole. Qui verrà descritto, con un esempio, il formato dei soli campi necessari, non c'è bisogno di esaminarli tutti.

     Section: misc
     Priority: optional
     Standards-Version: 3.0.1
     
     Package: mta-local
     Conflicts: mail-transport-agent
     Replaces: mail-transport-agent
     Provides: mail-transport-agent

È tutto. mutt dipende da mail-transport-agent, che è un pacchetto virtuale fornito da tutti i MTA, mta-local si "registra" da solo come un mail-transport-agent tramite il campo "Provides".

Anche i campi Conflicts e Replaces sono necessari, con questi APT e dpkg sono in grado di capire che devono rimuovere il pacchetto MTA attualmente installato in favore di quello nuovo.

Ora serve solo creare il pacchetto:

     # equivs-build nome
     dh_tstdir
     touch build-stamp
     dh_testdir
     dh_testroot
     dh_clean -k
     # Add here commands to install the package into debian/tmp.
     touch install-stamp
     dh_testdir
     dh_testroot
     dh_installdocs
     dh_installchangelogs
     dh_compress
     dh_fixperms
     dh_installdeb
     dh_gencontrol
     dh_md5sums
     dh_builddeb
     dpkg-deb: building package `nome' in `../nome_1.0_all.deb'.
     
     The package has been created.
     Attention, the package has been created in the current directory,

e installare il .deb risultante. Vedere Installazione di pacchetti scaricati manualmente o creati in locale, Sezione 4.5.

Come si può intuire ci sono diversi usi di equivs. Si può creare un pacchetto my-fovorites, che dipende dai programmi che abitualmente si installano, per esempio. Liberate la vostra immaginazione, ma con cautela.

Infine notare che ci sono vari esempi di file di controllo in /usr/share/doc/equivs/example.


[ precedente ] [ Contenuti ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ successivo ]


APT HOWTO

2.0.2 - October 2006

Gustavo Noronha Silva kov@debian.org

Traduzione di Luca Monducci