Ceci est une ancienne révision du document !
Autotools
- GLMF n°234 - Février 2020 - Mise en œuvre d'autotools
Mise en place minimale
Générer automatiquement un configure.ac:
autoscan mv configure.{scan,ac}
Créer un autogen.sh:
#!/bin/bash autoreconf -i
configure.ac minimal:
AC_PREREQ([2.69]) AC_INIT([nom-du-projet], [version], [em@il]) AC_CONFIG_AUX_DIR([build-aux]) # place les scripts auxiliaires dans ce dossier AM_INIT_AUTOMAKE([foreign -Wall -Werror]) # foreign: relâche la pression sur les standards GNU, -Wall et -Werror concernent automake AC_CONFIG_SRCDIR([src/bench.c]) # emplacement d'un fichier source, permet à configure de s'assurer que les fichiers sources sont bien là où c'est indiqué AC_CONFIG_HEADERS([src/config.h]) # dans quel fichier iront les AC_DEFINE AM_SILENT_RULES(yes) # n'affiche pas le détail des commandes exécutées AC_PROG_CC # cherche un compilateur C AC_CONFIG_FILES([Makefile src/Makefile]) # liste des fichiers Makefile à traiter AC_OUTPUT
Un Makefile.am à la racine du projet (nécessaire pour pouvoir faire `make` directement le dossier où configure sera exécuté:
SUBDIRS = src
src/Makefile.am:
bin_PROGRAMS = stream basic_prime stream_SOURCES = stream.c stream_CFLAGS = $(OPENMP_CFLAGS) $(LARGE_MCMODEL_LARGE) basic_prime_SOURCES = basic_prime.c prime.c
Utiliser des macros de l'autotools-archive
https://www.gnu.org/software/autoconf-archive/The-Macros.html
Placer le fichier source de la macro dans un dossier m4 à la racine du projet, et ajouter le paramètre -I m4 à la commande autoreconf.
Utiliser pkg-config
Fonctionnement minimal:
PKG_CHECK_MODULES([HWLOC], [hwloc], [have_hwloc=yes], [have_hwloc=no])
Paramètres:
- suffixe des variables récupérées depuis pkg-config
- module à chercher avec pkg-config
- optionnel: action à exécuter si le module est trouvé
- optionnel: action à exécuter si le module n'est pas trouvé
program_CFLAGS = $(HWLOC_CFLAGS) program_LDADD = $(HWLOC_LIBS)
Sur certains (anciens ?) systèmes, il est nécessaire d'ajouter le script de macros pkg.m4 et d'appeler PKG_PROG_PKG_CONFIG avant le moindre appel à pkg-config.
Variable conditionnelle
AM_CONDITIONAL(HAVE_HWLOC, test x$have_hwloc = xyes)
Cette instruction n'a d'effet que dans les makefiles et doit être toujours exécutée (pas placée dans une condition).
if HAVE_HWLOC bin_PROGRAMS += program_with_hwloc endif
Chercher un programme
AC_PATH_PROG(mpicc_path, mpicc, [no])
Paramètres:
- Variable qui contiendra le chemin du programme
- Programme à chercher
- Optionnel: valeur par défaut si le programme n'est pas trouvé
- Il est aussi possible de préciser le
PATH
Changer le compilateur
Il suffit de définir la variable CC avant de faire appel à AC_PROG_CC
Chercher une bibliothèque
have_likwid=no AC_CHECK_LIB([likwid], [topology_init], [LIKWID_LIBS=-llikwid have_likwid=yes]) AC_SUBST([LIKWID_LIBS]) AM_CONDITIONAL(HAVE_LIKWID, test x$have_likwid = xyes)
Paramètres de AC_CHECK_LIB:
- nom de la bibliothèque à chercher
- une fonction contenue dans la bibliothèque
- optionnel: action à faire si la bibliothèque est trouvée. Sans action ici, tous les binaires seront compilés en étant liés à cette bibliothèque
AC_SUBST permet de remplacer dans tous les makefiles la variable LIKWID_LIBS:
if HAVE_LIKWID bin_PROGRAMS += uncore_set uncore_set_SOURCES = uncore_set.c uncore_set_LDADD = $(LIKWID_LIBS) endif
Définir une variable de préprocesseur
AC_DEFINE(HAVE_MKL, [1], [Whether MKL is available])
Paramètres:
- nom de la define
- valeur
- description, qui servira de commentaire dans le fichier où sera généré la define (définie par
AC_CONFIG_HEADERS)
Connaître l'architecture processeur
AC_CANONICAL_HOST if test $host_cpu = x86_64; then # ... fi
Tester le support d'un jeu d'instructions
Utiliser la macro AX_GCC_X86_CPU_SUPPORTS de l'autoconf-archive:
AX_GCC_X86_CPU_SUPPORTS(avx512f, [have_avx512=yes])
Tester OpenMP
AC_OPENMP
Les cflags sont ensuite disponibles via $(OPENMP_CFLAGS).
Afficher un message
Pendant le configure:
AC_MSG_NOTICE([ Configuration summary: foo ])
.gitignore
*~ Makefile.in /aclocal.m4 /autom4te.cache /build /build-aux /configure src/config.h.in