]> git.lyx.org Git - lyx.git/blobdiff - config/lyxinclude.m4
Do not add -std=c++11 to CPPFLAGS (because objc does not like it)
[lyx.git] / config / lyxinclude.m4
index b8ecda77562786445abfd395bdae8cdf70270254..8decd37ed93490776551f548047c5897af383530 100644 (file)
@@ -91,7 +91,7 @@ AC_MSG_ERROR([cannot find $1. Please check that the $2 library
 
 
 dnl Usage: LYX_CHECK_WARNINGS  Displays a warning message if a LYX_WARNING
-dnl   has occured previously.
+dnl   has occurred previously.
 AC_DEFUN([LYX_CHECK_WARNINGS],[
 if test x$lyx_warning = xyes; then
 cat <<EOF
@@ -133,7 +133,7 @@ done
 ])dnl
 
 
-dnl Usage: LYX_PROG_CLANG: set lyx_cv_prog_clang to yes if the compiler is clang.
+dnl Usage: LYX_PROG_CLANG: set CLANG to yes if the compiler is clang.
 AC_DEFUN([LYX_PROG_CLANG],
 [AC_CACHE_CHECK([whether the compiler is clang],
                [lyx_cv_prog_clang],
@@ -146,6 +146,70 @@ AC_DEFUN([LYX_PROG_CLANG],
 ])
 
 
+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_USE_REGEX(cxx11_flags)
+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.
+AC_DEFUN([LYX_CXX_USE_REGEX],
+[lyx_std_regex=no
+ if test $lyx_use_cxx11 = yes; then
+   save_CPPFLAGS=$CPPFLAGS
+   # we want to pass -std=c++11 to clang/cpp if necessary
+   CPPFLAGS="$AM_CPPFLAGS $1 $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++)
+   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 <regex> 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.0*|4.1*|4.2*|4.3*|4.4*|4.5*|4.6*|4.7*|4.8*) lyx_std_regex=no ;;
+         *) ;;
+       esac
+     fi
+   fi
+   AC_MSG_RESULT([$lyx_std_regex])
+ fi
+
+ if test $lyx_std_regex = yes ; then
+  lyx_flags="$lyx_flags std-regex"
+  AC_DEFINE([LYX_USE_STD_REGEX], 1, [define to 1 if std::regex should be preferred to boost::regex])
+ fi
+ AM_CONDITIONAL([LYX_USE_STD_REGEX], test $lyx_std_regex = 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++],
@@ -159,16 +223,36 @@ AC_DEFUN([LYX_LIB_STDCXX],
 ])
 
 
+dnl Usage: LYX_LIB_STDCXX_CXX11_ABI: set lyx_cv_lib_stdcxx_cxx11_abi to yes
+dnl        if the STL library is GNU libstdc++ and the C++11 ABI is used.
+AC_DEFUN([LYX_LIB_STDCXX_CXX11_ABI],
+[AC_CACHE_CHECK([whether STL is libstdc++ using the C++11 ABI],
+               [lyx_cv_lib_stdcxx_cxx11_abi],
+[AC_TRY_COMPILE([#include<vector>], [
+#if ! defined(_GLIBCXX_USE_CXX11_ABI) || ! _GLIBCXX_USE_CXX11_ABI
+           this is not libstdc++ using the C++11 ABI
+#endif
+],
+[lyx_cv_lib_stdcxx_cxx11_abi=yes], [lyx_cv_lib_stdcxx_cxx11_abi=no])])
+])
+
+
 AC_DEFUN([LYX_PROG_CXX],
 [AC_REQUIRE([AC_PROG_CXX])
 AC_REQUIRE([AC_PROG_CXXCPP])
+
 AC_LANG_PUSH(C++)
 LYX_PROG_CLANG
 LYX_LIB_STDCXX
+LYX_LIB_STDCXX_CXX11_ABI
 AC_LANG_POP(C++)
 
 if test $lyx_cv_lib_stdcxx = "yes" ; then
-  AC_DEFINE(STD_STRING_USES_COW, 1, [std::string uses copy-on-write])
+  if test $lyx_cv_lib_stdcxx_cxx11_abi = "yes" ; then
+    AC_DEFINE(USE_GLIBCXX_CXX11_ABI, 1, [use GNU libstdc++ with C++11 ABI])
+  else
+    AC_DEFINE(STD_STRING_USES_COW, 1, [std::string uses copy-on-write])
+  fi
 else
   if test $lyx_cv_prog_clang = "yes" ; then
     AC_DEFINE(USE_LLVM_LIBCPP, 1, [use libc++ provided by llvm instead of GNU libstdc++])
@@ -199,15 +283,6 @@ AC_ARG_ENABLE(stdlib-debug,
          [enable_stdlib_debug=no])]
 )
 
-AC_ARG_ENABLE(concept-checks,
-  AC_HELP_STRING([--enable-concept-checks],[enable concept checks]),,
-  [AS_CASE([$build_type], [dev*|pre*], [enable_concept_checks=yes], 
-         [enable_concept_checks=no])]
-  if test x$USE_QT5 = xyes ; then
-      enable_concept_checks=no
-  fi
-)
-
 ### set up optimization
 AC_ARG_ENABLE(optimization,
     AC_HELP_STRING([--enable-optimization[=value]],[enable compiler optimisation]),,
@@ -223,14 +298,9 @@ case $enable_optimization in
     *) lyx_optim=${enable_optimization};;
 esac
 
-AC_ARG_ENABLE(pch,
-  AC_HELP_STRING([--enable-pch],[enable precompiled headers]),,
-       enable_pch=no;)
-lyx_pch_comp=no
-
 AC_ARG_ENABLE(cxx11,
-  AC_HELP_STRING([--enable-cxx11],[enable C++11 mode]),,
-  enable_cxx11=no;)
+  AC_HELP_STRING([--disable-cxx11],[disable C++11 mode (default: enabled for known good compilers)]),,
+  enable_cxx11=auto;)
 
 AC_ARG_ENABLE(assertions,
   AC_HELP_STRING([--enable-assertions],[add runtime sanity checks in the program]),,
@@ -244,7 +314,6 @@ if test "x$enable_assertions" = xyes ; then
 fi
 
 # set the compiler options correctly.
-lyx_std_regex=no
 if test x$GXX = xyes; then
   dnl clang++ pretends to be g++ 4.2.1; this is not useful
   if test x$CLANG = xno; then
@@ -260,8 +329,8 @@ if test x$GXX = xyes; then
       AM_CXXFLAGS="-g $AM_CXXFLAGS"
   fi
   if test $build_type = gprof ; then
-    AM_CXXFLAGS="-pg $AM_CXXFLAGS"
-    AM_LDFLAGS="-pg $AM_LDFLAGS"
+    AM_CXXFLAGS="$AM_CXXFLAGS -pg"
+    AM_LDFLAGS="$AM_LDFLAGS -pg"
   fi
   if test $build_type = profiling ; then
     AM_CXXFLAGS="$AM_CXXFLAGS -fno-omit-frame-pointer"
@@ -272,31 +341,15 @@ if test x$GXX = xyes; then
   fi
   dnl Warnings are for preprocessor too
   if test x$enable_warnings = xyes ; then
-      case $gxx_version in
-          3.1*|3.2*|3.3*)
-              AM_CPPFLAGS="-W -Wall $AM_CPPFLAGS"
-              ;;
-          3.4*|4.0*|4.1*|4.2*|4.3*|4.4*|4.5*|4.6*|4.7*|4.8*|clang)
-              AM_CPPFLAGS="-Wextra -Wall $AM_CPPFLAGS"
-              ;;
-          *)
-              AM_CPPFLAGS="-Wextra -Wall -Wfloat-conversion $AM_CPPFLAGS"
-              ;;
-      esac
+      AM_CPPFLAGS="$AM_CPPFLAGS -Wall -Wextra"
   fi
   case $gxx_version in
