|
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?
|