Ceci est une ancienne révision du document !
Version Dapper
Rédigé par youp à la deuxième séance de formation organisé le 30 septembre par Gloubiboulga sur le canal IRC #ubuntu-fr-classroom. Encore merci à lui pour cette initiative
Une Foire Aux Questions est disponible.
Compiler un programme
La compilation des sources d'un programme est rarement compliquée. En général quelques commandes suffisent pour compiler et installer un logiciel. Le plus pénible est certainement de trouver et d'installer toutes les dépendances requises pour la compilation. On va surtout s'attarder sur les sources utilisant les autotools comme système de compilation, et vous proposer quelques astuces pour vous simplifier la vie. Ce petit topo a pour objectif de fournir des outils et des astuces pour trouver les dépendances.
Pré-requis
- Il faut activer les dépôts source dans votre
sources.list
(dépôts commençant par deb-src, voir cette page pour de plus amples explications).
- L'installation du paquet build-essential est aussi nécessaire, il contient tous les outils de compilation nécessaires (libc6-dev, make…) :
sudo apt-get install build-essential
Présentation des sources
Commençons par regarder un bout de code source en C : http://gauvain.tuxfamily.org/school/2006-09-30/exemples/source.c. Les trois lignes commençant par "#include" sont des appels à d'autres fichiers : * mousepad.h (écrit entre guillemets doubles) est un fichier fourni avec les sources du logiciel ; * gtk/gtk.h et glib.h (écrits entre < et >) sont des fichiers qui doivent être présents sur le système lors de la compilation.
Ces fichiers sont de manière générale installés dans /usr/include (le nom du dossier n'est pas anodin). Tout ça importe peu quand on compile/installe, mais ça peut cependant être utile de savoir ce que veulent dire ces mots clés, en cas d'un éventuel problème de compilation.
Les bibliothéques
Les fichiers appelés par les programmes en C sont des parties de bibliothèques (traduction de "library"). Les bibliothèques sont des ensembles de fonctions (des mini-programmes qui effectuent une tâche précise, par exemple réunir deux mots en un seul, afficher une image, réagir lorsqu'on clique…) qui n'ont pas besoin d'être réécrites à chaque fois que quelqu'un veut développer un logiciel. Par exemple, les bibliothèques GTK et Qt dépendent toutes deux de libpng, qui sert à manipuler des images .png (pour un résultat totalement différent).
Chez Ubuntu (comme sur toutes les distributions basées sur debian), les bibliothèques sont dispatchées dans plusieurs paquets (2 au minimum). Prenons l'exemple de libfltk. Elle est installée dans libfltk1.1 et dans libfltk1.1-dev (libfltk1.1 et libfltk1.1-dev étant les noms des paquets, installables via apt). libfltk1.1 contient les fichiers nécessaires à l'exécution d'un programme se servant de cette bibliothèque (http://packages.ubuntu.com/cgi-bin/search_contents.pl?searchmode=filelist&word=libfltk1.1&version=dapper&arch=i386), c'est à dire des fichiers .so.x.y installés dans /usr/lib. libfltk1.1-dev contient les fichiers nécessaires à la compilation (les fameux fichiers .h que l'on a évoqué tout à l'heure (http://packages.ubuntu.com/cgi-bin/search_contents.pl?searchmode=filelist&word=libfltk1.1-dev&version=dapper&arch=i38).
Pour chaque bibliothèque existante dans Ubuntu, il existe un paquet dont le nom finit par -dev, qu'il est nécessaire d'installer pour compiler les logiciels qui dépendent de cette bibliothèque.
Exemple pratique : compilation d'epdfview
Ouvrez un terminal, et créez un dossier ~/source :
mkdir ~/sources && cd ~/sources
On va compiler epdfview dont on va récupérer les sources dans les dépôts avec :
apt-get source epdfview
Vous allez trouver un .orig.tar.gz, qui est en fait le .tar.gz d'origine (disponible sur le site officiel d'ePDFView), dont seul le nom diffère.
Un dossier epdfview-<version>
est présent, dans lequel nous allons nous placer avec la commande
cd epdfview-<tab>
Si ce dossier n'est pas présent, décompressez l'archive grâce à :
tar zxvf epdfview*.orig.tar.gz && cd epdfview-<tab>
Regardons alors ce qu'il y a dans ce dossier avec :
ls
Les sources en soit sont incluses dans le dossier src/ . Le dossier po/ contient les traductions et vous avez tout un tas de fichiers qui vont servir à la compilation. Peu importe leur contenu, la plupart sont des scripts de plusieurs milliers de lignes permettant à l'utilisateur de facilement compiler les sources.
Compiler et installer se fait tout simplement en exécutant : - pour configurer :
./configure
- pour compiler :
make
- pour installer (nécessite les droits root)
sudo make install
Retrouver les bibliothèques manquantes
Il y a deux méthodes pour retrouver les bibliothèques manquantes:
- selon les erreurs de './configure'
- selon le fichier 'configure.ac'.
les erreurs de './configure'
Si les dépendances ne sont pas installées, l'étape de configuration ('./configure') n'ira pas jusqu'au bout et vous donnera un message d'erreur indiquant ce qui manque. Cela peut être le cas ici, prenons l'exemple de la dépendance manquante "gtk+-2.0" On nous indique alors :
No package 'gtk+-2.0' found
On sait que l'on cherche un paquet -dev puisque seuls les paquets -dev sont aptes à la compilation. Donc on va utiliser la commande:
apt-cache search --names-only gtk dev
L'option –names-only permet de faire abstraction des descriptions des paquets pour la recherche.
Il y a beaucoup de résultat pour pouvoir choisir le bon paquet. Mais on sait que l'on recherche une dépendance bibliothèque, donc on va réduire le nombre de résultats avec :
apt-cache search --names-only libgtk dev
Enfin, dernier indice, c'est que c'est gtk 2 que l'on recherche, donc : On lance la recherche avec
apt-cache search --names-only libgtk2 dev
Ce qui nous donne le résultat :
libgtk2.0-dev - Development files for the GTK+ library
Le paquet manquant était : libgtk2.0-dev On installe donc ce paquet avec aptitude de préférence, pour pouvoir le supprimer facilement ensuite (apt-get ne supprimant pas toutes les dépendances installées par la suite).
le fichier configure.ac
Pour trouver les dépendances on a utilisé les erreurs de ./configure, mais il y a plus simple et plus rapide.
Ouvrez le fichier configure.ac avec un éditeur de texte
gedit configure.ac
ou
kate configure.ac
vous allez trouver ces lignes (non successives) :
PKG_CHECK_MODULES([GLIB], [gthread-2.0 >= $GLIB_REQUIRED]) PKG_CHECK_MODULES([GTK2], [gtk+-2.0 >= $GTK2_REQUIRED]) PKG_CHECK_MODULES([POPPLER], [poppler-glib >= $POPPLER_REQUIRED gdk-2.0 >= $GTK2_REQUIRED pango])
Et on a ici les dépendances requises :)
On peut ensuite utiliser la technique de tout à l'heure pour trouver les paquets correspondants
le paquet contenant 'gthread' peut être trouvé de 2 façons:
- le fichier configure.ac sous-entend que ce gthread est contenu dans la bibliothèque glib, on recherche donc avec
apt-cache
; - on peut également utiliser 'apt-file' dont l'utilisation est détaillée plus loin.
Lors de l'exécution du ./configure, des "Checking foo… no" peuvent apparaître. Ce n'est pas grave. Le listage continue; s'il y a un vrai problème, le script s'arrête avec une erreur.
Compilation
Une fois toutes les dépendances trouvées et installées grâce à apt ou équivalent (dans notre cas libgtk2.0-dev
, libpoppler-glib-dev
et libglib2.0-dev
), les sources peuvent être compilées (c'est à dire traduites en language machine) :
make
Installation
On va installer les fichiers avec :
sudo make install
Ca va installer les fichiers nécessaires (l'exécutable, les images, et quelques autre fichiers) dans /usr/local. Cela nécessite donc les droits root.
Et voici le résultat:
david@Xarpoon:~/sources/epdfview-0.1.4$ epdfview
Vous pouvez tester en lançant epdfview
dans votre terminal.
Quelques commandes, quelques astuces, et quelques explications
Les autotools
En fait des autotools créent le fichier configure
des sources qui vérifie le système de l'utilisateur. Le fichier configure est un script exécutable, qui est dans votre dossier source il nécessite d'être exécuté avec ./.
make
est une commande, installée dans /usr/bin. Il suffit donc de taper son nom pour l'exécuter.
make
utilise le Makefile (qui lui est dans votre dossier source).
Les ./configure crée le Makefile à partir d'un Makefile.in (que vous avez dans les sources). Tout ça est créé à partir d'un fichier assez simple qu'écrit le développeur.
Les "autotools" sont un ensemble de scripts qui permettent de pouvoir gérer une procédure de configuration, compilation et installation très complexe à partir de quelques fichiers (relativement) simples.
Quelques commandes
'make'
make
peut être suivi d'un mot clé comme "install", "uninstall", "clean", "distclean". Ca permet d'appeler une fonction particulière du Makefile :
- 'make uninstall' permet de tout désinstaller ;
- 'make clean' nettoie les sources par exemple (en supprimant tout ce qui a été créé pendant la compilation) ;
- 'make distclean' fait la même chose en supprimant en plus les Makefile, le code source reste. Cela redonne les sources comme on les a eues après avoir décompressé l'archive.
'apt-file'
Apt-file est une application qui recherche des fichiers présents à l'intérieur de paquets, même si ceux-ci ne sont pas installés. C'est donc très pratique pour trouver des dépendances. Pour l'installer, lancez la commande :
sudo apt-get install apt-file
On l'initialise ensuite comme pour apt-get en tapant :
sudo apt-file update
Dans notre exemple de tout à l'heure, on voulait trouver dans quel paquet se trouve la bibliothèque libgthread, on tape alors :
apt-file search libgthread
Le paquet recherché est donc soit libglib2.0-dev soit libglib1.2-dev.
On peut préciser la recherche avec apt-file search libgthread-2.0
Il se base sur le sources.list.
The contents packages are fetched from the location(s) specified in /etc/apt/sources.list.
Les options de configuration
Si vous lancez :
./configure --help
Vous verrez tout ce que vous pouvez modifier comme options. Certains programmes ont de nombreuses options de compilation.
Par exemple './configure –prefix=/usr' installera les fichiers dans /usr/ au lieu de /usr/local (utilisé par défaut). Lancer `./configure –help` avant la compilation est toujours une bonne idée (regardez mplayer par exemple, à l'occasion).
Un problème courant
Il arrive que les ./configure soient mal faits, et une erreur du type :
gtk/gtk.h: cannot find the file
peut survenir lors de la compilation. C'est apt-file qui sera votre plus sûr allié dans un tel cas :
apt-file search gtk/gtk.h