-      3.1*)    AM_CXXFLAGS="-finline-limit=500 ";;
-      3.2*|3.3*)    AM_CXXFLAGS="";;
-      3.4*|4.*)
-          AM_CXXFLAGS=""
-          test $enable_pch = yes && lyx_pch_comp=yes
-          ;;
+      2.*|3.*) AC_ERROR([gcc 4.x is required]);;
   esac
   if test x$enable_stdlib_debug = xyes ; then
     dnl FIXME: for clang/libc++, one should define _LIBCPP_DEBUG2=0
     dnl See http://clang-developers.42468.n3.nabble.com/libc-debug-mode-td3336742.html
     case $gxx_version in
-      3.1*|3.2*|3.3*) ;;
       *)
         lyx_flags="$lyx_flags stdlib-debug"
        AC_DEFINE(_GLIBCXX_DEBUG, 1, [libstdc++ debug mode])
@@ -304,58 +357,43 @@ if test x$GXX = xyes; then
         ;;
     esac
   fi
-  if test x$enable_concept_checks = xyes ; then
+  dnl enable_cxx11 can be yes/no/auto.
+  dnl By default, it is auto and we enable C++11 when possible
+  if test x$enable_cxx11 != xno ; then
     case $gxx_version in
-      3.3*)
-        lyx_flags="$lyx_flags concept-checks"
-       dnl FIXME check whether this makes sense with clang/libc++
-        AC_DEFINE(_GLIBCPP_CONCEPT_CHECKS, 1, [libstdc++ concept checking])
-       ;;
-      3.4*|4.*)
-        lyx_flags="$lyx_flags concept-checks"
-       AC_DEFINE(_GLIBCXX_CONCEPT_CHECKS, 1, [libstdc++ concept checking])
-       ;;
-    esac
-  fi
-  if test x$enable_cxx11 = xyes ; then
-    case $gxx_version in
-      3.*|4.0*|4.1*|4.2*) AC_ERROR([There is no C++11 support in gcc 3.x]);;
+      4.0*|4.1*|4.2*)
+         if test x$enable_cxx11 = xyes; then
+            AC_ERROR([There is no C++11 support in gcc 4.2 or older])
+         fi;;
       4.3*|4.4*|4.5*|4.6*)
