Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| autotools [2021/05/12 13:17] – créée phsw | autotools [2023/04/11 11:06] (Version actuelle) – Add --with-foo phsw | ||
|---|---|---|---|
| Ligne 6: | Ligne 6: | ||
| - | Générer automatiquement un `configure.scan`: | + | |
| + | ==== Mise en place minimale ==== | ||
| + | |||
| + | Générer automatiquement un '' | ||
| <code bash> | <code bash> | ||
| autoscan | autoscan | ||
| - | mv configure.{scan, | + | mv configure.{scan, |
| </ | </ | ||
| + | |||
| + | Créer un '' | ||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | autoreconf -i | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | <code autoconf> | ||
| + | AC_PREREQ([2.69]) | ||
| + | AC_INIT([nom-du-projet], | ||
| + | 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/ | ||
| + | AC_CONFIG_HEADERS([src/ | ||
| + | |||
| + | AM_SILENT_RULES(yes) # n' | ||
| + | |||
| + | AC_PROG_CC # cherche un compilateur C | ||
| + | AM_PROG_CC_C_O # enable per-target flags, required for automake < 1.14 | ||
| + | |||
| + | AC_CONFIG_FILES([Makefile src/ | ||
| + | AC_OUTPUT | ||
| + | </ | ||
| + | |||
| + | Un '' | ||
| + | <code make> | ||
| + | SUBDIRS = src | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | <code make> | ||
| + | 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' | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | Placer le fichier source de la macro dans un dossier '' | ||
| + | |||
| + | A priori il faut aussi placer | ||
| + | <code autoconf> | ||
| + | m4_include([m4/ | ||
| + | </ | ||
| + | en haut du configure (sinon '' | ||
| + | |||
| + | Une autre solution semble être: | ||
| + | <code autoconf> | ||
| + | AC_CONFIG_MACRO_DIR([m4]) | ||
| + | </ | ||
| + | dans le configure ([[https:// | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Utiliser pkg-config ==== | ||
| + | |||
| + | Fonctionnement minimal: | ||
| + | <code autoconf> | ||
| + | PKG_CHECK_MODULES([HWLOC], | ||
| + | </ | ||
| + | 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é | ||
| + | <code make> | ||
| + | program_CFLAGS = $(HWLOC_CFLAGS) | ||
| + | program_LDADD = $(HWLOC_LIBS) | ||
| + | </ | ||
| + | |||
| + | Sur certains (anciens ?) systèmes, il est nécessaire d' | ||
| + | |||
| + | |||
| + | ==== Variable conditionnelle ==== | ||
| + | |||
| + | <code autoconf> | ||
| + | AM_CONDITIONAL(HAVE_HWLOC, | ||
| + | </ | ||
| + | Cette instruction n'a d' | ||
| + | <code make> | ||
| + | if HAVE_HWLOC | ||
| + | bin_PROGRAMS += program_with_hwloc | ||
| + | endif | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Chercher un programme ==== | ||
| + | |||
| + | <code autoconf> | ||
| + | have_mpi=no | ||
| + | AC_PATH_PROG(mpicc_path, | ||
| + | AM_CONDITIONAL([HAVE_MPI], | ||
| + | if test x$mpicc_path != xno; then | ||
| + | CC=$mpicc_path | ||
| + | have_mpi=yes | ||
| + | fi | ||
| + | </ | ||
| + | Paramètres: | ||
| + | - Variable qui contiendra le chemin du programme | ||
| + | - Programme à chercher | ||
| + | - Optionnel: valeur par défaut si le programme n'est pas trouvé. Par défaut, renvoie une chaîne de caractères vide si le programme n'est pas trouvé. | ||
| + | - Il est aussi possible de préciser le '' | ||
| + | |||
| + | |||
| + | ==== Compilateur ==== | ||
| + | |||
| + | |||
| + | === Changer le compilateur === | ||
| + | |||
| + | Il suffit de définir la variable '' | ||
| + | |||
| + | |||
| + | === CFLAGS === | ||
| + | |||
| + | Des CFLAGS sont positionnés par défaut dès que l'on fait un test qui implique un compilateur. Il faut donc définir les CFLAGS au début du configure. | ||
| + | |||
| + | L' | ||
| + | <code bash> | ||
| + | ./configure CFLAGS=" | ||
| + | </ | ||
| + | Il faut donc aussi le récupérer dans le configure: | ||
| + | <code autoconf> | ||
| + | CFLAGS=" | ||
| + | </ | ||
| + | ==== Chercher une bibliothèque ==== | ||
| + | |||
| + | <code autoconf> | ||
| + | have_likwid=no | ||
| + | AC_CHECK_LIB([likwid], | ||
| + | | ||
| + | have_likwid=yes]) | ||
| + | AC_SUBST([LIKWID_LIBS]) | ||
| + | AM_CONDITIONAL(HAVE_LIKWID, | ||
| + | </ | ||
| + | Paramètres de '' | ||
| + | - 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 | ||
| + | '' | ||
| + | <code make> | ||
| + | if HAVE_LIKWID | ||
| + | bin_PROGRAMS += uncore_set | ||
| + | |||
| + | uncore_set_SOURCES = uncore_set.c | ||
| + | uncore_set_LDADD = $(LIKWID_LIBS) | ||
| + | endif | ||
| + | </ | ||
| + | |||
| + | Il est possible de définir les flags pour toutes les cibles, en mettant en haut d'un '' | ||
| + | <code make> | ||
| + | LDADD = $(HWLOC_LIBS) | ||
| + | AM_CFLAGS = $(HWLOC_CFLAGS) | ||
| + | </ | ||
| + | |||
| + | Il est possible de chercher une bibliothèque et utiliser les flags requis, depuis le fichier '' | ||
| + | <code autoconf> | ||
| + | AC_SEARCH_LIBS([hwloc_free], | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ==== Chercher une fonction dans une bibliothèque ==== | ||
| + | |||
| + | Il est nécessaire de mettre à jour les flags pour que le compilateur puisse linker la bibliothèque où la fonction est supposée être: | ||
| + | <code autoconf> | ||
| + | PKG_CHECK_MODULES([STARPU], | ||
| + | AM_CONDITIONAL(HAVE_STARPU, | ||
| + | if test x$have_starpu = xyes; then | ||
| + | save_LIBS=" | ||
| + | save_CFLAGS=" | ||
| + | CFLAGS=" | ||
| + | LIBS=" | ||
| + | AC_CHECK_FUNCS([starpu_free_noflag]) | ||
| + | CFLAGS=" | ||
| + | LIBS=" | ||
| + | fi | ||
| + | </ | ||
| + | Cela va définir une constante de préprocesseur '' | ||
| + | |||
| + | Il est possible de chercher des fonctions en précisant dans quel fichier d' | ||
| + | <code autoconf> | ||
| + | AC_CHECK_DECLS([_mm_stream_si32], | ||
| + | </ | ||
| + | Cela va définir une constante de préprocesseur '' | ||
| + | |||
| + | |||
| + | |||
| + | ==== Définir une variable de préprocesseur ==== | ||
| + | |||
| + | <code autoconf> | ||
| + | AC_DEFINE(HAVE_MKL, | ||
| + | </ | ||
| + | Paramètres: | ||
| + | - nom de la define | ||
| + | - valeur | ||
| + | - description, | ||
| + | |||
| + | |||
| + | |||
| + | ==== Connaître l' | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | <code autoconf> | ||
| + | AC_CANONICAL_HOST | ||
| + | if test $host_cpu = x86_64; then | ||
| + | # ... | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Tester le support d'un jeu d' | ||
| + | |||
| + | Utiliser la macro '' | ||
| + | <code autoconf> | ||
| + | AX_GCC_X86_CPU_SUPPORTS(avx512f, | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Tester OpenMP ==== | ||
| + | |||
| + | <code autoconf> | ||
| + | AC_OPENMP | ||
| + | </ | ||
| + | Les cflags sont ensuite disponibles via '' | ||
| + | |||
| + | |||
| + | |||
| + | ==== Afficher un message ==== | ||
| + | |||
| + | Pendant le configure: | ||
| + | <code autoconf> | ||
| + | AC_MSG_NOTICE([ | ||
| + | |||
| + | Configuration summary: | ||
| + | foo | ||
| + | ]) | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ==== Enable option ==== | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | <code autoconf> | ||
| + | AC_MSG_CHECKING(whether debug mode should be enabled) | ||
| + | AC_ARG_ENABLE(debug, | ||
| + | enable_debug=$enableval, | ||
| + | AC_MSG_RESULT($enable_debug) | ||
| + | |||
| + | if test x$enable_debug = xyes; then | ||
| + | CFLAGS=" | ||
| + | else | ||
| + | CFLAGS=" | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | On peut ensuite appeler: | ||
| + | <code bash> | ||
| + | ../ | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ==== Composants externes ==== | ||
| + | |||
| + | <code autoconf> | ||
| + | mpicc_name=mpicc | ||
| + | AC_ARG_WITH(mpicc, | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ==== .gitignore ==== | ||
| + | |||
| + | < | ||
| + | *~ | ||
| + | Makefile.in | ||
| + | /aclocal.m4 | ||
| + | / | ||
| + | /build | ||
| + | /build-aux | ||
| + | /configure | ||
| + | src/ | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||