[[https://www.gnu.org/software/autoconf/manual/autoconf.pdf|Manuel 2.69]], {{ :autotools:configure.ac:autoconf_2_69.pdf |Archive}}
====Détection des options de compilation compatible avec CXX====
Défini le langage du compilateur : g++ donc le compilateur défini par ''CXX''.
Activation automatique des ''-Wwarnings'' supportés.
AC_LANG(C++)
for NEW_FLAG in \
-Wall \
-Wcast-align
do
AC_MSG_CHECKING([if $CXX accepts $NEW_FLAG])
OLD_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $NEW_FLAG -Werror"
#AC_COMPILE_IFELSE utilise CXXFLAGS pas AM_CXXFLAGS
AC_COMPILE_IFELSE([AC_LANG_SOURCE(
[void foo(void); void foo(void) { }])], [
AM_CXXFLAGS="$AM_CXXFLAGS $NEW_FLAG"
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
CXXFLAGS="$OLD_CXXFLAGS"
done
[[https://github.com/gcc-mirror/gcc/blob/master/config/warnings.m4|warnings.m4]], {{:autotools:configure.ac:warnings.m4|Archive}} : gcc ne crée pas d'avertissement dans le cas de ''-Wno-*'' non supporté. Il est donc nécessaire de tester la version ''-W*''.
Activation automatique des ''-Wno-warnings'' supportés. On teste les ''-Warnings'' mais on ajoute ''-Wno-warnings''
AC_LANG(C++)
for NEW_FLAG in \
c++98-compat \
c++98-compat-pedantic
do
AC_MSG_CHECKING([if $CXX accepts -Wno-$NEW_FLAG])
OLD_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS -W$NEW_FLAG -Werror -Wno-unused-macros"
AC_COMPILE_IFELSE([AC_LANG_SOURCE(
[void foo(void); void foo(void) { }])], [
AM_CXXFLAGS="$AM_CXXFLAGS -Wno-$NEW_FLAG"
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
CXXFLAGS="$OLD_CXXFLAGS"
done
====Le cas clang====
clang préfère avoir ''-fno-use-cxa-atexit'' pour éviter des erreurs de type "hidden symbol `atexit'.
Il suffit d'ajouter la fonction suivante :
AC_TRY_LINK([
#include
],
[
#ifndef __clang__
This is not clang!
#endif
],
[AM_CXXFLAGS="$AM_CXXFLAGS -fno-use-cxa-atexit"],
[])
====Forcer du code dans le config.h====
AH_BOTTOM([
#ifdef _MSC_VER
#define CHK _Check_return_
#ifndef ssize_t
#include
typedef SSIZE_T ssize_t;
#endif // !ssize_t
#else // !_MSC_VER
#define CHK __attribute__ ((__warn_unused_result__))
#endif
#if defined(_MSC_VER)
#define SSCANF sscanf_s
#define DllExport __declspec(dllexport)
#else
#define SSCANF sscanf
#define DllExport
#endif
])
====Ajout d'une option --with-…====
# Vérification de la possibilité de compiler la documentation via doxygen
AC_ARG_WITH(doc,
AS_HELP_STRING([--with-doc],
[build with doc support]))
if test "$with_doc" != "yes"; then
withdoc=false
else
withdoc=true
fi
AC_MSG_RESULT([with-doc $withdoc])
AC_CHECK_PROGS([DOXYGEN], [doxygen])
if test -z "$DOXYGEN";
then AC_MSG_WARN([Doxygen introuvable - documentation non compilable])
fi
AM_CONDITIONAL(HAVE_DOXYGEN, test x$withdoc = xtrue && test -n "$DOXYGEN")
if test x$withdoc = xtrue; then
AC_DEFINE(ENABLE_DOC, 1, [Défini si la doc doit être générée])
fi