-        lyx_flags="$lyx_flags c++11-mode"
-       AM_CXXFLAGS="-std=gnu++0x $AM_CXXFLAGS";;
+        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 version support c++11.
-        lyx_flags="$lyx_flags c++11-mode"
+        dnl presumably all clang versions support c++11.
        dnl the deprecated-register warning is very annoying with Qt4.x right now.
-        AM_CXXFLAGS="-std=c++11 -Wno-deprecated-register $AM_CXXFLAGS";;
+        cxx11_flags="-std=c++11"
+        AM_CXXFLAGS="$AM_CXXFLAGS -Wno-deprecated-register";;
       *)
-       lyx_flags="$lyx_flags c++11-mode"
-       AM_CXXFLAGS="-std=gnu++11 $AM_CXXFLAGS"
-       ;;
+        AS_CASE([$host], [*cygwin*],
+                [cxx11_flags="-std=gnu++11"],
+                [cxx11_flags="-std=c++11"]);;
     esac
-    if test x$CLANG = xno || test $lyx_cv_lib_stdcxx = yes; then
-      dnl <regex> 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
-        3.*|4.0*|4.1*|4.2*|4.3*|4.4*|4.5*|4.6*|4.7*|4.8*) ;;
-       *) lyx_flags="$lyx_flags stdregex"
-          lyx_std_regex=yes
-           ;;
-      esac
-    else
-      lyx_flags="$lyx_flags stdregex"
-      lyx_std_regex=yes
-    fi
+    # cxx11_flags is useful when running preprocessor alone 
+    # (see detection of regex).
+    AM_CXXFLAGS="$cxx11_flags $AM_CXXFLAGS"
+  fi
+fi
 
-    if test $lyx_std_regex = yes ; then
-      AC_DEFINE([LYX_USE_STD_REGEX], 1, [define to 1 if std::regex should be preferred to boost::regex])
-    fi
+LYX_CXX_CXX11
+if test $lyx_use_cxx11 = yes; then
+  if test x$GXX = xyes; then
+    dnl We still use auto_ptr, which is obsoleted. Shut off the warnings.
+    AM_CXXFLAGS="$AM_CXXFLAGS -Wno-deprecated-declarations"
   fi
 fi
-AM_CONDITIONAL([LYX_USE_STD_REGEX], test $lyx_std_regex = yes)
-test "$lyx_pch_comp" = yes && lyx_flags="$lyx_flags pch"
-AM_CONDITIONAL(LYX_BUILD_PCH, test "$lyx_pch_comp" = yes)
-])dnl
+LYX_CXX_USE_REGEX([$cxx11_flags])
+])
 
 dnl Usage: LYX_USE_INCLUDED_BOOST : select if the included boost should
 dnl        be used.
