X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=config%2Flyxinclude.m4;h=7bddfb09da05500ff6672dc5e548985c187a4740;hb=e8b1ec66fc0cf2f6c190d2e3c294630ebc2e12d0;hp=c1b6524ac69481c4d4ee49fe268ad7098ed94704;hpb=cf1e08f7f704cfbb31998ce024e3bc332fe6f432;p=lyx.git diff --git a/config/lyxinclude.m4 b/config/lyxinclude.m4 index c1b6524ac6..7bddfb09da 100644 --- a/config/lyxinclude.m4 +++ b/config/lyxinclude.m4 @@ -143,64 +143,101 @@ AC_DEFUN([LYX_PROG_CLANG], #endif ], [lyx_cv_prog_clang=yes ; CLANG=yes], [lyx_cv_prog_clang=no ; CLANG=no])]) +if test $CLANG = yes ; then + AC_CACHE_CHECK([for clang version], + [lyx_cv_clang_version], + [clang_noversion=no + AC_COMPUTE_INT(clang_major,__clang_major__,,[clang_noversion_=yes]) + AC_COMPUTE_INT(clang_minor,__clang_minor__,,[clang_noversion_=yes]) + AC_COMPUTE_INT(clang_patchlevel,__clang_patchlevel__,,[clang_noversion_=yes]) + if test $clang_noversion = yes ; then + clang_version=unknown + else + clang_version=$clang_major.$clang_minor.$clang_patchlevel + fi + lyx_cv_clang_version=$clang_version]) +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" + 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;], [], + [lyx_cv_cxx11_flags=$flag; break]) + 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 + AM_CXXFLAGS="$lyx_cv_cxx11_flags $AM_CXXFLAGS" ]) -dnl Usage: LYX_CXX_USE_REGEX(cxx11_flags) +dnl Usage: LYX_CXX_USE_REGEX dnl decide whether we want to use std::regex and set the -dnl LYX_USE_STD_REGEX accordingly. -dnl the extra cxx11 flags have to be passed to the preprocessor. They are -dnl not plainly added to AM_CPPFLAGS because then the objc compiler (mac) -dnl would fail. +dnl LYX_USE_STD_REGEX macro and conditional accordingly. AC_DEFUN([LYX_CXX_USE_REGEX], [AC_ARG_ENABLE(std-regex, AC_HELP_STRING([--enable-std-regex],[use std::regex instead of boost::regex (default is autodetected)]), [lyx_std_regex=$enableval], - [save_CPPFLAGS=$CPPFLAGS - # we want to pass -std=c++11 to clang/cpp if necessary - CPPFLAGS="$AM_CPPFLAGS $1 $CPPFLAGS" + [AC_MSG_CHECKING([for correct regex implementation]) + save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS" save_CXXFLAGS=$CXXFLAGS CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS" - AC_LANG_PUSH(C++) - AC_CHECK_HEADER([regex], [lyx_std_regex=yes], [lyx_std_regex=no]) - AC_LANG_POP(C++) + # The following code snippet has been taken taken from example in + # http://stackoverflow.com/questions/8561850/compile-stdregex-iterator-with-gcc + AC_TRY_LINK( + [ + #include + #include + + #include + + typedef std::regex_iterator Myiter; + ], [ + const char *pat = "axayaz"; + Myiter::regex_type rx("a"); + Myiter next(pat, pat + strlen(pat), rx); + Myiter end; + ], [lyx_std_regex=yes], [lyx_std_regex=no]) CXXFLAGS=$save_CXXFLAGS CPPFLAGS=$save_CPPFLAGS - if test x$GXX = xyes && test $lyx_std_regex = yes ; then - AC_MSG_CHECKING([for correct regex implementation]) - if test x$CLANG = xno || test $lyx_cv_lib_stdcxx = yes; then - dnl in gcc is unusable in versions less than 4.9.0 - dnl see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631 - case $gxx_version in - 4.3*|4.4*|4.5*|4.6*|4.7*|4.8*) lyx_std_regex=no ;; - *) ;; - esac - fi - AC_MSG_RESULT([$lyx_std_regex]) - fi]) + AC_MSG_RESULT([$lyx_std_regex]) + ]) if test $lyx_std_regex = yes ; then lyx_flags="$lyx_flags std-regex" @@ -210,6 +247,33 @@ AC_DEFUN([LYX_CXX_USE_REGEX], ]) +dnl Usage: LYX_CXX_USE_CALL_ONCE +dnl check whether we can use std::call_once and set the +dnl LYX_USE_STD_CALL_ONCE macro and conditional accordingly. +AC_DEFUN([LYX_CXX_USE_CALL_ONCE], +[AC_MSG_CHECKING([for std::call_once availability]) + save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS" + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS" + AC_TRY_LINK( + [ + #include + static std::once_flag flag; + ], [ + std::call_once(flag, [](){ return; }); + ], [lyx_std_call_once=yes], [lyx_std_call_once=no]) + CXXFLAGS=$save_CXXFLAGS + CPPFLAGS=$save_CPPFLAGS + AC_MSG_RESULT([$lyx_std_call_once]) + + if test $lyx_std_call_once = yes ; then + AC_DEFINE([LYX_USE_STD_CALL_ONCE], 1, [define to 1 if std::call_once is supported by the compiler]) + fi + AM_CONDITIONAL([LYX_USE_STD_CALL_ONCE], test $lyx_std_call_once = yes) +]) + + dnl Usage: LYX_LIB_STDCXX: set lyx_cv_lib_stdcxx to yes if the STL library is libstdc++. AC_DEFUN([LYX_LIB_STDCXX], [AC_CACHE_CHECK([whether STL is libstdc++], @@ -243,8 +307,11 @@ AC_REQUIRE([AC_PROG_CXXCPP]) AC_LANG_PUSH(C++) LYX_PROG_CLANG +LYX_CXX_CXX11_FLAGS LYX_LIB_STDCXX LYX_LIB_STDCXX_CXX11_ABI +LYX_CXX_USE_REGEX +LYX_CXX_USE_CALL_ONCE AC_LANG_POP(C++) if test $lyx_cv_lib_stdcxx = "yes" ; then @@ -317,10 +384,11 @@ if test x$GXX = xyes; then gxx_version=`${CXX} -dumpversion` CXX_VERSION="($gxx_version)" else - gxx_version=clang + gxx_version=clang-$clang_version + CXX_VERSION="($clang_version)" fi - AM_CXXFLAGS="$lyx_optim" + AM_CXXFLAGS="$lyx_optim $AM_CXXFLAGS" if test x$enable_debug = xyes ; then AM_CXXFLAGS="-g $AM_CXXFLAGS" fi @@ -340,8 +408,8 @@ if test x$GXX = xyes; then AM_CPPFLAGS="$AM_CPPFLAGS -Wall -Wextra" fi case $gxx_version in - 2.*|3.*) AC_ERROR([gcc >= 4.3 is required]);; - 4.0*|4.1*|4.2*) AC_ERROR([gcc >= 4.3 is required]);; + 2.*|3.*) AC_ERROR([gcc >= 4.6 is required]);; + 4.0*|4.1*|4.2*|4.3*|4.4*|4.5*) AC_ERROR([gcc >= 4.6 is required]);; esac if test x$enable_stdlib_debug = xyes ; then dnl FIXME: for clang/libc++, one should define _LIBCPP_DEBUG2=0 @@ -354,31 +422,20 @@ if test x$GXX = xyes; then ;; esac fi +fi + +# Some additional flags may be needed +if test x$GXX = xyes; then case $gxx_version in - 4.3*|4.4*|4.5*|4.6*) - dnl Note that this will define __GXX_EXPERIMENTAL_CXX0X__. - dnl The source code relies on that. - cxx11_flags="-std=c++0x";; - clang) - dnl presumably all clang versions support c++11. - dnl the deprecated-register warning is very annoying with Qt4.x right now. - cxx11_flags="-std=c++11" + clang-3.0*|clang-3.1*|clang-3.2*|clang-3.3*) + 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. AM_CXXFLAGS="$AM_CXXFLAGS -Wno-deprecated-register";; - *) - AS_CASE([$host], [*cygwin*], - [cxx11_flags="-std=gnu++11"], - [cxx11_flags="-std=c++11"]);; 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]) ]) dnl Usage: LYX_USE_INCLUDED_BOOST : select if the included boost should @@ -393,7 +450,11 @@ AC_DEFUN([LYX_USE_INCLUDED_BOOST],[ AC_MSG_RESULT([$lyx_cv_with_included_boost]) if test x$lyx_cv_with_included_boost = xyes ; then BOOST_INCLUDES='-I$(top_srcdir)/3rdparty/boost' - BOOST_LIBS='$(top_builddir)/3rdparty/boost/liblyxboost.a' + if test $lyx_std_regex = yes ; then + BOOST_LIBS="" + else + BOOST_LIBS='$(top_builddir)/3rdparty/boost/liblyxboost.a' + fi else BOOST_INCLUDES= if test $lyx_std_regex = yes ; then @@ -818,9 +879,17 @@ dnl Defines HAVE_DEF_{NAME} AC_DEFUN([LYX_CHECK_DEF], [LYX_AH_CHECK_DEF($1, $2) AC_MSG_CHECKING([whether $1 is defined by header $2]) + save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS" + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS" + AC_LANG_PUSH(C++) AC_TRY_COMPILE([#include <$2>], [$3], lyx_have_def_name=yes, lyx_have_def_name=no) + AC_LANG_POP(C++) + CXXFLAGS=$save_CXXFLAGS + CPPFLAGS=$save_CPPFLAGS AC_MSG_RESULT($lyx_have_def_name) if test "x$lyx_have_def_name" = xyes; then AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_DEF_$1))