Une compilation saine et heureuse sous GNU/Linux
Par Mathieu le mardi 19 octobre 2010, 09:14 - Informatique - Lien permanent
Ce billet était initialement une tentative de réponse à ce billet : http://theriault.servhome.org/2010/10/pourquoi-jaime-mais-nutilise-pas-linux/ où l'auteur décrivait entre autre sa détresse pour compiler un programme sous linux (si, si, cherchez bien, il y a une phrase où il le dit).
Ce billet va détailler les étapes que devrait faire tout programmeur ou utilisateur de logiciel soucieux de compiler un programme, soit parce qu'il n'existe pas en version exécutable, soit parce qu'il veut la version des sources. Voici donc quelques conseils et règles de savoir vivre.
1. Lisez le README
Lorsque vous téléchargez une source, ne vous contentez pas de décompresser l'archive, cherchez si il existe sur le site de l'éditeur des consignes pour compiler, lisez le fichier README qui est peut être inclut dans le code, lisez le fichier COMPILING, le fichier HOWTO, etc. En général ces fichiers sont n anglais, mais il est important de comprendre, au moins partiellement, ce qui est dit, pour comprendre pourquoi on reste bloqué.
Attention, certaines sources contiennent des instructions pour Linux, d'autres pur BSD, d'autres pour Windows, etc. Choisissez le fichier qui correspond à votre système d'exploitation, et même si il arrive que des instructions pour BSD fonctionnent sous GNU/Linux, ce n'est pas automatique.
2. Compiler, oui, mais avec make
En général les programmes sous GNU/Linux se compilent avec un Makefile. Un Makefile est une suite d’instructions contenant en général des appels vers GCC pour compiler le programme. Ce fichier est structuré par dépendances-cibles, et il permet de compiler un programme en exécutant les instructions dans le bon ordre, et de stopper si les prérequis ne sont pas remplis.
3. Les différents types d'automake
En général quand on compile un gros programme, le développeur n'a pas rédigé entièrement les instructions du Makefile, il a utilisé des programmes pour cela, de programmes comme les scripts des autotools (automake, etc), des trucs comme bam, ou encore comme cmake. Vous devez alors identifier ce qui a été utilisé (lisez le README et/ou les instructions sur le site) pour savoir quoi installer pour pouvoir lancer la compilation "automatique".
3.1 Les autotools
Les autotools sont des scripts qui créent à partir de règles les fichiers configure et Makefile nécessaire à la compilation. Le fichier configure est lui aussi important, en général on lance d'abord le configure pour vérifier que la compilation peut se dérouler et pour initialiser quelques variables qui vont changer le comportement du Makefile selon le système d'exploitation cible (emplacement des librairies, nom du compilateur, etc.). En général, on compile donc par cette suite de commandes :
./configure
make
make install
Ne faites make install que si vous voulez installer « en dur » le logiciel, attention, la version n'est pas vérifiée par le gestionnaire de paquet, et il faut garder les souces pour pouvoir faire un make uninstall plus tard.
Note sur les autotools : EN GENERAL, si vous compilez une version stable, c'est à dire si vous ne l'avez pas récupéré depuis un gestionnaire de version (subversion, git, mercurial...), il n'est pas nécessaire de lancer autoconf et automake, et on peut s'en tenir au simple configure et make, le reste est fait par le responsable de la distribution des sources. Par contre, si vous compilez une version de développement (trunk, etc), vous devrez probablement installer les autotools et lancer un autogen.sh pour créer les fichiers configure et Makefile, pour ensuite compiler avec configure et make.
3.2 CMake
CMake est un script qui a été conçu à l'origine pour répondre à la complexité d'écriture des règles des autotools. Son fonctionnement est similaire à automake, mais la compilation se fait en une seule commande, il suffit de créer un répertoire build où se trouvera le programme, de se placer à l'intérieur, puis de lancer la commande cmake avec en paramètre le chemin du dossier contenant les sources. Typiquement :
mkdir build
cd build
cmake ..
3.3 Bam
J'ai découvert bam en compilant Teeworlds, bam est un script assez similaire à cmake, ou presque, pusiqu'il marche à l'envers. Il faut se placer dans le dossier contenant les sources et appeler bam avec les bons paramètres (en général c'est indiqué dans le README).
cd sources
../bam-0.2/bam release
4. Prérequis non satisfaits : « ça plante au configure »
Il est très probable si vous compilez pour la première fois que vous n'ayez pas toutes les dépendances requises, et que vous deviez télécharger quelques dizaines de méga octet de packages juste pour pouvoir compiler. Pour essayer d'aller plus vite, vous pouvez installer le paquet « build-essentials » de votre distribution, il contient en général les dépendances vers le compilateur C, et quelques autres outils, mais il a pour vocation de fournir de quoi créer des packages et contient donc beaucoup de superflus pour une compilation classique.
De manière générale, le configure vous dit ce qu'il manque, ou alors c'est indiqué dans les instructions de compilation (README), et si jamais e n'est pas indiqué, si le programme demande SDL/SDL.h vous saurez qu'il vous manque libsdl-dev, par exemple. Les librairies c'est toujours, en général, libmachin-dev.
5. Problème fréquent : les versions
Il est fréquent qu'une compilation plante sans raison, juste en affichant « this function does not exists
», alors que l'on a bien les librairies de développement. En général, c'est parce que le programme demande une version des librairies plus récente que celle que vous possédez, et donc vous ne pouvez pas le compiler, à moins de télécharger les nouvelles versions de ces librairies. En général dans ce cas je laisse tomber, et je met à jour ma distribution. ;)
6. Cas particulier : Compilation et patch d'un programme présent dans les dépôts
Petite parenthèse, vous pourriez avoir envie de compiler un programme déjà présent dans les dépôts, et de simplement le patcher pour avoir la version à jour (celle des dépôts étant ancienne), vous avez de la chance, en général c'est plus simple :
- Installez build-essentials
apt-get instal build-essentials
- Récupérez la source du programme depuis les dépôts
apt-get source le programme
- Récupérez le nécessaire pour la compilation (c'est magique)
apt-get build-dep leprogramme
- Patchez le programme
- Utilisez les scripts debuild (sous debian) pour recompiler le package :
debuild -us -uc
- Installez finalement le package généré :
dpkg -i *.deb
7. Pour conclure
En conclusion je dirais qu'il est toujours difficile de compiler la première fois, surtout si on ne l'a jamais fait, il faut de la persévérance pour avoir envie d'ajouter tout ce qui manque, interpréter tout ce qui ne fonctionne pas, comprendre la documentation (si elle existe). Mais une fois terminé, non seulement vous ressentirez la fierté partenelle d'avoir compilé votre premier programme, mais vous pourrez aussi le recompiler autant de fois que vous voulez, puisque la procédure reste toujours à peu près la même pour le même programme.
Ce que je conseille c'est de se faire des "fiches", de la doc sur "ha oui, pour compiler ça j'ai bloqué là et j'ai résolu comme ça", d'abord pour vous, et si c'est utile pour d'autres gens tant mieux. ;)