@@ -368,14 +406,14 @@ AC_DEFUN([LYX_USE_INCLUDED_BOOST],[
        AM_CONDITIONAL(USE_INCLUDED_BOOST, test x$lyx_cv_with_included_boost = xyes)
        AC_MSG_RESULT([$lyx_cv_with_included_boost])
        if test x$lyx_cv_with_included_boost = xyes ; then
-           BOOST_INCLUDES='-I$(top_srcdir)/boost'
-           BOOST_LIBS='$(top_builddir)/boost/liblyxboost.a'
+           BOOST_INCLUDES='-I$(top_srcdir)/3rdparty/boost'
+           BOOST_LIBS='$(top_builddir)/3rdparty/boost/liblyxboost.a'
        else
            AC_LANG_PUSH(C++)
            save_LIBS=$LIBS
 
            AC_MSG_CHECKING([for multithreaded boost libraries])
-           LIBS="$save_LIBS -lboost_signals-mt -lm $LIBTHREAD"
+           LIBS="$save_LIBS -lboost_signals-mt $LIBTHREAD"
            AC_LINK_IFELSE(
                [AC_LANG_PROGRAM([#include <boost/signal.hpp>],
                        [boost::signal<void ()> s;])],
@@ -383,7 +421,7 @@ AC_DEFUN([LYX_USE_INCLUDED_BOOST],[
                 BOOST_MT="-mt"],
                [AC_MSG_RESULT([no])
                 AC_MSG_CHECKING([for plain boost libraries])
-                LIBS="$save_LIBS -lboost_signals -lm"
+                LIBS="$save_LIBS -lboost_signals"
                 AC_LINK_IFELSE(
                     [AC_LANG_PROGRAM([#include <boost/signal.hpp>],
                             [boost::signal<void ()> s;])],
@@ -401,6 +439,15 @@ AC_DEFUN([LYX_USE_INCLUDED_BOOST],[
            else
              BOOST_LIBS="-lboost_regex${BOOST_MT} -lboost_signals${BOOST_MT}"
            fi
+
+           dnl In general, system boost libraries are incompatible with
+           dnl the use of stdlib-debug in libstdc++. See ticket #9736 for
+           dnl details.
+           if test $enable_stdlib_debug = "yes" ; then
+               LYX_WARNING([Compiling LyX with stdlib-debug and system boost libraries may lead to
+   crashes. Consider using --disable-stdlib-debug or removing
+   --without-included-boost.])
+           fi
        fi
        AC_SUBST(BOOST_INCLUDES)
        AC_SUBST(BOOST_LIBS)
@@ -446,9 +493,9 @@ AC_DEFUN([LYX_USE_INCLUDED_MYTHES],[
                if test x$ac_cv_header_mythes_h != xyes; then
                        AC_CHECK_HEADER(mythes/mythes.hxx,[ac_cv_header_mythes_h=yes lyx_cv_mythes_h_location="<mythes/mythes.hxx>"])
                fi
-               AC_CHECK_LIB(mythes, main, [MYTHES_LIBS="-lmythes" lyx_mythes=yes], [lyx_mythes=no], [-lm])
+               AC_CHECK_LIB(mythes, main, [MYTHES_LIBS="-lmythes" lyx_mythes=yes], [lyx_mythes=no])
                if test x$lyx_mythes != xyes; then
-                       AC_CHECK_LIB(mythes-1.2, main, [MYTHES_LIBS="-lmythes-1.2" lyx_mythes=yes], [lyx_mythes=no], [-lm])
+                       AC_CHECK_LIB(mythes-1.2, main, [MYTHES_LIBS="-lmythes-1.2" lyx_mythes=yes], [lyx_mythes=no])
                fi
                AC_LANG_POP(C++)
                if test x$lyx_mythes != xyes -o x$ac_cv_header_mythes_h != xyes; then
@@ -549,12 +596,13 @@ AC_DEFUN([LYX_USE_PACKAGING],
 [AC_MSG_CHECKING([what packaging should be used])
 AC_ARG_WITH(packaging,
   [AC_HELP_STRING([--with-packaging=THIS], [use THIS packaging for installation:
-                           Possible values: posix, windows, macosx])],
+                           Possible values: posix, windows, macosx, haiku])],
   [lyx_use_packaging="$withval"], [
   case $host in
     *-apple-darwin*) lyx_use_packaging=macosx ;;
-     *-pc-mingw32*) lyx_use_packaging=windows;;
-                  *) lyx_use_packaging=posix;;
+    *-pc-mingw32*) lyx_use_packaging=windows ;;
+    *haiku*) lyx_use_packaging=haiku ;;
+    *) lyx_use_packaging=posix ;;
   esac])
 AC_MSG_RESULT($lyx_use_packaging)
 lyx_install_posix=false
@@ -587,10 +635,16 @@ case $lyx_use_packaging in
           pkgdatadir='${datadir}/${PACKAGE}'
           default_prefix=$ac_default_prefix
           case ${host} in
-          *cygwin*) lyx_install_cygwin=true ;;
-               *apple-darwin*) lyx_install_macosx=true ;;
+            *cygwin*) lyx_install_cygwin=true ;;
+            *apple-darwin*) lyx_install_macosx=true ;;
           esac
           lyx_install_posix=true ;;
+       haiku) AC_DEFINE(USE_HAIKU_PACKAGING, 1, [Define to 1 if LyX should use a Haiku-style file layout])
+          PACKAGE=lyx${version_suffix}
+          program_suffix=$version_suffix
+          pkgdatadir='${datadir}/${PACKAGE}'
+          default_prefix=$ac_default_prefix
+          lyx_install_posix=true ;;
     *) AC_MSG_ERROR([unknown packaging type $lyx_use_packaging.]) ;;
 esac
 AM_CONDITIONAL(INSTALL_MACOSX, $lyx_install_macosx)