From 23dbcb59d2e861921677b3ce99d95c77c1ceec02 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Wed, 6 Jul 2016 14:03:22 +0200 Subject: [PATCH] New test to determine correct -std option for CXX compiler The test file is stolen from cmake. The options tested are, from the most desirable to the least desirable: -std=c++14 -std=c++11 "" -std=c++0x -std=gnu++14 -std=gnu++11 -std=gnu++0x It is expected that the result will not be correct for cygwin, but this is fixable. --- config/lyxinclude.m4 | 96 ++++++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/config/lyxinclude.m4 b/config/lyxinclude.m4 index 59a375321b..1e48fd687d 100644 --- a/config/lyxinclude.m4 +++ b/config/lyxinclude.m4 @@ -160,26 +160,53 @@ fi ]) -dnl Usage: LYX_CXX_CXX11: set lyx_use_cxx11 to yes if the compiler implements -dnl the C++11 standard. -AC_DEFUN([LYX_CXX_CXX11], -[AC_CACHE_CHECK([whether the compiler implements C++11], - [lyx_cv_cxx_cxx11], - [save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS" - save_CXXFLAGS=$CXXFLAGS - CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS" - AC_LANG_PUSH(C++) - AC_TRY_COMPILE([], [ -#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) - this is a c++11 compiler -#endif - ], - [lyx_cv_cxx_cxx11=no], [lyx_cv_cxx_cxx11=yes ; lyx_flags="$lyx_flags c++11"]) - AC_LANG_POP(C++) - CXXFLAGS=$save_CXXFLAGS - CPPFLAGS=$save_CPPFLAGS]) - lyx_use_cxx11=$lyx_cv_cxx_cxx11 +dnl Usage: LYX_CXX_CXX11_FLAGS: add to AM_CXXFLAGS the best flag that +selects C++11 mode; gives an error when C++11 mode is not found. +AC_DEFUN([LYX_CXX_CXX11_FLAGS], +[AC_CACHE_CHECK([for at least C++11 mode], [lyx_cv_cxx11_flags], + [lyx_cv_cxx11_flags=none + for flag in -std=c++14 -std=c++11 "" -std=c++0x -std=gnu++14 -std=gnu++11 -std=gnu++0x ; do + save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS" + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$flag $AM_CXXFLAGS $CXXFLAGS" + AC_LANG_PUSH(C++) + dnl sample openmp source code to test + AC_TRY_COMPILE([ + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + typedef check> right_angle_brackets; + + class TestDeleted + { + public: + TestDeleted() = delete; + }; + + + int a; + decltype(a) b; + + typedef check check_type; + check_type c; + check_type&& cr = static_cast(c); + + auto d = a;], + [return 0;], + [lyx_cv_cxx11_flags=$flag; break]) + AC_LANG_POP(C++) + CXXFLAGS=$save_CXXFLAGS + CPPFLAGS=$save_CPPFLAGS + done]) + if test $lyx_cv_cxx11_flags = none ; then + AC_ERROR([Cannot find suitable C++11 mode for compiler $CXX]) + fi + lyx_cxx11_flags=$lyx_cv_cxx11_flags + AM_CXXFLAGS="$lyx_cxx11_flags $AM_CXXFLAGS" ]) @@ -369,35 +396,24 @@ if test x$GXX = xyes; then ;; esac fi +fi + +LYX_CXX_CXX11_FLAGS + +# Some additional flags may be needed +if test x$GXX = xyes; then case $gxx_version in - 4.6*) - dnl Note that this will define __GXX_EXPERIMENTAL_CXX0X__. - dnl The source code relies on that. - cxx11_flags="-std=gnu++0x";; - 4.7*|4.8*|4.9*|5.*) - cxx11_flags="-std=gnu++11";; clang-3.0*|clang-3.1*|clang-3.2*|clang-3.3*) - dnl presumably all clang versions support c++11. - dnl boost contains pragmas that are annoying on older clang versions - cxx11_flags="-std=c++11 -Wno-unknown-pragmas";; + dnl boost contains pragmas that are annoying on older clang versions + AM_CPPFLAGS="-Wno-unknown-pragmas $AM_CPPFLAGS";; clang*) dnl the more recent versions support the deprecated-register warning, dnl which is very annoying with Qt4.x right now. - cxx11_flags="-std=c++11" AM_CXXFLAGS="$AM_CXXFLAGS -Wno-deprecated-register";; - *) # gcc 6 and newer use C++14 as default - ;; esac - # cxx11_flags is useful when running preprocessor alone - # (see detection of regex). - AM_CXXFLAGS="$cxx11_flags $AM_CXXFLAGS" fi -LYX_CXX_CXX11 -if test $lyx_use_cxx11 = no; then - AC_ERROR([A C++11 compatible compiler is required]) -fi -LYX_CXX_USE_REGEX([$cxx11_flags]) +LYX_CXX_USE_REGEX([$lyx_cxx11_flags]) ]) dnl Usage: LYX_USE_INCLUDED_BOOST : select if the included boost should -- 2.39.2