Home Page

Tips page
c
cellulari
debian

*Gestione degli init scripts
*Lilo personalizzato con immagini Debian
*Pkgs - apt e MMap ran out of room
*Pkgs - apt-get ed i Super Cow Powers
*Pkgs - apt-get e resume dei download
*Pkgs - apt-listbugs ed evitare problemi all'installazione
*Pkgs - apt-show-versions
*Pkgs - Autocompletamento dei pacchetti con apt-get
*Pkgs - Auto-installazione delle dipendenze di compilazione
*Pkgs - Cercare in quale pacchetto e` contenuto un file
*Pkgs - Cercare i pacchetti
*Pkgs - Clonare un'installazione
*Pkgs - Come installare un pacchetto
*Pkgs - Compilare pacchetti sorgenti
*Pkgs - Contenuto di un pacchetto
*Pkgs - Cosa e` un meta-pacchetto (ed un dummy package)
*Pkgs - Differenza tra upgrade e dist-upgrade
*Pkgs - Elenco dei pacchetti
*Pkgs - Eliminare i pacchetti inutilizzati
*Pkgs - File contenuti in un pacchetto installato
*Pkgs - Importare la chiave di un repository
*Pkgs - Installare un pacchetto di una certa versione
*Pkgs - Mettere in hold un pacchetto
*Pkgs - Nome di un pacchetto
*Pkgs - Pacchetti riconfigurabili
*Pkgs - Pacchetti virtuali
*Pkgs - Ricomporre un pacchetto sorgente
*Pkgs - Rimuovere i pacchetti scaricati
*Pkgs - Rimuovere pacchetti
*Pkgs - Risolvere problemi nell'installazione
*Pkgs - Scegliere il mirror migliore
*Pkgs - Upgrade e downgrade del sistema
*Pkgs - Verificare se un pacchetto e` installato

egittologia
emacs
emacs-latex
hardware
html
inglese
java
latex
linux
matlab
misc
mysql
network
octave
programming
python
security
sed
tech
webapps
windows

University Page

Programming

Debian & Linux

Some works

About me

Del.icio.us Bookmarks

BOINC Combined Statistics

Site Statistics

Contact me sending an e-mail (antispam defense activated)

debian

hacker emblem

blogger

GeoURL

View Sandro Tosi's profile on LinkedIn

This is my Google PageRank

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?