Contact me sending an e-mail (antispam defense activated) |
Title: Pkgs - Compilare pacchetti sorgenti Author: Sandro Tosi Last modified: 2006-08-30 0. Introduzione =============== Debian fornisce principalmente pacchetti binari: sorgenti gia` compilati e pronti per essere installati. I pacchetti binari sono compilati per molte architetture hardware, ma in modo molto ``generico'': avere un pacchetto compilato per i386 mi consentira` di farlo girare sia su un Pentium I che su uno Xeon, magari pero` su quest'ultimo sarebbe possibile ottenere prestazioni decisamente migliori se ricompilassimo il codice per questo specifico processore. La politica Debian prevede che tutti i pacchetti binari devono essere generati a partire dai sorgenti originali del pacchetto, e che questi sorgenti, comprensivi delle modifiche effettuate perche' potessero essere compilati per Debian, siano disponibili come pacchetti sorgenti Debian. Questo ci consentono di ricompilare un certo pacchetto (invece di installarne la versione gia` compilata) in modo da poterlo ottimizzare o per applicare patch non presenti nei pacchetti binari. Prima di tutti bisogna inserire all'interno di /etc/apt/sources.list l'indirizzo di un repository dei sorgenti; solitamente, per i mirror ufficiali Debian, basta copiare la riga deb <url del server> <parametri> ed aggiungerne una simile: deb-src <url del server> <parametri> A questo punto: # apt-get update per scaricare la lista dei pacchetti dal nuovo repository (in generale, conviene eseguirlo prima di iniziare la compilazione di un pacchetto sorgente). Siamo dunque pronti per compilare un programma a partire dai pacchetti sorgenti Debian. 0.1. Composizione di un pacchetto sorgente ------------------------------------------ Un pacchetto sorgente Debian e` composto da tre file: filename.dsc un file descrittivo del pacchetto sorgente, contenente la prima parte di debian/control e la lista dei file che compongono il pacchetto sorgente, comprensiva di md5sum e dimensione (in byte) pkg.orig.gz questo e` lo stesso identico pacchetto (in realta` non e` proprio sempre uguale, ma non distraiamoci...) che possiamo trovare sul sito dell'autore del software pkg.diff.gz patch al sorgente originale necessarie per poter inserire il pacchetto nei repository Debian; contiene l'intera directory debian/ e piu` tutte le modifiche apportate al sorgente (anche se e` una pratica sconsigliata) 0.2. Opzioni di compilazione --------------------------- Per utilizzare ottimizzazioni diverse da quelle di default, si devono impostare le seguenti tre variabili d'ambiente (nell'esempio quello che potrei impostare io con un athlon-tbird): CHOST="i686-pc-linux-gnu" CFLAGS="-march=athlon-tbird -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=athlon-tbird -O3 -pipe -fomit-frame-pointer" prima di effettuare il build del pacchetto. 1. apt-build ============ Il metodo piu` semplice per compilare un pacchetto sorgente e` tramite apt-build. Di sintassi simile ad apt-get, per compilare un pacchetto basta eseguire # apt-build install <pkg> Prima di fare questo, conviene comunque configurarlo a dovere, modificando il file /etc/apt/apt-build.conf perche' rispecchi la propria macchina. Purtroppo apt-build e` un software ancora immaturo, e non sempre riesce a compilare alcuni pacchetti (in pratica dopo aver fatto il download dei source da` un errore: non riesce ad entrare in una directory); e` possibile bypassare il baco modificando lo script di apt-build per ogni pacchetto che ha questo problema (si trovano maggiori dettagli nel Debian Bug Traking System, http://bugs.debian.org ). 1.1. Rebuild dell'intera distribuzione -------------------------------------- apt-build fornisce la possibilita` di ricompilare l'intera distribuzione, tramite il comando # apt-build world che nell'help viene proprio indicato come world - Rebuild and reinstall all packages on your system che ricorda molto da vicino il ``make world'' di *BSD. Si consiglia di guardare questi due package, ccache e distcc, nel caso ci si voglia avventurare nel apt-build world. In aggiunta, leggendo dal file README.Debian: Q: How do I rebuild my whole system (apt-build world)? A: You must create a package list first. The simplest way to do it, is to run: dpkg --get-selections | \ awk '{if ($2=="install") print $1}' > /etc/apt/apt-build.list You should edit this file to remove some packages like gcc, kernel... Please note that using the --reinstall switch can be useful. 2. apt-get source ================= Un metodo un po' piu` lungo ma anche piu` sicuro e` il seguente: spostarsi nella directory temporanea da usare come ``banco di lavoro'' per creare il pacchetto # cd <tmp dir> si scarica il pacchetto sorgente con # apt-get source <pkg> dopo di che si installano i pacchetti necessari alla compilazione di quel pacchetto: # apt-get build-dep <pkg> si installano gli strumenti che i Debian Developers usano per compilare i pacchetti sorgenti: # apt-get install devscripts fakeroot build-essential alla fine, i troviamo nella directory corrente una directory <pkg>-<ver> ottenuta dal pacchetto sorgente # cd <pkg>-<ver> qui possiamo effettuare le modifiche, come applicare patch etc. Alla fine per generare il pacchetto binario eseguiamo: # debuild -us -uc -b per generare il pacchetto binario avremmo anche potuto lanciare: # dpkg-buildpackage -uc -us -b e troveremo nella directory padre il pacchetto binario generato. Per installarlo: # dpkg -i ../<binary generated pkg> Se non abbiamo necessita` di applicare patch o modificare il sorgente possiamo seguire questa strada, un po' piu` breve: # apt-get build-dep <pkg> # apt-get -b source <pkg> dove al posto dell'opzione -b, si puo` usare --build o --compile, tutte equivalenti per effettuare il build del pacchetto; poi, per installare il pacchetto generato # dpkg -i <binary generated pkg> Per fare i passi precedenti non e` necessario essere root (a parte l'installazione del pacchetto generato e delle dipendenze di build), ma possiamo eseguirli anche col nostro utente: # apt-get install fakeroot che ci consentira` di ``sembrare'' root ai tool che utilizziamo $ cd <tmp dir> $ fakeroot apt-get -b source <pkg> oppure $ apt-get source <pkg> $ cd <pkg>-<ver> $ dpkg-buildpackage -uc -us -b -rfakeroot in alternativa $ debuild -us -uc # dpkg -i <binary generated pkg> 2.1. Compilare usando debian/rules ---------------------------------- La directory debian/ contiene i file utilizzati per creare i pacchetti sorgenti e binari per Debian. Per compilare un pacchetto sorgente gia` scompattato, possiamo fare: $ cd pkg per compilare: $ ./debian/rules build per generare il pacchetto binario: $ fakeroot ./debian/rules binary 3. dget o partendo da sorgenti gia` scaricati ============================================= Consideriamo il caso in cui il pacchetto sorgente (comprensivo di tutti e tre i file) sia gia` presente sul sistema. Nel caso lo si dovesse scaricare da un sito (si tratta dunque di un pacchetto non incluso nei repository Debian) un tool molto interessante che ci puo` venire in contro e` dget: $ dget <url to filename.dsc> che scarica i file <pkg>.orig.gz, filename.dsc e <pkg>.diff.gz dall'url che riceve come parametro. Una volta scaricato, possiamo eseguire $ dpkg-source -x <filename>.dsc che scompatta <pkg>.orig.gz e gli applica <pkg>.diff.gz . A questo punto, possiamo seguire gli stessi passi usati in precedenza. 4. Altri Riferimenti ==================== - diversi messaggi di Hugh Hartmann sulla mailing list debian-italian - http://www.debian-administration.org/articles/20 - Debian FAQ: 6.13 How do I install a source package? |