17
\$\begingroup\$

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.

\$\endgroup\$
6

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.