Les autotools - autoconf
🔗 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.