Les outils Automake et Autoconf....

Vous trouverez ci-après une présentation des outils de création de scripts de configuration pour la gestion et l'installation de logiciels et de son code source. Au travers de cette présentation, des exemples simples vous permettrons de mettre en pratique rapidement les concepts, pour ensuite les approfondir grâce aux références de manuels....

Sommaire

  1. Concepts de base
  2. Outil Autoconf
  3. Outil Automake
  4. Gestion des fichiers d'en-tête (outil Autoheader)
  5. Outil Configure
  6. Tableau récapitulatif
  7. FAQ & Eventuels problèmes
  8. Bibliographie



1. Concepts de base

Actuellement, si l'on veut développer une application informatique "correctement", on va écrire plusieurs fichiers sources. La multiplicité de ces fichiers fait que la maintenance de notre projet devient vite contraignante. C'est pourquoi, paresse oblige, ces tâches (compilation, gestion des dépendances....) sont confiées à un Makefile.

Mais certaines opérations restent encore difficile en raison de l'évolution de notre programme, ou encore en raison de l'adaptation sur différents systèmes. Ainsi, il faut quand même maintenir le Makefile.

C'est là qu'interviennent les outils de configuration et de création de scripts automatiques (Autoconf, Automake, Configure...).

Ces outils ont deux objectifs principaux :

Seul les développeurs de programme doivent avoir installés les outils présentés ci-après. Les personnes qui veulent simplement installer un logiciel à partir des sources n'ont pas besoin d'outils spéciaux, excepté un shell Unix, un programme make et un compilateur C.

Voici les deux outils principaux : Pour commencer à utiliser ces outils et construire un package près à l'installation, vous devez écrire trois fichiers (configure.in, makefile.am, acconfig.h) et lancer certains outils pour générer les fichiers additionnels.

