summaryrefslogtreecommitdiff
path: root/m4/ax_cxx_compile_stdcxx_11.m4
diff options
context:
space:
mode:
authorMoritz Klammler <moritz@klammler.eu>2015-10-02 13:15:09 +0200
committerPeter Simons <simons@cryp.to>2015-11-23 11:48:45 +0100
commit3a8480edb2e6784f3d8f7e6e0b4181e70c626af0 (patch)
treedd9a9f679c47f56d4c7dcd73481b7c94ae222e6c /m4/ax_cxx_compile_stdcxx_11.m4
parentbd1d2f55014ddd9061545c048d982a3c11851d90 (diff)
downloadautoconf-archive-3a8480edb2e6784f3d8f7e6e0b4181e70c626af0.tar.gz
Unify macros for checking C++11/14/... compiler support.
* m4/ax_cxx_compile_stdcxx.m4: New macro file added. (AX_CXX_COMPILE_STDCXX): New macro added. The code is based on the former (serial version number 13) `AX_CXX_COMPILE_STDCXX_11` macro, generalized to check for arbitrary versions of the standard selected via an additional argument. (_AX_CXX_COMPILE_STDCXX_testbody_11): New internal macro added. Defined in terms of `_AX_CXX_COMPILE_STDCXX_testbody_new_in_11`. (_AX_CXX_COMPILE_STDCXX_testbody_14): New internal macro added. Defined in terms of `_AX_CXX_COMPILE_STDCXX_testbody_new_in_11` and `_AX_CXX_COMPILE_STDCXX_testbody_new_in_14`. (_AX_CXX_COMPILE_STDCXX_testbody_new_in_11): New internal macro added. Test code to check for features added in C++14. It is based on the code previously found in the `_AX_CXX_COMPILE_STDCXX_11_testbody` macro, defined in `m4/ax_cxx_compile_stdcxx_11.m4` but heavily refactored and extended with additional checks. (_AX_CXX_COMPILE_STDCXX_testbody_new_in_14): New internal macro added. Test code to check for features added in C++14. * m4/ax_cxx_compile_stdcxx_11.m4: (AX_CXX_COMPILE_STDCXX_11): Make this macro an alias for the new `AX_CXX_COMPILE_STDCXX` macro with the version set to C++11. (_AX_CXX_COMPILE_STDCXX_11_testbody): Internal macro deleted. * m4/ax_cxx_compile_stdcxx_14.m4: New macro file added. (AX_CXX_COMPILE_STDCXX_14): New macro added. This macro is an alias for the new `AX_CXX_COMPILE_STDCXX` macro with the version set to C++14. * m4/ax_cxx_compile_stdcxx_0x.m4 (AX_CXX_COMPILE_STDCXX_0X): Mark macro as obsolete. The macro `AX_CXX_COMPILE_STDCXX_11` should be used instead. I couldn't test this macro on my system because it uses a lot of obsolete macros my Autoconf complains about and errors out.
Diffstat (limited to 'm4/ax_cxx_compile_stdcxx_11.m4')
-rw-r--r--m4/ax_cxx_compile_stdcxx_11.m4155
1 files changed, 11 insertions, 144 deletions
diff --git a/m4/ax_cxx_compile_stdcxx_11.m4 b/m4/ax_cxx_compile_stdcxx_11.m4
index 516da37..09db383 100644
--- a/m4/ax_cxx_compile_stdcxx_11.m4
+++ b/m4/ax_cxx_compile_stdcxx_11.m4
@@ -4,23 +4,19 @@
#
# SYNOPSIS
#
-# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
+# AX_CXX_COMPILE_STDCXX_11([ext|noext], [mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the C++11
# standard; if necessary, add switches to CXXFLAGS to enable support.
#
-# The first 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 an extended mode.
-#
-# The second argument, if specified 'mandatory' or if left unspecified,
-# indicates that baseline C++11 support 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_CXX11 if and only if a supporting mode is found.
+# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX
+# macro with the version set to C++11. The two optional arguments are
+# forwarded literally as the second and third argument respectively.
+# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for
+# more information. If you want to use this macro, you also need to
+# download the ax_cxx_compile_stdcxx.m4 file.
#
# LICENSE
#
@@ -29,144 +25,15 @@
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
+# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
#
# 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.
-#serial 13
-
-m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[
- template <typename T>
- struct check
- {
- static_assert(sizeof(int) <= sizeof(T), "not big enough");
- };
-
- struct Base {
- virtual void f() {}
- };
- struct Child : public Base {
- virtual void f() override {}
- };
-
- typedef check<check<bool>> right_angle_brackets;
-
- int a;
- decltype(a) b;
-
- typedef check<int> check_type;
- check_type c;
- check_type&& cr = static_cast<check_type&&>(c);
-
- auto d = a;
- auto l = [](){};
- // Prevent Clang error: unused variable 'l' [-Werror,-Wunused-variable]
- struct use_l { use_l() { l(); } };
-
- // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
- // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function because of this
- namespace test_template_alias_sfinae {
- struct foo {};
-
- template<typename T>
- using member = typename T::member_type;
-
- template<typename T>
- void func(...) {}
-
- template<typename T>
- void func(member<T>*) {}
-
- void test();
-
- void test() {
- func<foo>(0);
- }
- }
-
- // Check for C++11 attribute support
- void noret [[noreturn]] () { throw 0; }
-]])
-
-AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
- m4_if([$1], [], [],
- [$1], [ext], [],
- [$1], [noext], [],
- [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
- m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
- [$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
- [$2], [optional], [ax_cxx_compile_cxx11_required=false],
- [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])
- AC_LANG_PUSH([C++])dnl
- ac_success=no
- AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
- ax_cv_cxx_compile_cxx11,
- [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
- [ax_cv_cxx_compile_cxx11=yes],
- [ax_cv_cxx_compile_cxx11=no])])
- if test x$ax_cv_cxx_compile_cxx11 = xyes; then
- ac_success=yes
- fi
-
- m4_if([$1], [noext], [], [dnl
- if test x$ac_success = xno; then
- for switch in -std=gnu++11 -std=gnu++0x; do
- cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
- AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
- $cachevar,
- [ac_save_CXXFLAGS="$CXXFLAGS"
- CXXFLAGS="$CXXFLAGS $switch"
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
- [eval $cachevar=yes],
- [eval $cachevar=no])
- CXXFLAGS="$ac_save_CXXFLAGS"])
- if eval test x\$$cachevar = xyes; then
- CXXFLAGS="$CXXFLAGS $switch"
- ac_success=yes
- break
- fi
- done
- fi])
+#serial 14
- m4_if([$1], [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 switch in -std=c++11 -std=c++0x +std=c++11 "-h std=c++11"; do
- cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
- AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
- $cachevar,
- [ac_save_CXXFLAGS="$CXXFLAGS"
- CXXFLAGS="$CXXFLAGS $switch"
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
- [eval $cachevar=yes],
- [eval $cachevar=no])
- CXXFLAGS="$ac_save_CXXFLAGS"])
- if eval test x\$$cachevar = xyes; then
- CXXFLAGS="$CXXFLAGS $switch"
- ac_success=yes
- break
- fi
- done
- fi])
- AC_LANG_POP([C++])
- if test x$ax_cxx_compile_cxx11_required = xtrue; then
- if test x$ac_success = xno; then
- AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
- fi
- else
- if test x$ac_success = xno; then
- HAVE_CXX11=0
- AC_MSG_NOTICE([No compiler with C++11 support was found])
- else
- HAVE_CXX11=1
- AC_DEFINE(HAVE_CXX11,1,
- [define if the compiler supports basic C++11 syntax])
- fi
+include([ax_cxx_compile_stdcxx.m4])
- AC_SUBST(HAVE_CXX11)
- fi
-])
+AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [AX_CXX_COMPILE_STDCXX([11], [$1], [$2])])