Ceci est une ancienne révision du document !
S'il vous semble qu'il faut garder cette page separée, merci de la deplacer a la racine.
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, etc.).
- Si vous voulez recompiler un logiciel qui est déjà dans les dépôts et dont les sources sont disponibles il y a plus simple et plus propre : recompiler_un_logiciel_des_depots
Présentation des sources
Commençons par regarder un bout de code source en 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 ou 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). La bibliothèque « libfltk1.1 » contient les fichiers nécessaires à l'exécution d'un programme se servant de cette bibliothèque (voir ce paquet), c'est-à-dire des fichiers « .so.x.y » installés dans « /usr/lib ». La bibliothèque « libfltk1.1-dev » contient les fichiers nécessaires à la compilation (les fameux fichiers « .h » que l'on a évoqué tout à l'heure (voir ce paquet).
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 soi sont inclues 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 nettoyer une éventuelle compilation :
make clean
- pour configurer :
./configure
- pour compiler :
make
- pour installer (nécessite les droits d'administration) :
sudo make install
- pour désinstaller (nécessite les droits d'administration) :
sudo make uninstall
Retrouver les bibliothèques manquantes
Il y a trois méthodes pour retrouver les bibliothèques manquantes :
- selon les dépendances du paquet ;
- selon les erreurs de « ./configure » ;
- selon le fichier « configure.ac ».
Les dépendances du paquet
Tout paquet Debian/Ubuntu qui se respecte liste toutes les dépendances qui lui sont nécessaires tant à l'exécution comme à la compilation. La manière la plus simple de télécharger les dépendances est d'utiliser apt-get avec l'option build-dep, ainsi la commande :
sudo apt-get build-dep epdfview
Va s'occuper de télécharger toutes les dépendances nécessaires à la compilation du projet. Bien sûr cette technique ne fonctionne que si le paquet existe déjà .
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. 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 apparaitre. 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 langage machine) :
make
Installation
On va installer les fichiers avec :
sudo make install
Ça va installer les fichiers nécessaires (l'exécutable, les images, et quelques autre fichiers) dans « /usr/local ». Cela nécessite donc les droits d'administration.
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 ». Ça 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
Ressources
- Une foire aux questions est disponible.