Olivier Poncet
Directeur Technique · CTO

Les autotools - présentation

cover🔗 publié par Olivier Poncet le 25/01/2017 à 12:00

Autotools est un terme générique utilisé pour désigner l’ensemble des outils de build du projet GNU. Ces outils sont aussi connus sous le nom de GNU build system et permettent aux développeurs de produire des systèmes de construction industrialisés et portables de leurs applications (le plus souvent écrites en C et C++, mais pas que …).

Ces outils sont principalement au nombre de trois :

  • L’utilitaire autoconf.
  • L’utilitaire automake.
  • L’utilitaire libtool.

Utilisés ensemble, ces outils permettent de :

  • Générer le script configure bien connu des distributions de sources.
  • Générer des fichiers Makefile nécessaires à la construction du projet.
  • Compiler des sources.
  • Produire des programmes.
  • Produire des bibliothèques.
  • Produire et exécuter des tests unitaires.
  • Installer sur un système cible.
  • Créer une archive auto-suffisante des sources du projet.

Avantages

Parmi les avantages des autotools par rapport à de simples fichiers Makefile, il y a que les cibles all, clean, dist, distcheck, check, install, … sont systématiquement générées et correctement gérées sans le moindre paramétrage ou effort supplémentaire.

Il est aussi possible d’ajouter des options / features de compilation du style --with-option ou --enable-feature au script configure de manière aisée.

Un autre avantage non négligeable est que le projet devient totalement agnostique par rapport au système de build et à la plateforme cible : tous les détails techniques concernant le système d’exploitation, la chaîne de compilation, … sont nativement pris en charge par les autotools.

De fait, chaque projet ainsi autotoolisé devient « standard » car prenant en charge nativement tous les détails d’ordre technique et/ou système, et en général tous les développeurs et administrateurs savent comment configurer et installer un projet autotoolisé :

configure && make && make install

Inconvénients

Parmi les inconvénients des autotools, on pourra citer une prise en main un peu difficile lorsque l’on n’est pas guidé, ainsi que des fichiers de description et un système de génération pouvant sembler un peu cryptiques.

Installation

L’installation sur les distributions Debian et dérivées s’effectue à l’aide de l’utilitaire apt-get :

apt-get install autoconf automake libtool

L’installation sur les distributions Redhat et dérivées s’effectue à l’aide de l’utilitaire yum.

yum install autoconf automake libtool

Autotooliser un projet

Un projet autoolisé requiert, en plus des codes sources, quelques fichiers de description. L’arborescence est en général très proche de la suivante :

Project root
   |
   |`-> [autoreconf.sh|autogen.sh]
   |`-> [acinclude.m4]
   |`-> configure.ac
   |`-> Makefile.am
   |`-> AUTHORS
   |`-> COPYING
   |`-> NEWS
   |`-> README
   |`-> ChangeLog
   |
   `--> src
         |
         |`-> subdir1
         |       |
         |       |`-> Makefile.am
         |       |`-> sources/headers
         |       |`-> extra files
         |       `--> ...
         |
         |`-> subdir2
         |       |
         |       |`-> Makefile.am
         |       |`-> sources/headers
         |       |`-> extra files
         |       `--> ...
         |
         |`-> Makefile.am
         |`-> sources/headers
         |`-> extra files
         `--> ...

Les fichiers AUTHORS, COPYING, NEWS, README et ChangeLog sont normalement requis par les autotools et devraient par conséquent être présents. Ayants un caractère purement informatif, ils peuvent éventuellement être créés vides

Le fichier « autoreconf.sh » ou « autogen.sh »

Ce fichier, soit autoreconf.sh, soit autogen.sh, est optionnel et fourni conventionnellement un moyen de regénérer les fichiers produits par les autotools.

#!/bin/sh

AUTORECONF=`which autoreconf`
if test -z "${AUTORECONF}"; then
    echo "*** autoreconf was not found, please install it ***"
    exit 1
fi

"${AUTORECONF}" -v -i -f || exit $?

Les options traditionnellement passées à autoreconf sont :

  • L’option -v permet d’activer le mode verbeux.
  • L’option -i permet d’installer les fichiers auxiliaires manquants.
  • L’option -f considère tous les fichiers auxiliaires comme obsolètes (si déjà présents).

Le fichier « acinclude.m4 »

Ce fichier optionnel contient les macros écrites en langage m4 nécessaires au projet. Ces macros peuvent être des macros de détection de programmes, de bibliothèques, …

De telles macros additionnelles peuvent être téléchargées sur le site autoconf archives.

Le fichier « configure.ac »

Ce fichier contient les macros m4 nécessaires à la génération du script configure.

Ce fichier devrait à minima contenir les définitions suivantes :

# An example of configure.ac for a project
AC_INIT([HelloWorld], [0.0.1], [olivier.poncet@emaxilde.net])
AM_INIT_AUTOMAKE
LT_INIT
AC_PROG_CC
AC_PROG_CXX
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT

Nous en parlerons plus en détail dans le prochain billet.

Le fichier « Makefile.am »

Contient les déclarations nécessaires à la génération du Makefile de la racine du projet. En général contient la liste des sous-répertoires à construire.

# An example of Makefile.am for a project
SUBDIRS = \
	src \
	$(NULL)

EXTRA_DIST = \
	autoreconf.sh \
	$(NULL)

Les autres fichiers Makefile.am contiennent les déclarations nécessaires à la génération du Makefile des programmes et/ou librairies produites.

# An example of Makefile.am for a program
bin_PROGRAMS = \
	HelloWorld \
	$(NULL)

