Ceci est une ancienne révision du document !


Cette page fait doublon avec http://doc.ubuntu-fr.org/tutoriel/compilation . Merci de fusionner les elements interessants puis de la supprimer (attention aux backlinks).

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.

  • 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

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.

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). FIXME

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.

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

  • projets/paquets/compiler_un_programme.1247540447.txt.gz
  • Dernière modification: Le 14/07/2009, 05:00
  • par YannUbuntu