ax_cxx_compile_stdcxx_11.m4 5.49 KB
Newer Older
Kenton Varda's avatar
Kenton Varda committed
1 2
# ============================================================================
#  http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
3
#  Additionally modified to detect -stdlib by Kenton Varda.
Kenton Varda's avatar
Kenton Varda committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# ============================================================================
#
# SYNOPSIS
#
#   AX_CXX_COMPILE_STDCXX_11([ext|noext])
#
# DESCRIPTION
#
#   Check for baseline language coverage in the compiler for the C++11
#   standard; if necessary, add switches to CXXFLAGS to enable support.
#   Errors out if no mode that supports C++11 baseline syntax can be found.
#   The 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.
#
20 21 22 23 24
#   Additionally, check if the standard library supports C++11.  If not,
#   try adding -stdlib=libc++ to see if that fixes it.  This is needed e.g.
#   on Mac OSX 10.8, which ships with a very old libstdc++ but a relatively
#   new libc++.
#
25 26 27 28 29 30 31
#   Both flags are actually added to CXX rather than CXXFLAGS to work around
#   a bug in libtool: -stdlib is stripped from CXXFLAGS when linking dynamic
#   libraries because it is not recognized.  A patch was committed to mainline
#   libtool in February 2012 but as of June 2013 there has not yet been a
#   release containing this patch.
#      http://git.savannah.gnu.org/gitweb/?p=libtool.git;a=commit;h=c0c49f289f22ae670066657c60905986da3b555f
#
Kenton Varda's avatar
Kenton Varda committed
32 33 34 35
# LICENSE
#
#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
36
#   Copyright (c) 2013 Kenton Varda <temporal@gmail.com>
Kenton Varda's avatar
Kenton Varda committed
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#
#   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 1

m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [
  template <typename T>
    struct check
    {
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
    };

    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);
])

62 63 64 65 66 67 68
m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody_lib], [
  #include <initializer_list>
  #include <unordered_map>
  #include <atomic>
  #include <thread>
])

Kenton Varda's avatar
Kenton Varda committed
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
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
  AC_LANG_ASSERT([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,
91 92
        [ac_save_CXX="$CXX"
         CXX="$CXX $switch"
Kenton Varda's avatar
Kenton Varda committed
93 94 95
         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
          [eval $cachevar=yes],
          [eval $cachevar=no])
96
         CXX="$ac_save_CXX"])
Kenton Varda's avatar
Kenton Varda committed
97
      if eval test x\$$cachevar = xyes; then
98
        CXX="$CXX $switch"
Kenton Varda's avatar
Kenton Varda committed
99 100 101 102 103 104 105 106 107 108 109 110
        ac_success=yes
        break
      fi
    done
  fi])

  m4_if([$1], [ext], [], [dnl
  if test x$ac_success = xno; then
    for switch in -std=c++11 -std=c++0x; do
      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
                     $cachevar,
111 112
        [ac_save_CXX="$CXX"
         CXX="$CXX $switch"
Kenton Varda's avatar
Kenton Varda committed
113 114 115
         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
          [eval $cachevar=yes],
          [eval $cachevar=no])
116
         CXX="$ac_save_CXX"])
Kenton Varda's avatar
Kenton Varda committed
117
      if eval test x\$$cachevar = xyes; then
118
        CXX="$CXX $switch"
Kenton Varda's avatar
Kenton Varda committed
119 120 121 122 123 124 125 126
        ac_success=yes
        break
      fi
    done
  fi])

  if test x$ac_success = xno; then
    AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
127 128 129 130 131 132 133 134 135 136 137 138 139 140
  else
    ac_success=no
    AC_CACHE_CHECK(whether $CXX supports C++11 library features by default,
                   ax_cv_cxx_compile_cxx11_lib,
      [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody_lib])],
         [ax_cv_cxx_compile_cxx11_lib=yes],
         [ax_cv_cxx_compile_cxx11_lib=no])
      ])
    if test x$ax_cv_cxx_compile_cxx11_lib = xyes; then
      ac_success=yes
    else
      # Try with -stdlib=libc++
      AC_CACHE_CHECK(whether $CXX supports C++11 library features with -stdlib=libc++,
                     ax_cv_cxx_compile_cxx11_lib_libcxx,
141 142
        [ac_save_CXX="$CXX"
         CXX="$CXX -stdlib=libc++"
143 144 145
         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody_lib])],
          [eval ax_cv_cxx_compile_cxx11_lib_libcxx=yes],
          [eval ax_cv_cxx_compile_cxx11_lib_libcxx=no])
146
         CXX="$ac_save_CXX"])
147
      if eval test x$ax_cv_cxx_compile_cxx11_lib_libcxx = xyes; then
148
        CXX="$CXX -stdlib=libc++"
149 150 151 152 153 154
        ac_success=yes
        break
      fi
    fi

    if test x$ac_success = xno; then
Kenton Varda's avatar
Kenton Varda committed
155
      AC_MSG_ERROR([*** A C++ library with support for C++11 features is required.])
156
    fi
Kenton Varda's avatar
Kenton Varda committed
157 158
  fi
])