HelloWorld_SOURCES = \
	HelloWorld.cc \
	HelloWorld.h \
	main.cc \
	$(NULL)

HelloWorld_CPPFLAGS = \
	-I$(top_srcdir)/src \
	$(NULL)

HelloWorld_LDFLAGS = \
	-L$(top_builddir)/src \
	$(NULL)

HelloWorld_LDADD = \
	$(NULL)

EXTRA_DIST = \
	$(NULL)

Nous en parlerons plus en détail dans le prochain billet.

Le fichier « AUTHORS »

Ce fichier contient la liste des auteurs du logiciel sous la forme Prénom NOM <adresse-email>

Olivier PONCET <olivier.poncet@emaxilde.net>

Le fichier « COPYING »

Ce fichier contient les termes de la licence sous laquelle est publié le logiciel. Il devrait contenir le nom et les mentions précises concernant le copyright et les droits entourant le code source.

            GNU GENERAL PUBLIC LICENSE
               Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.
 ...
This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
...

Le fichier « NEWS »

Ce fichier contient du texte libre à caractère informatif concernant les modifications récentes du logiciel, corrections de bugs, nouvelles fonctionnalités, …

Le fichier « README »

Ce fichier contient du texte libre à caractère informatif à propos du logiciel, son utilité, comment le lancer, …

Le fichier « ChangeLog »

Ce fichier contient, en général, toutes les modifications apportées aux versions successives du logiciel.

2017-01-03  Olivier PONCET <olivier.poncet@emaxilde.net>

	* bug fix

2017-01-02  Olivier PONCET <olivier.poncet@emaxilde.net>

	* new feature

2017-01-01  Olivier PONCET <olivier.poncet@emaxilde.net>

	* initial release
...

Générer le projet

Dès lors que le projet contient les fichiers précédemment décrits, la commande autoreconf peut alors être exécutée (ou alors autoreconf.sh ou bien autogen.sh) :

autoreconf -v -i -f
  • L’option -v permet d’activer le mode verbeux.
  • L’option -i permet d’installer les fichiers auxiliaires manquants.
  • L’option -f considère tous les fichiers auxiliaires comme obsolètes (si déjà présents).

Cette commande est en fait un script utilitaire qui exécute successivement les outils autoconf, autoheader, aclocal, automake, libtoolize, et optionnellement autopoint (dans le cas où GNU gettext est utilisé dans le projet pour gérer les traductions).

autoreconf -v -i -f
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force
autoreconf: configure.ac: tracing
autoreconf: running: libtoolize --copy --force
libtoolize: putting auxiliary files in `.'.
libtoolize: copying file `./ltmain.sh'
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
configure.ac:35: installing `./config.guess'
configure.ac:35: installing `./config.sub'
configure.ac:34: installing `./install-sh'
configure.ac:34: installing `./missing'
Makefile.am: installing `./depcomp'
Makefile.am: installing `./INSTALL'
autoreconf: Leaving directory `.'

Le processus global de génération est le suivant :

Processus

Le processus d’autotoolisation produit un certain nombre de fichiers et répertoires. Ces fichiers et répertoires peuvent être supprimés en toute sécurité et regénérés à l’aide de la commande autoreconf précédemment décrite.

Le fichier « INSTALL »

Ce fichier est un fichier texte contenant les instructions permettant de configurer, construire et installer le logiciel.

Le fichier « configure »

Ce fichier est un script de configuration du projet résultant du fichier configure.ac. Ce script permet de configurer et initialiser l’environnement de construction du logiciel. Il accepte un certain nombre de paramètres optionnels standardisés, tels que le préfixe de l’installation, activer ou désactiver la génération des bibliothèques statiques et/ou dynamiques, …

Une aide complète des paramètres peut être obtenue à l’aide de la commande suivante :

./configure --help

Les fichiers « Makefile.in »

Ces fichiers sont des templates de fichiers Makefile résultants des fichiers Makefile.am. Ils serviront à générer les fichiers Makefile lors de la phase de configuration à l’aide du script configure.

Le fichier « aclocal.m4 »

Ce fichier contient un ensemble de macro écrites en langage m4 nécessaires à autoconf et automake.

Le fichier « config.guess »

Ce fichier est un script permettant au script configure de déterminer l’architecture matérielle et logicielle du build.

Le fichier « config.h.in »

Ce fichier est un template de fichier d’entête résultant de la configuration du projet. Il contient notamment des clause conditionnelles précisant les caractéristiques du build.

Lorsque le script configure est lancé, celui-ci génère un fichier d’entête correspondant à ce template et dont les clauses #define seront activées en conséquence. L’utilisation de ce fichier dans le code utilisateur se résumera au final en une simple inclusion conditionnelle.

Le fichier « config.sub »

Ce fichier est un script contenant des routines de validation de configuration utilisé par le script configure.

Le fichier « depcomp »

Ce fichier est un script permettant de traquer et gérer les dépendances de sources et d’objets lors de la construction du logiciel.

Le fichier « install-sh »

Ce fichier est un script permettant d’installer les objets produits lors de l’installation du logiciel par la commande make install.

Le fichier « ltmain.sh »

Ce fichier est un script fournissant quelques fonctionnalités de libtool lors de la construction du logiciel.

Le fichier « missing »

Ce fichier est un script utilisé par configure afin de tester la présence ou l’absence de certains programmes.

Le répertoire « autom4te.cache »

Ce répertoire est un répertoire de cache permettant d’accélérer le processus de traitement du fichier configure.ac par les autotools.

What else ?

Dans le prochain billet, nous rentrerons dans les détails afin de savoir comment bien décrire les fichiers de description du projet.