Voici le schéma des dépendances entre les fichiers et les outils (le fichier acconfig.h sera présenté plut tard, restons pour l'instant dans un schèma simple!! :) ).

Schéma autotools

Les deux outils possèdent la même philosophie. A partir de fichier simple écrit par le développeur, ils vont générer des fichiers "moules", qui seront complétés au dernier moment (lors de la compilation).


2. Outil Autoconf

Autoconf est un outil qui génère un script exécutable (configure) pour adapter l'installation de nos codes sources en fonction du système et de la machine d'installation. Le script configure est indépendant d'Autoconf, ainsi l'utilisateur n'a pas besoin d'avoir l'outil Autoconf.

Ce script est créé à partir d'un fichier appelé configure.in, qui contient la description de toutes les options et spécificités que l ’on veut tester.
Ensuite, c'est le script configure qui effectuera réellement les tests. Il convertira le fichier "moule" Makefile.in en véritable Makefile. Le principal fichier pour la génération du script configure est comme vous l'avez compris le fichier configure.in. Dans un premier temps, je vais redéfinir quelques règles sur la syntaxe du fichier Configure.in : Maintenant, prenons l'exemple d'un projet contenant un fichier source nommé exemple.c, destiné à afficher un message texte. Voici les étapes à suivre pour utiliser l'outils Autoconf et générer un script configure (le prompt est repésenté par 'yb@I2000>' ) :

yb@I2000 > autoscan
Cette commande va générer un fichier configure.scan, qu'il faut renommer en configure.in. Ce fichier, une fois complété aura l'allure suivante :
dnl Process this file with autoconf to produce a configure script
AC_INIT(exemple.c)
AM_INIT_AUTOMAKE(exemple, 1.0)
dnl Checks for programs
AC_PROG_CC
AC_OUTPUT(Makefile)
La ligne AC_PROG_CC permet de chercher le compilateur C de la machine d'installation. J'ai également inséré une ligne pour Automake : AM_INIT_AUTOMAKE(example, 1.0). Cette dernière permet de définir le nom du package, ainsi que le numéro de version. Les différents préfixes des macros indiquent de quel outil la commande provient. Les macros qui commencent par AC_ sont celles d'Autoconf et celles qui commencent par AM_ sont celles d'Automake.
Une fois le fichier configure.in écrit, il faut lancer les commandes suivantes :
yb@I2000 > aclocal
yb@I2000 > autoconf
La première permet d'interpréter la macro pour automake (et créé le fichier aclocal.m4) et la seconde génère tout simplement le script configure.


3. Outil Automake

Automake est un outil qui permet de minimiser les tâches de maintenance, en décrivant la structure de l'application. En fait, il génère un (ou des) fichier(s) "moule" du Makefile, nommé Makefile.in, à partir d'une série de macros contenues dans le(s) fichier(s) Makefile.am. Cet outil est souvent associé à Autcoconf.

Automake se base sur le fichier Configure.in pour savoir quels sont les Makefile.in à générer. La description de ce que doit contenir un de ces fichiers est elle-même contenue dans un fichier Makefile.am (voir le § suivant).

Je rappelle juste que le fichier Makefile.in est celui qui va être transformé par l'outil Configure en véritable Makefile. Automake permet de générer tout simplement ce fichier... :) L'outil Automake s'appuie sur deux fichiers pour générer le Makefile.in. Le principal bien sur est le fichier Makefile.am. Avant de rentrer dans un exemple plus concret, voici quelques règles générales et de syntaxe à respecter pour la création des fichiers Makefile.am et Configure.in :

Reprenons notre exemple, avec cette fois ci, deux répertoires (src et doc), et l'appel à une bibliothèque (libexemple.a).

Dans un premier temps, il faut donc écrire un fichier Configure.in (reprendre celui montrer en exemple d'Autoconf). Ensuite, écrire le fichier Makefile.am suivant :
## Process this file with automake to produce makefile.in
SUBDIRS = src doc
bin_PROGRAMS = exemple
exemple_SOURCES = exemple.c fonction.c exemple.h
exemple_LDADD = libexemple.a
Il ne vous reste plus qu'à lancer la commande suivante pour générer le fichier Makefile.in :
yb@I2000 > automake --add-missing
L'option passée à Automake l'informe qu'il doit installer les fichiers qui pourraient éventuellement manquer. En effet, Automake requiert certains fichiers dans certaines situations. Il est aussi possible de spécifier l'option --foreign, pour avoir un niveau de rigueur décontracté (par opposition à --gnu, option par défaut, qui requiert les fichiers INSTALL, NEWS, README, COPYING, AUTHORS, et ChangeLog dans le répertoire source). Pour les autres options admises par Automake, voir le manuel Automake...


4. Gestion des fichiers d'en-tête (outil Autoheader)

Cet outil est utilisé pour la gestion des variables du pré-processeur (#define, #undef), et pour la gestion des fichiers d ’en-tête et leurs fonctions (stdlib.h, fonction free…). Il créer un fichier "patron" (config.h.in) comprenant un ensemble de #define pour l'outils configure, à partir de acconfig.h et Configure.in. Voici un petit schéma pour mieux comprendre l'intégration de cet outil avec les autres :
Schéma autoheader

L'outils Autoheader scanne le fichier Configure.in et recherche quels sont les symboles du pré-processeur C qu'il doit définir. Voici les macros que l'on peut trouver dans le fichier Configure.in : L'autre fichier utilisé est le fichier acconfig.h :
L'outil Autoheader informe toujours par un message d'erreur lorsqu'il manque un élément dans le fichier acconfig.h.


5. Outil Configure

L'outil Configure est un script shell, qui va convertir les fichiers "moules" dans leur formes définitives (Makefile.in -> Makefile). Il effectue les tests souhaités avant la compilation et remplace les paramètres de configuration par leurs valeurs appropriées. Ce script est écrit de la manière la plus portable possible.

Ce script shell est fourni régulièrement avec le package pour l'utilisateur final. Il est créé par le développeur en lançant l'outil Autoconf.

Voici le schéma représentant les fichiers qui interagissent avec Configure :
Schéma configure

Il est possible de choisir le répertoire d'installation du programme. Pour cela, il faut utiliser l'option --prefix lors de l'utilisation de configure. Par défaut, ce répertoire est /usr/local.


6. Tableau récapitulatif

Voici un tableau qui synthétise les différents outils à utiliser dans le développement d'un package :

Quand Commande Actions
Au début du projet autoscan Génère un fichier moule du fichier Configure.in
"" Ecrire un fichier Makefile.am (structure du programme)
"" aclocal Pour installer les outils complémentaires à automake
"" autoheader Pour déterminer les variables du pré-processeur à définir, et les sauver dans le fichier config.h.in
Au début, ou si configure.in a été modifié autoconf Génère configure à partir de Configure.in
Au début, ou si l'on a perdu les makefile.in automake Génère les fichiers Makefile.in à partir des Makefile.am
Pour changer de configuration configure Génère les fichiers Makefile et le fichier config.h en fonction des options de compilation choisies
Pour compiler les sources make Compile les sources ou met à jour les binaires



7. FAQ & problèmes courants

Voici une lsite non exhaustive des problèmes que l'on peut rencontrer en utilisant ces outils. Cette liste est composée de questions récupérées au fil de mes visites sur le web...
Autoconf me dis quelque chose à propos de macros indéfinies :

Cela signifie qu'il y a des macros dans le fichier configure.in, qui ne sont pas définies par Autoconf. Vous utilisez une vieille version d'Autoconf; essayer d'en installer une nouvelle version.

Mon Makefile ne contient aucun caractères :

Cela peut signifier que vous avez essayer d'utiliser une substitution autoconf dans le Makefile.in sans avoir ajouter un appel approprié à AC_SUBST au scrip configure. Ou cela peut tout simplement signifier que vous devez reconstruire le Makefile. Pour le reconstruire depuis le Makefile.in, lancer le script shell config.status sans arguments. Si vous devez forcer configure à être relancé, lancez d'abord config.status --recheck.

Message du type No rule to make target... needed by .deps/.P :

Les dépendances des fichiers sont stockées dans un répertoire appelé .deps. Si un fichier disparaît brutalement, il se peut qu'il soit encore référencé lors du make, ce qui conduit à ce message. Le plus simple est d'effacer le répertoire .deps.

Impossible de refaire make :

Lorsque une erreur a été commise dans un Makefile.am, les mécanismes automatiques qui permettent de régénérer les Makefile peuvent ne plus fonctionner. Il faut alors les recréer soi-même grâce à Automake et Autoconf, comme expliqué dans la section \ref{sec:base}.

configure: error: source directory already configured :

Il est possible de compiler des sources dans plusieurs répertoires, comme nous l'avons vu dans le premier exemple, page \pageref{sec:base}. Mais ceci n'est vrai qu'à condition de ne pas avoir compilé dans le répertoire de sources. En effet, lorsque l'on configure le répertoire de sources pour y effectuer une compilation, on créé un certain nombre de fichiers qui peuvent interférer avec ceux des autres répertoires de compilation, et engendrer des problèmes difficiles à détecter. Dans sa grande bonté, Autoconf empêche ce genre de situation.

Problèmes de syntaxe dans le fichier configure.in :

La syntaxe des macros utilisées par Autoconf impose que les parenthèses délimitant les paramètres d'une fonction soient accolées au nom de la fonction. Donc :

AC_DEFINE(CFLAGS) juste
AC_DEFINE (CFLAGS) faux

8. Bibliographie

Voici les références sur lesquelles je me suis appuyé pour la réalisation de ce site :

Site web : Livres :


Breugnot Yannick © 2000