Configuration

Un intérêt purement technique du fait de disposer des sources est le portage du logiciel. Un logiciel libre développé pour un UNIX® est utilisable sur tous les UNIX® existants (libres ou propriétaires), avec quelques modifications voire aucune. Ceci implique une configuration du logiciel juste avant la compilation.

Il existe plusieurs systèmes de configuration. Il va falloir utiliser celui que l'auteur du logiciel a prévu (parfois, plusieurs sont au programme). Généralement, vous pouvez :

Autoconf

Principe

AutoConf permet de configurer correctement un logiciel. Il crée les fichiers nécessaires à la compilation (par exemple, Makefile), et modifie parfois directement les sources (comme par le biais d'un fichier config.h.in).

Le principe d'AutoConf est simple :

  • l'auteur du logiciel sait quels tests sont nécessaires pour configurer son logiciel (ex : « quelle version de cette bibliothèque est utilisée ? »). Il les écrit dans un fichier nommé configure.in, en suivant une syntaxe précise;

  • il exécute AutoConf. Ce dernier génère, à partir du fichier configure.in, un script de configuration appelé configure. Ce script est celui qui effectuera les tests nécessaires à la configuration du programme;

  • l'utilisateur final exécute ce script, et AutoConf se charge de configurer tout ce qui est nécessaire à la compilation.

Exemple

Un exemple d'utilisation d'AutoConf :

$ ./configure
loading cache ./config.cache
checking for gcc... gcc
checking whether the C compiler (gcc  ) works... yes
checking whether the C compiler (gcc  ) is a cross-compiler... no
checking whether we are using GNU C... yes
checking whether gcc accepts -g... yes
checking for main in -lX11... yes
checking for main in -lXpm... yes
checking for main in -lguile... yes
checking for main in -lm... yes
checking for main in -lncurses... yes
checking how to run the C preprocessor... gcc -E
checking for X... libraries /usr/X11R6/lib, headers /usr/X11R6/include
checking for ANSI C header files... yes
checking for unistd.h... yes
checking for working const... yes
updating cache ./config.cache
creating ./config.status
creating lib/Makefile
creating src/Makefile
creating Makefile

Dans le cas où on désirerait avoir un peu plus de contrôle sur ce qu'engendre la commande configure, on peut lui passer des options via la ligne de commande ou des variables d'environnement. Exemple :

$ ./configure --with-gcc --prefix=/opt/GNU

ou encore (sous bash) :

$ export CC=`which gcc`
$ export CFLAGS=-O2
$ ./configure --with-gcc

ou :

$ CC=gcc CFLAGS=-O2 ./configure

Et si... cela ne fonctionne pas ?

Typiquement, il s'agit d'une erreur du style configure: error: Cannot find library guile (configure: erreur: je n'arrive pas à trouver la bibliothèque guile) (la plupart des erreurs de configure ressemblent à cela).

Cela indique que le script configure n'a pas réussi à trouver une bibliothèque (dans notre exemple, la bibliothèque guile). Le principe est que le script configure compile un petit programme de test qui utilise cette bibliothèque. S'il n'arrive pas à le compiler, c'est qu'il n'arrivera pas à compiler le logiciel. D'où l'erreur !

  • Regardez d'où vient l'erreur rencontrée en examinant la fin du fichier config.log, qui contient une trace de toutes les étapes de la configuration. Le compilateur de langage C est généralement assez explicite dans ses messages d'erreur. Cela vous aidera à résoudre le problème.

  • Vérifiez que la bibliothèque en question est bien installée. Si ce n'est pas le cas, installez-la (à partir des sources ou d'un binaire précompilé) et exécutez à nouveau le script configure. Une méthode efficace pour vérifier l'installation est de rechercher le fichier matérialisant la bibliothèque, qui porte invariablement le nom lib<nom>.so. Par exemple,

    $ find / -name 'libguile*'

    ou encore :

    $ locate libguile

  • Vérifiez que la bibliothèque est accessible au compilateur. Cela veut dire qu'elle se trouve dans un répertoire parmi : /usr/lib, /lib, /usr/X11R6/lib; ou parmi ceux spécifiés par la variable d'environnement LD_LIBRARY_PATH (expliquée dans la section intitulée « Et si ça ne fonctionne pas ? », partie b). Vérifiez que ce fichier est bien une bibliothèque en tapant file libguile.so.

  • Vérifiez que les fichiers d'en-têtes correspondant à la bibliothèque sont bien installés à la bonne place (généralement, /usr/include, /usr/local/include, ou /usr/X11R6/include). Si vous ne savez pas de quels fichiers d'en-têtes vous avez besoin, vérifiez que vous avez bien installé la version de développement de la bibliothèque nécessaire (par exemple, gtk+2.0-devel au lieu de libgtk2.0). La version de développement de la bibliothèque est livrée avec les fichiers de type include (à inclure) nécessaires à la compilation d'un logiciel utilisant cette bibliothèque.

  • Vérifiez que vous avez assez de place disque (en effet le script configure a besoin d'un peu de place pour des fichiers temporaires). Utilisez la commande df -h pour visualiser les partitions de votre système, et vérifiez les partitions pleines ou en passe de l'être.

Si vous ne comprenez pas le message d'erreur stocké dans le fichier config.log, n'hésitez pas à demander aide et assistance à la communauté du logiciel libre (voir la section intitulée « Assistance technique »).

De plus, vérifiez si une librairie donnée existe même si configure affirme qu'elle n'existe pas (par exemple, il serait très étrange qu'aucune bibliothèque curses ne soit présente sur votre système). Dans de tels cas, on est probablement en présence d'une variable LD_LIBRARY_PATH mal positionnée !

Imake

imake permet de configurer un logiciel libre en créant un fichier Makefile à partir de règles simples. Ces règles déterminent quels fichiers ont besoin d'être compilés pour construire le binaire, et imake engendre le Makefile correspondant. Ces règles sont spécifiées dans un fichier appelé Imakefile.

Là où imake prend tout son intérêt, c'est qu'il utilise des informations dépendantes du site (de l'architecture de la machine). C'est assez pratique dans le cas d'applications utilisant X Window System. Mais imake est aussi utilisé dans le cas de nombreuses autres applications.

L'utilisation la plus simple de imake est de se rendre dans le répertoire principal de l'archive décompressée, et ensuite d'exécuter le script xmkmf, qui fera appel au programme imake :

$ xmkmf -a
$ imake -DUseInstalled -I/usr/X11R6/lib/X11/config
$ make Makefiles

Si le site est mal installé, recompiler et installer X11R6 !

Scripts shell divers

Lisez le fichier INSTALL ou README pour de plus amples informations. Généralement, il va vous falloir exécuter un fichier de type install.sh ou configure.sh. Ensuite, soit le script d'installation sera silencieux (et déterminera tout seul ce dont il a besoin), soit il vous demandera des informations sur votre système (par exemple, des chemins).

Si vous n'arrivez pas à déterminer le fichier que vous devez exécuter, vous pouvez (sous bash) taper ./, et ensuite taper deux fois la touche TAB (touche de tabulation). bash complétera automatiquement (dans sa configuration par défaut) par un éventuel fichier exécutable du répertoire (donc, un éventuel script de configuration). Dans le cas où plusieurs fichiers sont exécutables, il vous en donnera une liste. Il ne vous reste plus qu'à choisir le bon.

Un autre cas particulier est l'installation de modules perl. L'installation de tels modules se fait par l'exécution d'un script de configuration lui-même écrit en perl. La commande à effectuer est généralement :

$ perl Makefile.PL

Autres possibilités

Certaines distributions de logiciels libres sont mal organisées, surtout lors des premières phases de développement (et un homme prévenu en vaut deux !). Elles nécessitent parfois de retoucher « à la main » les fichiers de configuration. Généralement, ces fichiers sont un fichier Makefile (voir la section intitulée « Make ») et un fichier config.h (mais ce nom n'est qu'une convention).

Nous ne recommandons ces manipulations qu'à des utilisateurs sachant ce qu'ils font. C'est un travail qui nécessite des connaissances réelles et une motivation nécessaire pour réussir. Mais c'est en forgeant qu'on devient forgeron.