autotools

Ceci est une ancienne révision du document !


Autotools

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

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.

Fonctionnement minimal:

PKG_CHECK_MODULES([HWLOC], [hwloc], [have_hwloc=yes], [have_hwloc=no])

Paramètres:

  1. suffixe des variables récupérées depuis pkg-config
  2. module à chercher avec pkg-config
  3. optionnel: action à exécuter si le module est trouvé
  4. 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.

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
AC_PATH_PROG(mpicc_path, mpicc, [no])

Paramètres:

  1. Variable qui contiendra le chemin du programme
  2. Programme à chercher
  3. Optionnel: valeur par défaut si le programme n'est pas trouvé
  4. Il est aussi possible de préciser le PATH

Il suffit de définir la variable CC avant de faire appel à AC_PROG_CC

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:

  1. nom de la bibliothèque à chercher
  2. une fonction contenue dans la bibliothèque
  3. 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
AC_DEFINE(HAVE_MKL, [1], [Whether MKL is available])

Paramètres:

  1. nom de la define
  2. valeur
  3. description, qui servira de commentaire dans le fichier où sera généré la define (définie par AC_CONFIG_HEADERS)
AC_CANONICAL_HOST
if test $host_cpu = x86_64; then
    # ...
fi

Utiliser la macro AX_GCC_X86_CPU_SUPPORTS de l'autoconf-archive:

AX_GCC_X86_CPU_SUPPORTS(avx512f, [have_avx512=yes])
AC_OPENMP

Les cflags sont ensuite disponibles via $(OPENMP_CFLAGS).

Pendant le configure:

AC_MSG_NOTICE([
 
Configuration summary:
    foo
])
*~
Makefile.in
/aclocal.m4
/autom4te.cache
/build
/build-aux
/configure
src/config.h.in
  • autotools.1621014026.txt.gz
  • Dernière modification : 2021/05/14 19:40
  • de phsw