diff options
author | Slávek Banko <[email protected]> | 2022-01-28 01:26:57 +0100 |
---|---|---|
committer | Slávek Banko <[email protected]> | 2022-01-28 09:34:53 +0100 |
commit | 64960434843c77f8ac0981c2151bd1c4b4d806a1 (patch) | |
tree | d49f3dde122de6ab91bf88c88228315dc657120a | |
parent | ba60229fb724b73d65b9342ade8d84f54722a425 (diff) | |
download | admin-64960434843c77f8ac0981c2151bd1c4b4d806a1.tar.gz admin-64960434843c77f8ac0981c2151bd1c4b4d806a1.zip |
Add TDE_CXX_COMPILE_STDCXX macro to check and enforce C++ standard.
The macro is a simplified form of AX_CXX_COMPILE_STDCXX from autoconf.
To verify the C++ standard supported by the compiler, only the value
of the __cplusplus constant defined by the compiler is checked,
instead of testing examples of using individual C++ features.
Signed-off-by: Slávek Banko <[email protected]>
(cherry picked from commit b9fb6ca397bdded4d891b42eccb09f37279761a5)
-rw-r--r-- | acinclude.m4.in | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/acinclude.m4.in b/acinclude.m4.in index 9ea22f7..79a764f 100644 --- a/acinclude.m4.in +++ b/acinclude.m4.in @@ -6953,3 +6953,215 @@ EOF AC_SUBST(LIBSQLITE3) fi ]) +# =========================================================================== +# +# SYNOPSIS +# +# TDE_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the specified +# version of the C++ standard. If necessary, add switches to CXX and +# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) +# or '14' (for the C++14 standard). +# +# The second argument, if specified, indicates whether you insist on an +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. +# -std=c++11). If neither is specified, you get whatever works, with +# preference for no added switch, and then for an extended mode. +# +# The third argument, if specified 'mandatory' or if left unspecified, +# indicates that baseline support for the specified C++ standard is +# required and that the macro should error out if no mode with that +# support is found. If specified 'optional', then configuration proceeds +# regardless, after defining HAVE_CXX${VERSION} if and only if a +# supporting mode is found. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik <[email protected]> +# Copyright (c) 2012 Zack Weinberg <[email protected]> +# Copyright (c) 2013 Roy Stogner <[email protected]> +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <[email protected]> +# Copyright (c) 2015 Paul Norman <[email protected]> +# Copyright (c) 2015 Moritz Klammler <[email protected]> +# Copyright (c) 2016, 2018 Krzesimir Nowak <[email protected]> +# Copyright (c) 2019 Enji Cooper <[email protected]> +# Copyright (c) 2020 Jason Merrill <[email protected]> +# Copyright (c) 2021 Slávek Banko <[email protected]> +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +dnl This macro is simplified version of the macro AX_CXX_COMPILE_STDCXX + +AC_DEFUN([TDE_CXX_COMPILE_STDCXX], [dnl + m4_if([$1], [11], [tde_cxx_compile_alternatives="11 0x"], + [$1], [14], [tde_cxx_compile_alternatives="14 1y"], + [$1], [17], [tde_cxx_compile_alternatives="17 1z"], + [m4_fatal([invalid first argument `$1' to TDE_CXX_COMPILE_STDCXX])])dnl + m4_if([$2], [], [], + [$2], [ext], [], + [$2], [noext], [], + [m4_fatal([invalid second argument `$2' to TDE_CXX_COMPILE_STDCXX])])dnl + m4_if([$3], [], [tde_cxx_compile_cxx$1_required=true], + [$3], [mandatory], [tde_cxx_compile_cxx$1_required=true], + [$3], [optional], [tde_cxx_compile_cxx$1_required=false], + [m4_fatal([invalid third argument `$3' to TDE_CXX_COMPILE_STDCXX])]) + AC_LANG_PUSH([C++])dnl + ac_success=no + + m4_if([$2], [], [dnl + AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, + tde_cv_cxx_compile_cxx$1, + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_TDE_CXX_COMPILE_STDCXX_testbody_$1])], + [tde_cv_cxx_compile_cxx$1=yes], + [tde_cv_cxx_compile_cxx$1=no])]) + if test x$tde_cv_cxx_compile_cxx$1 = xyes; then + ac_success=yes + fi]) + + m4_if([$2], [noext], [], [dnl + if test x$ac_success = xno; then + for alternative in ${tde_cxx_compile_alternatives}; do + switch="-std=gnu++${alternative}" + cachevar=AS_TR_SH([tde_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_TDE_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi]) + + m4_if([$2], [ext], [], [dnl + if test x$ac_success = xno; then + dnl HP's aCC needs +std=c++11 according to: + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf + dnl Cray's crayCC needs "-h std=c++11" + for alternative in ${tde_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do + cachevar=AS_TR_SH([tde_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_TDE_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done + fi]) + AC_LANG_POP([C++]) + if test x$tde_cxx_compile_cxx$1_required = xtrue; then + if test x$ac_success = xno; then + AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) + fi + fi + if test x$ac_success = xno; then + HAVE_CXX$1=0 + AC_MSG_NOTICE([No compiler with C++$1 support was found]) + else + HAVE_CXX$1=1 + AC_DEFINE(HAVE_CXX$1,1, + [define if the compiler supports basic C++$1 syntax]) + fi + AC_SUBST(HAVE_CXX$1) +]) + + +dnl Test body for checking C++11 support + +m4_define([_TDE_CXX_COMPILE_STDCXX_testbody_11], + _TDE_CXX_COMPILE_STDCXX_testbody_new_in_11 +) + + +dnl Test body for checking C++14 support + +m4_define([_TDE_CXX_COMPILE_STDCXX_testbody_14], + _TDE_CXX_COMPILE_STDCXX_testbody_new_in_11 + _TDE_CXX_COMPILE_STDCXX_testbody_new_in_14 +) + +m4_define([_TDE_CXX_COMPILE_STDCXX_testbody_17], + _TDE_CXX_COMPILE_STDCXX_testbody_new_in_11 + _TDE_CXX_COMPILE_STDCXX_testbody_new_in_14 + _TDE_CXX_COMPILE_STDCXX_testbody_new_in_17 +) + +dnl Tests for new features in C++11 + +m4_define([_TDE_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201103L + +#error "This is not a C++11 compiler" + +#endif // __cplusplus >= 201103L + +]]) + + +dnl Tests for new features in C++14 + +m4_define([_TDE_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L + +#error "This is not a C++14 compiler" + +#endif // __cplusplus >= 201402L + +]]) + + +dnl Tests for new features in C++17 + +m4_define([_TDE_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201703L + +#error "This is not a C++17 compiler" + +#endif // __cplusplus >= 201703L + +]]) |