diff options
author | Luboš Luňák <l.lunak@suse.cz> | 2013-06-13 19:12:43 +0200 |
---|---|---|
committer | Luboš Luňák <l.lunak@suse.cz> | 2013-06-13 20:08:16 +0200 |
commit | 44159c6cdf3127ef8ee628f07f3f2d38a93dc3b2 (patch) | |
tree | 2ffd7673b46ad86af76b156eaa3d97ea2a12af79 /configure.ac | |
parent | d7ae9f7743d946845a8379e2fb47666f124e2c87 (diff) |
split the 'can we use C++11' check into independent tests for each problem
Change-Id: If0fdc13b02ca6dd4eb67afee5b308d2e51a5b30d
Diffstat (limited to 'configure.ac')
-rw-r--r-- | configure.ac | 125 |
1 files changed, 78 insertions, 47 deletions
diff --git a/configure.ac b/configure.ac index 0e83a3ba61a6..07885b508786 100644 --- a/configure.ac +++ b/configure.ac @@ -5560,31 +5560,51 @@ dnl C++11 dnl =================================================================== CXXFLAGS_CXX11= +HAVE_CXX11= if test "$GCC" = "yes"; then - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + CXXFLAGS_CXX11= + AC_MSG_CHECKING([whether $CXX supports C++11]) + for flag in -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x ; do + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $flag -Werror" + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[void f() {}]])],[CXXFLAGS_CXX11=$flag]) + AC_LANG_POP([C++]) + CXXFLAGS=$save_CXXFLAGS + if test -n "$CXXFLAGS_CXX11"; then + HAVE_CXX11=TRUE + break + fi + done + if test "$HAVE_CXX11" = TRUE; then + AC_MSG_RESULT([yes ($CXXFLAGS_CXX11)]) + else + AC_MSG_RESULT(no) + fi + + if test "$HAVE_CXX11" = TRUE; then + AC_MSG_CHECKING([whether using C++11 causes libstdc++ 4.7.0/4.7.1 ABI breakage]) + # This should check libstdc++ version, not gcc, but clang has incidentally C++11 support + # disabled in this case by the __float128 case below. + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if __GNUC__ == 4 && __GNUC_MINOR__ == 7 && (__GNUC_PATCHLEVEL__ == 0 || __GNUC_PATCHLEVEL__ == 1) +abi broken #else -abi ok #endif -]])],[HAVE_BROKEN_ABI=TRUE],[HAVE_BROKEN_ABI=FALSE]) + ]])], [AC_MSG_RESULT(no, ok)], + [AC_MSG_RESULT(yes, disabling C++11) + HAVE_CXX11=]) + fi - AC_MSG_CHECKING([whether $CXX supports C++11 without Language Defect 757]) - # This should check libstdc++ version, not gcc, but clang has incidentally C++11 support - # disabled in this case by the __float128 case below. - if test "$HAVE_BROKEN_ABI" = "TRUE"; then - AC_MSG_NOTICE([Not using -std=gnu++0x on $CXX version 4.7.0/4.7.1 due to libstdc++ ABI breakage.]) - else + if test "$HAVE_CXX11" = TRUE; then + AC_MSG_CHECKING([whether $CXX supports C++11 without Language Defect 757]) save_CXXFLAGS=$CXXFLAGS - CXXFLAGS="$CXXFLAGS -std=gnu++0x" + CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" AC_LANG_PUSH([C++]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <stddef.h> -#include <vector> - // some Clang fail when compiling against GCC 4.7 headers with -std=gnu++0x - // (__float128) - template <typename T, size_t S> char (&sal_n_array_size( T(&)[S] ))[S]; namespace @@ -5607,22 +5627,37 @@ size_t i = sizeof(sal_n_array_size(thinga)); size_t j = sizeof(sal_n_array_size(thingb)); return !(i != 0 && j != 0); ]]) - ],[ - HAVE_CXX11=TRUE - if test "$CPP_LIBRARY" = LIBCPP -a $_os = Darwin; then - : Already set CXX to contain -std=c++11 - else - CXXFLAGS_CXX11=-std=gnu++0x - fi - ],[]) + ], [ AC_MSG_RESULT(yes) ], + [ AC_MSG_RESULT(no) + HAVE_CXX11= + ]) + AC_LANG_POP([C++]) + CXXFLAGS=$save_CXXFLAGS + fi + + if test "$HAVE_CXX11" = TRUE; then + AC_MSG_CHECKING([whether $CXX supports C++11 without __float128 compile error]) + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" + AC_LANG_PUSH([C++]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include <vector> + // some Clang fail when compiling against GCC 4.7 headers with -std=gnu++0x + // (__float128) +]]) + ],[ AC_MSG_RESULT(yes) ], + [ AC_MSG_RESULT(no) + HAVE_CXX11= + ]) AC_LANG_POP([C++]) CXXFLAGS=$save_CXXFLAGS fi - if test "$HAVE_CXX11" = "TRUE"; then - AC_MSG_RESULT([yes ($CXXFLAGS_CXX11)]) - else - AC_MSG_RESULT([no]) + + if test "$HAVE_CXX11" != "TRUE" -a -n "$CXXFLAGS_CXX11"; then + AC_MSG_NOTICE([Disabling C++11 support]) + CXXFLAGS_CXX11= fi fi @@ -5633,8 +5668,8 @@ dnl ================================== dnl Check for C++11 "= delete" support dnl ================================== -AC_MSG_CHECKING([whether $CXX supports C++11 = delete syntax]) if test "$HAVE_CXX11" = "TRUE"; then + AC_MSG_CHECKING([whether $CXX supports C++11 = delete syntax]) save_CXXFLAGS=$CXXFLAGS CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" AC_LANG_PUSH([C++]) @@ -5653,16 +5688,14 @@ struct A else AC_MSG_RESULT([no]) fi -else - AC_MSG_RESULT([no]) fi dnl ================================== dnl Check for C++11 "override" support dnl ================================== -AC_MSG_CHECKING([whether $CXX supports C++11 "override" syntax]) if test "$HAVE_CXX11" = "TRUE"; then + AC_MSG_CHECKING([whether $CXX supports C++11 "override" syntax]) save_CXXFLAGS=$CXXFLAGS CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" AC_LANG_PUSH([C++]) @@ -5686,16 +5719,14 @@ struct B : A else AC_MSG_RESULT([no]) fi -else - AC_MSG_RESULT([no]) fi dnl ================================== dnl Check for C++11 "final" support dnl ================================== -AC_MSG_CHECKING([whether $CXX supports C++11 "final" syntax]) if test "$HAVE_CXX11" = "TRUE"; then + AC_MSG_CHECKING([whether $CXX supports C++11 "final" syntax]) save_CXXFLAGS=$CXXFLAGS CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" AC_LANG_PUSH([C++]) @@ -5755,30 +5786,30 @@ struct D : C else AC_MSG_RESULT([no]) fi -else - AC_MSG_RESULT([no]) fi dnl =================================================================== dnl Check for C++11 perfect forwarding support dnl =================================================================== -AC_MSG_CHECKING([whether $CXX supports C++11 perfect forwarding]) -save_CXXFLAGS=$CXXFLAGS -CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" -AC_LANG_PUSH([C++]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +if test "$HAVE_CXX11" = "TRUE"; then + AC_MSG_CHECKING([whether $CXX supports C++11 perfect forwarding]) + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <utility> template<typename T, typename... Args> T * f(Args &&... v) { return new T(std::forward<Args>(v)...); } - ]], [[ + ]], [[ f<int>(0); - ]])], [perfect_forwarding=yes], [perfect_forwarding=no]) -AC_LANG_POP([C++]) -CXXFLAGS=$save_CXXFLAGS -AC_MSG_RESULT([$perfect_forwarding]) -if test "$perfect_forwarding" = yes; then - AC_DEFINE([HAVE_CXX11_PERFECT_FORWARDING]) + ]])], [perfect_forwarding=yes], [perfect_forwarding=no]) + AC_LANG_POP([C++]) + CXXFLAGS=$save_CXXFLAGS + AC_MSG_RESULT([$perfect_forwarding]) + if test "$perfect_forwarding" = yes; then + AC_DEFINE([HAVE_CXX11_PERFECT_FORWARDING]) + fi fi dnl =================================================================== |