# Autotools detect C++ language standard support

I have been updating my build tools to optionally use autotools (autoconfig/automake/libtool etc.).

As part of this change I have written a couple of M4 macros. This not being something I have done before. Any input is appreciated on style or if things can be done better.

A macro for detecting what version of C++ is available and defining the correct flags:

AC_DEFUN(
[AX_FUNC_THOR_LANG_FLAG],
[
minLangFeature=$1 AS_IF([test "$2" = ""], [maxLangFeature=17], [maxLangFeature=$2]) AS_IF([test$minLangFeature -gt $maxLangFeature], AC_MSG_ERROR([Invalid Language Value],[1])) AC_LANG(C++) CXXMaxLanguage=03 CXXExpLanguage=03 AX_CHECK_COMPILE_FLAG([-std=c++11], [AC_SUBST([CXXMaxLanguage],11) AC_SUBST([StdFlag11],[-std=c++11])]) AX_CHECK_COMPILE_FLAG([-std=c++14], [AC_SUBST([CXXMaxLanguage],14) AC_SUBST([StdFlag14],[-std=c++14])]) AX_CHECK_COMPILE_FLAG([-std=c++17], [AC_SUBST([CXXMaxLanguage],17) AC_SUBST([StdFlag17],[-std=c++17])]) AX_CHECK_COMPILE_FLAG([-std=c++1x], [AC_SUBST([CXXExpLanguage],11) AC_SUBST([ExpFlag11],[-std=c++1x])]) AX_CHECK_COMPILE_FLAG([-std=c++1y], [AC_SUBST([CXXExpLanguage],14) AC_SUBST([ExpFlag14],[-std=c++1y])]) AX_CHECK_COMPILE_FLAG([-std=c++1z], [AC_SUBST([CXXExpLanguage],17) AC_SUBST([ExpFlag17],[-std=c++1z])]) #CXX_STD_FLAG #CXXSTDVER AS_IF( [test$minLangFeature -le $CXXMaxLanguage], [ AS_IF( [test$maxLangFeature -le $CXXMaxLanguage], [AC_SUBST([CXXSTDVER], [$maxLangFeature])],
[AC_SUBST([CXXSTDVER], [$CXXMaxLanguage])] ) AC_SUBST([CXX_STD_FLAG], [$(eval echo "${StdFlag{CXXSTDVER}}")]) ], [AS_IF( [test minLangFeature -le CXXExpLanguage], [ AS_IF( [test maxLangFeature -le CXXExpLanguage], [AC_SUBST([CXXSTDVER], [maxLangFeature])], [AC_SUBST([CXXSTDVER], [CXXExpLanguage])] ) AC_SUBST([CXX_STD_FLAG], [(eval echo "${ExpFlag${CXXSTDVER}}")]) ], [AC_MSG_ERROR([ Error: Need C++${minLangFeature} but the compiler only supports ${CXXMaxLanguage} (Experimental${CXXExpLanguage})

], [1])]
)]
)
]
)


Usage:

AX_FUNC_THOR_LANG_FLAG(<min acceptable C++> [, <max acceptable C++>])


If you don't specify a max then 17 is used as the default. It works out what flags are available to modify the behavior of the C++ compiler to a different version of the standard and then defines the two macros:

CXXSTDVER      /* Will hold 03 11 14 or 17 */
CXX_STD_FLAG   /* Will hold the flag needed be the C++ compiler */


It considers -std=c++1[147] as standard version and will use these if they satisfy the minimum requirements. It considers -std=c++1[xyz] as experimental versions and will only use these if the minimum requirements cannot be achieved by using the standard version flags.