Olivier Poncet
Directeur Technique · CTO

Les autotools - autoconf

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

Nous avons vu précédemment que autotools est un terme générique utilisé pour désigner l’ensemble des outils de build du projet GNU, le GNU build system.

Dans ce billet, nous allons faire un focus sur l’outil autoconf, qui est un outil permettant de produire des scripts ayant pour objectif de configurer automatiquement l’environnement de build d’un logiciel (dont le fameux script configure).

Ces scripts sont générés de manière à ce qu’ils soient entièrement portables dès lors qu’un interpréteur de commandes compatible de type « Bourne Shell » est disponible.

Les instructions permettant la génération de ces scripts sont écrites dans un fichier nommé configure.ac, et ne sont au final que des suites de macros prédéfinies écrites dans le langage m4.

Patron d’un fichier configure.ac

Le patron d’un fichier configure.ac est le suivant :

# Template configure.ac
Prérequis autoconf
AC_INIT([paquet], [version], [adresse-de-rapport-de-bug])
Informations sur le paquet
Vérifier les programmes
Vérifier les bibliothèques
Vérifier les fichiers d'entêtes
Vérifier les types
Vérifier les structures
Vérifier les caractéristiques du compilateur
Vérifier les fonctions de bibliothèques
Vérifier les services système
AC_CONFIG_FILES([file...])
AC_OUTPUT

Macros autoconf

Prérequis autoconf

Si une version particulière de autoconf est requise, elle peut-être spécifiée au début du fichier à l’aide de la macro suivante :

Macro Description
AC_PREREQ([version]) teste la présence d’une version spécifique de autoconf

La description complète de cette macro est disponible ici.

Initialiser autoconf

L’outil autoconf doit être initialisé à l’aide de la macro suivante :

Macro Description
AC_INIT([nom-du-paquet], [version-du-package], [adresse-de-bugreport]) initialise autoconf

La description complète de cette macro est disponible ici.

Vérifier la présences des compilateurs et préprocesseurs

Si des compilateurs et/ou préprocesseurs sont requis, ils peuvent être testés à l’aide des macros suivantes :

Macro Description
AC_PROG_CC teste la présence d’un compilateur C
AC_PROG_CXX teste la présence d’un compilateur C++
AC_PROG_CPP teste la présence d’un préprocesseur C/C++
AC_PROG_CC_C89 teste la présence d’un compilateur compatible C89
AC_PROG_CC_C99 teste la présence d’un compilateur compatible C99
AC_PROG_CC_STDC teste la présence d’un compilateur standard (soit C99, sinon C89)
AC_PROG_F77 teste la présence d’un compilateur Fortran

La description complète de ces macros est disponible ici.

Vérifier la présences de programmes spécifiques

Si des programmes spécifiques sont requis, ils peuvent être testés à l’aide des macros suivantes :

Macro Description
AC_PROG_AWK teste la présence de awk
AC_PROG_GREP teste la présence de grep
AC_PROG_EGREP teste la présence de egrep
AC_PROG_FGREP teste la présence de fgrep
AC_PROG_INSTALL teste la présence d’un programme install compatible BSD
AC_PROG_MKDIR_P teste la présence de mkdir supportant l’option -p
AC_PROG_LEX teste la présence de lex ou un programme compatible (flex, …)
AC_PROG_LN_S teste la présence de ln supportant l’option -s
AC_PROG_RANLIB teste la présence de ranlib
AC_PROG_SED teste la présence de sed
AC_PROG_YACC teste la présence de yacc ou un programme compatible (bison, …)

La description complète de ces macros est disponible ici.

Vérifier la présences de programmes génériques

Si des programmes génériques sont requis, ils peuvent être testés à l’aide des macros suivantes :

Macro Description
AC_CHECK_PROG(variable, prog-to-check-for, value-if-found, [value-if-not-found], [path = $PATH], [reject])
AC_CHECK_PROGS(variable, progs-to-check-for, [value-if-not-found], [path = $PATH])
AC_CHECK_TARGET_TOOL(variable, prog-to-check-for, [value-if-not-found], [path = $PATH])
AC_CHECK_TOOL(variable, prog-to-check-for, [value-if-not-found], [path = $PATH])
AC_CHECK_TARGET_TOOLS(variable, progs-to-check-for, [value-if-not-found], [path = $PATH])
AC_CHECK_TOOLS(variable, progs-to-check-for, [value-if-not-found], [path = $PATH])
AC_PATH_PROG(variable, prog-to-check-for, [value-if-not-found], [path = $PATH])
AC_PATH_PROGS(variable, progs-to-check-for, [value-if-not-found], [path = $PATH])
AC_PATH_PROGS_FEATURE_CHECK(variable, progs-to-check-for, feature-test, [action-if-not-found], [path = $PATH])
AC_PATH_TARGET_TOOL(variable, prog-to-check-for, [value-if-not-found], [path = $PATH])
AC_PATH_TOOL(variable, prog-to-check-for, [value-if-not-found], [path = $PATH])

La description complète de ces macros est disponible ici.

Vérifier la présences de paquets

Si des librairies particulières sont requises et qu’elles sont disponibles au format pkg-config, elles peuvent être testées à l’aide de la macro suivante :

Macro Description
PKG_CHECK_MODULES(prefix, list-of-modules, action-if-found, action-if-not-found) Permet de vérifier à l’aide de pkg-config qu’une librairie est présente

Et les autres macros ?

Il est illusoire de vouloir tout décrire ici de manière exhaustive. La richesse des macros est telle que je vous renvoie à la documentation officielle de autoconf.

Un petit exemple

Voici un exemple de fichier configure.ac :

# Package informations
# --------------------

m4_define([pkg_name], [HelloWorld])
m4_define([pkg_major_version], [0])
m4_define([pkg_minor_version], [0])
m4_define([pkg_micro_version], [0])

m4_define([pkg_version], [pkg_major_version.pkg_minor_version.pkg_micro_version])
m4_define([pkg_bugreport], [olivier.poncet@emaxilde.net])

# Autoconf/Automake
# -----------------

AC_INIT([pkg_name], [pkg_version], [pkg_bugreport])
AM_INIT_AUTOMAKE

# Programs
# --------

AC_PROG_CC
AC_PROG_CXX
AC_PROG_LEX
AC_PROG_YACC

# Defines
# -------

AC_DEFINE(PACKAGE_MAJOR_VERSION, [pkg_major_version], [Define to the major version of this package.])
AC_DEFINE(PACKAGE_MINOR_VERSION, [pkg_minor_version], [Define to the minor version of this package.])
AC_DEFINE(PACKAGE_MICRO_VERSION, [pkg_micro_version], [Define to the micro version of this package.])

# Output
# ------

AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
    Makefile
    src/Makefile
])
AC_OUTPUT

What else ?

Vous avez pu constater au travers ces quelques lignes que cet outil est doté de très nombreuses macro de configuration et détection. Malgré sa richesse, seul, il ne sert pas à grand chose. C’est combiné à automake qu’il démontre toute sa puissance, et c’est ce que nous verrons dans le prochain billet.