]> 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 815abab3e3d2a7acf2b2234415785d8ec2f315a0..8decd37ed93490776551f548047c5897af383530 100644 (file)
@@ -62,6 +62,18 @@ AC_MSG_RESULT([$withval])
 ])
 
 
+dnl Check whether to configure for Qt5. Default is Qt4.
+dnl
+AC_DEFUN([LYX_CHECK_QT5],[
+AC_MSG_CHECKING([whether Qt5 is requested])
+AC_ARG_ENABLE([qt5],
+  [  --enable-qt5            use Qt5 for building],
+  USE_QT5=$enableval, USE_QT5=no)
+AC_MSG_RESULT([$USE_QT5])
+AC_SUBST([USE_QT5])
+])
+
+
 dnl Usage: LYX_WARNING(message)  Displays the warning "message" and sets the
 dnl flag lyx_warning to yes.
 AC_DEFUN([LYX_WARNING],[
@@ -79,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
@@ -121,27 +133,7 @@ done
 ])dnl
 
 
-AC_DEFUN([LYX_PROG_CXX_WORKS],
-[rm -f conftest.C
-cat >conftest.C <<EOF
-class foo {
-   // we require the mutable keyword
-   mutable int bar;
- };
- // we require namespace support
- namespace baz {
-   int bar;
- }
- int main() {
-   return(0);
- }
-EOF
-$CXX -c $CXXFLAGS $CPPFLAGS conftest.C >&5 || CXX=
-rm -f conftest.C conftest.o conftest.obj || true
-])
-
-
-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],
@@ -154,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++],
@@ -167,24 +223,40 @@ AC_DEFUN([LYX_LIB_STDCXX],
 ])
 
 
-AC_DEFUN([LYX_PROG_CXX],
-[AC_MSG_CHECKING([for a good enough C++ compiler])
-LYX_SEARCH_PROG(CXX, $CXX $CCC g++ gcc c++ CC cxx xlC cc++, [LYX_PROG_CXX_WORKS])
+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])])
+])
 
-if test -z "$CXX" ; then
-  AC_MSG_ERROR([Unable to find a good enough C++ compiler])
-fi
-AC_MSG_RESULT($CXX)
 
-AC_REQUIRE([AC_PROG_CXX])
+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++])
+  fi
 fi
 
 ### We might want to get or shut warnings.
@@ -211,12 +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])]
-)
-
 ### set up optimization
 AC_ARG_ENABLE(optimization,
     AC_HELP_STRING([--enable-optimization[=value]],[enable compiler optimisation]),,
@@ -224,22 +290,17 @@ AC_ARG_ENABLE(optimization,
 case $enable_optimization in
     yes)
         if test $lyx_devel_version = yes ; then
-            lyx_opt=-O
+            lyx_optim=-O
         else
-            lyx_opt=-O2
+            lyx_optim=-O2
         fi;;
-    no) lyx_opt=;;
-    *) lyx_opt=${enable_optimization};;
+    no) lyx_optim=;;
+    *) 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]),,
@@ -259,89 +320,80 @@ if test x$GXX = xyes; then
     dnl Useful for global version info
     gxx_version=`${CXX} -dumpversion`
     CXX_VERSION="($gxx_version)"
+  else
+    gxx_version=clang
   fi
 
-  if test "$ac_test_CXXFLAGS" = set; then
-    CXXFLAGS="$ac_save_CXXFLAGS"
-  else
-    CFLAGS="$lyx_opt"
-    CXXFLAGS="$lyx_opt"
-    if test x$enable_debug = xyes ; then
-      CFLAGS="-g $CFLAGS"
-      CXXFLAGS="-g $CXXFLAGS"
-    fi
-    if test $build_type = gprof ; then
-      CFLAGS="-pg $CFLAGS"
-      CXXFLAGS="-pg $CXXFLAGS"
-      LDFLAGS="-pg $LDFLAGS"
-    fi
-    if test $build_type = profiling ; then
-      CFLAGS="$CFLAGS -fno-omit-frame-pointer"
-      CXXFLAGS="$CXXFLAGS -fno-omit-frame-pointer"
-    fi
+  AM_CXXFLAGS="$lyx_optim"
+  if test x$enable_debug = xyes ; then
+      AM_CXXFLAGS="-g $AM_CXXFLAGS"
+  fi
+  if test $build_type = gprof ; then
+    AM_CXXFLAGS="$AM_CXXFLAGS -pg"
+    AM_LDFLAGS="$AM_LDFLAGS -pg"
   fi
-  if test "$ac_env_CPPFLAGS_set" != set; then
-    if test x$enable_warnings = xyes ; then
-        case $gxx_version in
-            3.1*|3.2*|3.3*)
-                CPPFLAGS="-W -Wall $CPPFLAGS"
-                ;;
-            *)
-                CPPFLAGS="-Wextra -Wall $CPPFLAGS "
-                ;;
-        esac
-    fi
+  if test $build_type = profiling ; then
+    AM_CXXFLAGS="$AM_CXXFLAGS -fno-omit-frame-pointer"
+  fi
+
+  if test x$USE_QT5 = xyes ; then
+      AS_CASE([$host], [*mingw*|*cygwin*], [], [AM_CXXFLAGS="-fPIC $AM_CXXFLAGS"])
+  fi
+  dnl Warnings are for preprocessor too
+  if test x$enable_warnings = xyes ; then
+      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
-          ;;
-      *)       AM_CXXFLAGS="";;
+      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.4*|4.*)
+      *)
         lyx_flags="$lyx_flags stdlib-debug"
        AC_DEFINE(_GLIBCXX_DEBUG, 1, [libstdc++ debug mode])
        AC_DEFINE(_GLIBCXX_DEBUG_PEDANTIC, 1, [libstdc++ pedantic debug mode])
         ;;
     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])
-       ;;
+      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*)
+        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"
+        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
-  if test x$enable_cxx11 = xyes ; then
-      dnl FIXME: check what to do with clang (is anything needed at all?)
-      case $gxx_version in
-         4.3*|4.4*|4.5*|4.6*)
-             lyx_flags="$lyx_flags c++11-mode"
-             CXXFLAGS="-std=gnu++0x $CXXFLAGS"
-             ;;
-         4.7*|4.8*)
-             lyx_flags="$lyx_flags c++11-mode"
-             CXXFLAGS="-std=gnu++11 $CXXFLAGS"
-             ;;
-      esac
+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
-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.
@@ -354,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;])],
@@ -369,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;])],
@@ -382,7 +434,20 @@ AC_DEFUN([LYX_USE_INCLUDED_BOOST],[
            LIBS=$save_LIBS
            AC_LANG_POP(C++)
            BOOST_INCLUDES=
-           BOOST_LIBS="-lboost_regex${BOOST_MT} -lboost_signals${BOOST_MT}"
+           if test $lyx_std_regex = yes ; then
+             BOOST_LIBS="-lboost_signals${BOOST_MT}"
+           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)
@@ -428,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
@@ -531,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
@@ -569,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)