Require a C++11 compiler

As discussed on the list. If no C++11 compiler is found configuration stops
with an error. There are now unneeded parts of boost, the will be removed in
a second commit.
This commit is contained in:
Georg Baum 2016-06-07 20:33:06 +02:00
parent 9dd695b17a
commit 273c67d8aa
17 changed files with 24 additions and 136 deletions

View File

@ -142,7 +142,6 @@ LYX_OPTION(ENABLE_EXPORT_TESTS "Enable for export tests" OFF ALL)
LYX_OPTION(ASAN "Use address sanitizer" OFF ALL) LYX_OPTION(ASAN "Use address sanitizer" OFF ALL)
LYX_COMBO(USE_QT "Use Qt version as frontend" QT4 QT5) LYX_COMBO(USE_QT "Use Qt version as frontend" QT4 QT5)
LYX_OPTION(3RDPARTY_BUILD "Build 3rdparty libs" OFF ALL) LYX_OPTION(3RDPARTY_BUILD "Build 3rdparty libs" OFF ALL)
LYX_COMBO(ENABLE_CXX11 "Build with options for c++11-mode" AUTO ON OFF)
# GCC specific # GCC specific
LYX_OPTION(PROFILE "Build profile version" OFF GCC) LYX_OPTION(PROFILE "Build profile version" OFF GCC)
@ -254,24 +253,10 @@ else()
endif() endif()
if(LYX_ENABLE_CXX11 MATCHES "AUTO")
# Set to some meaningful default # Set to some meaningful default
find_package(CXX11Compiler) find_package(CXX11Compiler)
if(NOT CXX11COMPILER_FOUND) if(NOT CXX11COMPILER_FOUND)
set(LYX_ENABLE_CXX11 OFF CACHE TYPE STRING FORCE) message(FATAL_ERROR "A C++11 compatible compiler is required.")
else()
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
set(LYX_ENABLE_CXX11 ON CACHE TYPE STRING FORCE)
else()
# Not a gnu compiler
if(CMAKE_CXX_COMPILER_ID MATCHES "^[cC]lang$")
set(LYX_ENABLE_CXX11 ON CACHE TYPE STRING FORCE)
else()
set(LYX_ENABLE_CXX11 OFF CACHE TYPE STRING FORCE)
endif()
endif()
endif()
endif() endif()
set(LYX_GCC11_MODE) set(LYX_GCC11_MODE)
if(UNIX OR MINGW) if(UNIX OR MINGW)
@ -285,17 +270,9 @@ if(UNIX OR MINGW)
# see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631 # see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631
set(LYX_USE_STD_REGEX 0) set(LYX_USE_STD_REGEX 0)
else() else()
if (LYX_ENABLE_CXX11)
set(LYX_USE_STD_REGEX 1) set(LYX_USE_STD_REGEX 1)
endif() endif()
endif()
if (LYX_ENABLE_CXX11)
find_package(CXX11Compiler)
if(NOT CXX11COMPILER_FOUND)
message(FATAL_ERROR "A C++11 compatible compiler is required.")
endif()
set(LYX_GCC11_MODE "${CXX11_FLAG}") set(LYX_GCC11_MODE "${CXX11_FLAG}")
endif()
else() else()
set(LYX_USE_STD_REGEX 0) set(LYX_USE_STD_REGEX 0)
# if(MSVC10) # if(MSVC10)

View File

@ -177,7 +177,6 @@ dnl not plainly added to AM_CPPFLAGS because then the objc compiler (mac)
dnl would fail. dnl would fail.
AC_DEFUN([LYX_CXX_USE_REGEX], AC_DEFUN([LYX_CXX_USE_REGEX],
[lyx_std_regex=no [lyx_std_regex=no
if test $lyx_use_cxx11 = yes; then
save_CPPFLAGS=$CPPFLAGS save_CPPFLAGS=$CPPFLAGS
# we want to pass -std=c++11 to clang/cpp if necessary # we want to pass -std=c++11 to clang/cpp if necessary
CPPFLAGS="$AM_CPPFLAGS $1 $CPPFLAGS" CPPFLAGS="$AM_CPPFLAGS $1 $CPPFLAGS"
@ -200,7 +199,6 @@ AC_DEFUN([LYX_CXX_USE_REGEX],
fi fi
fi fi
AC_MSG_RESULT([$lyx_std_regex]) AC_MSG_RESULT([$lyx_std_regex])
fi
if test $lyx_std_regex = yes ; then if test $lyx_std_regex = yes ; then
lyx_flags="$lyx_flags std-regex" lyx_flags="$lyx_flags std-regex"
@ -298,10 +296,6 @@ case $enable_optimization in
*) lyx_optim=${enable_optimization};; *) lyx_optim=${enable_optimization};;
esac esac
AC_ARG_ENABLE(cxx11,
AC_HELP_STRING([--disable-cxx11],[disable C++11 mode (default: enabled for known good compilers)]),,
enable_cxx11=auto;)
AC_ARG_ENABLE(assertions, AC_ARG_ENABLE(assertions,
AC_HELP_STRING([--enable-assertions],[add runtime sanity checks in the program]),, AC_HELP_STRING([--enable-assertions],[add runtime sanity checks in the program]),,
[AS_CASE([$build_type], [dev*|pre*], [enable_assertions=yes], [AS_CASE([$build_type], [dev*|pre*], [enable_assertions=yes],
@ -358,9 +352,6 @@ if test x$GXX = xyes; then
;; ;;
esac esac
fi fi
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 case $gxx_version in
4.3*|4.4*|4.5*|4.6*) 4.3*|4.4*|4.5*|4.6*)
dnl Note that this will define __GXX_EXPERIMENTAL_CXX0X__. dnl Note that this will define __GXX_EXPERIMENTAL_CXX0X__.
@ -380,7 +371,6 @@ if test x$GXX = xyes; then
# (see detection of regex). # (see detection of regex).
AM_CXXFLAGS="$cxx11_flags $AM_CXXFLAGS" AM_CXXFLAGS="$cxx11_flags $AM_CXXFLAGS"
fi fi
fi
LYX_CXX_CXX11 LYX_CXX_CXX11
if test $lyx_use_cxx11 = yes; then if test $lyx_use_cxx11 = yes; then
@ -388,6 +378,8 @@ if test $lyx_use_cxx11 = yes; then
dnl We still use auto_ptr, which is obsoleted. Shut off the warnings. dnl We still use auto_ptr, which is obsoleted. Shut off the warnings.
AM_CXXFLAGS="$AM_CXXFLAGS -Wno-deprecated-declarations" AM_CXXFLAGS="$AM_CXXFLAGS -Wno-deprecated-declarations"
fi fi
else
AC_ERROR([A C++11 compatible compiler is required])
fi fi
LYX_CXX_USE_REGEX([$cxx11_flags]) LYX_CXX_USE_REGEX([$cxx11_flags])
]) ])

View File

@ -294,10 +294,6 @@ AH_BOTTOM([
/************************************************************ /************************************************************
** You should not need to change anything beyond this point */ ** You should not need to change anything beyond this point */
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
#define LYX_USE_CXX11
#endif
#ifndef HAVE_STRERROR #ifndef HAVE_STRERROR
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" extern "C"

View File

@ -82,14 +82,14 @@ if [%2]==[] (
if "%1%" == "devel" ( if "%1%" == "devel" (
REM Build solution to develop LyX REM Build solution to develop LyX
REM you can add the option "-GNinja" for a faster compilation REM you can add the option "-GNinja" for a faster compilation
cmake %LYX_SOURCE% -GNinja -G%USED_STUDIO% -DLYX_ENABLE_CXX11=ON -DLYX_ENABLE_EXPORT_TESTS=ON -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=0 -DLYX_RELEASE=0 -DLYX_CONSOLE=FORCE %DEPENDENCIES_DOWNLOAD% cmake %LYX_SOURCE% -GNinja -G%USED_STUDIO% -DLYX_ENABLE_EXPORT_TESTS=ON -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=0 -DLYX_RELEASE=0 -DLYX_CONSOLE=FORCE %DEPENDENCIES_DOWNLOAD%
msbuild lyx.sln /p:Configuration=Debug /t:LyX /t:tex2lyx msbuild lyx.sln /p:Configuration=Debug /t:LyX /t:tex2lyx
) )
if "%1%" == "install" ( if "%1%" == "install" (
REM Build solution to develop LyX REM Build solution to develop LyX
REM set -DLYX_MERGE_REBUILD and -DLYX_MERGE_FILES to 1 for a version released with an installer REM set -DLYX_MERGE_REBUILD and -DLYX_MERGE_FILES to 1 for a version released with an installer
cmake %LYX_SOURCE% -GNinja -G%USED_STUDIO% -DLYX_ENABLE_CXX11=ON -DLYX_MERGE_REBUILD=0 -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=1 -DLYX_RELEASE=1 -DLYX_CONSOLE=OFF %DEPENDENCIES_DOWNLOAD% cmake %LYX_SOURCE% -GNinja -G%USED_STUDIO% -DLYX_MERGE_REBUILD=0 -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=1 -DLYX_RELEASE=1 -DLYX_CONSOLE=OFF %DEPENDENCIES_DOWNLOAD%
msbuild lyx.sln /p:Configuration=Release /t:ALL_BUILD msbuild lyx.sln /p:Configuration=Release /t:ALL_BUILD
msbuild INSTALL.vcxproj /p:Configuration=Release msbuild INSTALL.vcxproj /p:Configuration=Release
) )

View File

@ -73,7 +73,7 @@ REM start with a new cmake run
if "%1%" == "devel" ( if "%1%" == "devel" (
REM Build solution to develop LyX REM Build solution to develop LyX
REM you can add the option "-GNinja" for a faster compilation REM you can add the option "-GNinja" for a faster compilation
cmake %LYX_SOURCE% -G"Visual Studio 14 2015 Win64" -DLYX_ENABLE_CXX11=ON -DLYX_USE_QT=QT5 -DLYX_ENABLE_EXPORT_TESTS=0 -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=0 -DLYX_RELEASE=0 -DLYX_CONSOLE=FORCE -DLYX_3RDPARTY_BUILD=1 %DEPENDENCIES_DOWNLOAD% cmake %LYX_SOURCE% -G"Visual Studio 14 2015 Win64" -DLYX_USE_QT=QT5 -DLYX_ENABLE_EXPORT_TESTS=0 -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=0 -DLYX_RELEASE=0 -DLYX_CONSOLE=FORCE -DLYX_3RDPARTY_BUILD=1 %DEPENDENCIES_DOWNLOAD%
msbuild src\LyX.vcxproj /p:Configuration=Debug msbuild src\LyX.vcxproj /p:Configuration=Debug
msbuild src\tex2lyx\tex2lyx.vcxproj /p:Configuration=Debug msbuild src\tex2lyx\tex2lyx.vcxproj /p:Configuration=Debug
) )
@ -81,7 +81,7 @@ if "%1%" == "devel" (
if "%1%" == "install" ( if "%1%" == "install" (
REM Build solution to develop LyX REM Build solution to develop LyX
REM set -DLYX_MERGE_REBUILD and -DLYX_MERGE_FILES to 1 for a version released with an installer REM set -DLYX_MERGE_REBUILD and -DLYX_MERGE_FILES to 1 for a version released with an installer
cmake %LYX_SOURCE% -GNinja -G"Visual Studio 14 2015 Win64" -DLYX_ENABLE_CXX11=ON -DLYX_USE_QT=QT5 -DLYX_MERGE_REBUILD=0 -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=1 -DLYX_RELEASE=1 -DLYX_CONSOLE=OFF %DEPENDENCIES_DOWNLOAD% cmake %LYX_SOURCE% -GNinja -G"Visual Studio 14 2015 Win64" -DLYX_USE_QT=QT5 -DLYX_MERGE_REBUILD=0 -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=1 -DLYX_RELEASE=1 -DLYX_CONSOLE=OFF %DEPENDENCIES_DOWNLOAD%
msbuild INSTALL.vcxproj /p:Configuration=Release msbuild INSTALL.vcxproj /p:Configuration=Release
) )

View File

@ -76,7 +76,7 @@ REM start with a new cmake run
if "%1%" == "devel" ( if "%1%" == "devel" (
REM Build solution to develop LyX REM Build solution to develop LyX
REM you can add the option "-GNinja" for a faster compilation REM you can add the option "-GNinja" for a faster compilation
cmake %LYX_SOURCE% -G"Visual Studio 14 2015" -DLYX_ENABLE_CXX11=ON -DLYX_USE_QT=QT5 -DLYX_ENABLE_EXPORT_TESTS=0 -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=0 -DLYX_RELEASE=0 -DLYX_CONSOLE=FORCE -DLYX_3RDPARTY_BUILD=1 %DEPENDENCIES_DOWNLOAD% cmake %LYX_SOURCE% -G"Visual Studio 14 2015" -DLYX_USE_QT=QT5 -DLYX_ENABLE_EXPORT_TESTS=0 -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=0 -DLYX_RELEASE=0 -DLYX_CONSOLE=FORCE -DLYX_3RDPARTY_BUILD=1 %DEPENDENCIES_DOWNLOAD%
msbuild src\LyX.vcxproj /p:Configuration=Debug msbuild src\LyX.vcxproj /p:Configuration=Debug
msbuild src\tex2lyx\tex2lyx.vcxproj /p:Configuration=Debug msbuild src\tex2lyx\tex2lyx.vcxproj /p:Configuration=Debug
) )
@ -84,7 +84,7 @@ if "%1%" == "devel" (
if "%1%" == "install" ( if "%1%" == "install" (
REM Build solution to develop LyX REM Build solution to develop LyX
REM set -DLYX_MERGE_REBUILD and -DLYX_MERGE_FILES to 1 for a version released with an installer REM set -DLYX_MERGE_REBUILD and -DLYX_MERGE_FILES to 1 for a version released with an installer
cmake %LYX_SOURCE% -GNinja -G"Visual Studio 14 2015" -DLYX_ENABLE_CXX11=ON -DLYX_USE_QT=QT5 -DLYX_MERGE_REBUILD=0 -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=1 -DLYX_RELEASE=1 -DLYX_CONSOLE=OFF %DEPENDENCIES_DOWNLOAD% cmake %LYX_SOURCE% -GNinja -G"Visual Studio 14 2015" -DLYX_USE_QT=QT5 -DLYX_MERGE_REBUILD=0 -DLYX_MERGE_FILES=0 -DLYX_NLS=1 -DLYX_INSTALL=1 -DLYX_RELEASE=1 -DLYX_CONSOLE=OFF %DEPENDENCIES_DOWNLOAD%
REM msbuild lyx.sln /p:Configuration=Release /t:ALL_BUILD REM msbuild lyx.sln /p:Configuration=Release /t:ALL_BUILD
msbuild INSTALL.vcxproj /p:Configuration=Release msbuild INSTALL.vcxproj /p:Configuration=Release
) )

View File

@ -68,13 +68,6 @@
// use GNU libstdc++ with C++11 ABI // use GNU libstdc++ with C++11 ABI
#cmakedefine USE_GLIBCXX_CXX11_ABI 1 #cmakedefine USE_GLIBCXX_CXX11_ABI 1
// use GNU c++11 extensions
#cmakedefine LYX_USE_CXX11 1
#ifndef LYX_USE_CXX11
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
#error "Conflicting defines of LYX_USE_CXX11"
#endif
#endif
#cmakedefine Z_PREFIX 1 #cmakedefine Z_PREFIX 1
// Defined if QT=QT5 uses X11 // Defined if QT=QT5 uses X11

View File

@ -23,7 +23,7 @@ rmdir /s/q %LYX_BUILD%
mkdir %LYX_BUILD% mkdir %LYX_BUILD%
cd %LYX_BUILD% cd %LYX_BUILD%
cmake %LYX_SOURCE% -G"MinGW Makefiles" -DLYX_PYTHON_EXECUTABLE=%GNUWIN32_DIR%\Python\python -DLYX_3RDPARTY_BUILD=1 -DLYX_ENABLE_CXX11=ON -DLYX_USE_QT=QT5 -DLYX_MERGE_REBUILD=1 -DLYX_MERGE_FILES=1 -DLYX_NLS=1 -DLYX_INSTALL=1 -DLYX_RELEASE=1 -DLYX_CONSOLE=OFF cmake %LYX_SOURCE% -G"MinGW Makefiles" -DLYX_PYTHON_EXECUTABLE=%GNUWIN32_DIR%\Python\python -DLYX_3RDPARTY_BUILD=1 -DLYX_USE_QT=QT5 -DLYX_MERGE_REBUILD=1 -DLYX_MERGE_FILES=1 -DLYX_NLS=1 -DLYX_INSTALL=1 -DLYX_RELEASE=1 -DLYX_CONSOLE=OFF
mingw32-make doc mingw32-make doc
mingw32-make translations mingw32-make translations

View File

@ -106,7 +106,6 @@ cmake $lyxsrcdir \
-DLYX_XMINGW=$compiler \ -DLYX_XMINGW=$compiler \
-DLYX_USE_QT=QT5 \ -DLYX_USE_QT=QT5 \
-DLYX_QUIET=1 \ -DLYX_QUIET=1 \
-DLYX_ENABLE_CXX11=ON \
-DLYX_HUNSPELL=1 \ -DLYX_HUNSPELL=1 \
-DLYX_3RDPARTY_BUILD=1 \ -DLYX_3RDPARTY_BUILD=1 \
$pch $mergefile $pch $mergefile

View File

@ -690,7 +690,7 @@ static docstring escape_special_chars(docstring const & expr)
// $& is an ECMAScript format expression that expands to all // $& is an ECMAScript format expression that expands to all
// of the current match // of the current match
#if defined(LYX_USE_CXX11) && defined(LYX_USE_STD_REGEX) #ifdef LYX_USE_STD_REGEX
// To prefix a matched expression with a single literal backslash, we // To prefix a matched expression with a single literal backslash, we
// need to escape it for the C++ compiler and use: // need to escape it for the C++ compiler and use:
// FIXME: UNICODE // FIXME: UNICODE

View File

@ -20,7 +20,7 @@ string const escape_special_chars(string const & expr)
// $& is a ECMAScript format expression that expands to all // $& is a ECMAScript format expression that expands to all
// of the current match // of the current match
#if defined(LYX_USE_CXX11) && defined(LYX_USE_STD_REGEX) #ifdef LYX_USE_STD_REGEX
// To prefix a matched expression with a single literal backslash, we // To prefix a matched expression with a single literal backslash, we
// need to escape it for the C++ compiler and use: // need to escape it for the C++ compiler and use:
return lyx::regex_replace(expr, reg, "\\$&"); return lyx::regex_replace(expr, reg, "\\$&");

View File

@ -14,30 +14,13 @@
#include "support/functional.h" #include "support/functional.h"
#ifdef LYX_USE_CXX11
#define LYX_BIND_NS std
namespace lyx namespace lyx
{ {
using std::placeholders::_1; using std::placeholders::_1;
using std::placeholders::_2; using std::placeholders::_2;
using std::bind;
using std::ref;
} }
#else
#include <boost/bind.hpp>
#define LYX_BIND_NS boost
#endif
namespace lyx
{
using LYX_BIND_NS::bind;
using LYX_BIND_NS::ref;
}
#undef LYX_BIND_NS
#endif #endif

View File

@ -12,25 +12,12 @@
#ifndef LYX_FUNCTIONAL_H #ifndef LYX_FUNCTIONAL_H
#define LYX_FUNCTIONAL_H #define LYX_FUNCTIONAL_H
#ifdef LYX_USE_CXX11
#include <functional> #include <functional>
#define LYX_FUNCTIONAL_NS std
#else
#include <boost/function.hpp>
#include <boost/functional.hpp>
#define LYX_FUNCTIONAL_NS boost
#endif
namespace lyx namespace lyx
{ {
using LYX_FUNCTIONAL_NS::function; using std::function;
} }
#undef LYX_FUNCTIONAL_NS
#endif #endif

View File

@ -84,30 +84,10 @@ void eliminate_duplicates(C & c)
} }
#ifdef LYX_USE_CXX11
using std::next; using std::next;
#else
/// Replacement of std::next for older compilers
template <typename It, typename Diff>
inline It next(It i, Diff n = 1)
{
std::advance(i, n);
return i;
}
#endif
#ifdef LYX_USE_CXX11
using std::prev; using std::prev;
#else
/// Replacement of std::prev for older compilers
template <typename It, typename Diff>
inline It prev(It i, Diff n = 1)
{
std::advance(i, -n);
return i;
}
#endif
} // namespace lyx } // namespace lyx

View File

@ -12,7 +12,7 @@
#ifndef LYX_REGEXP_H #ifndef LYX_REGEXP_H
#define LYX_REGEXP_H #define LYX_REGEXP_H
#if defined(LYX_USE_CXX11) && defined(LYX_USE_STD_REGEX) #ifdef LYX_USE_STD_REGEX
# include <regex> # include <regex>
// <regex> in gcc is unusable in versions less than 4.9.0 // <regex> in gcc is unusable in versions less than 4.9.0
// see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631 // see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631

View File

@ -12,27 +12,14 @@
#ifndef LYX_SHARED_PTR_H #ifndef LYX_SHARED_PTR_H
#define LYX_SHARED_PTR_H #define LYX_SHARED_PTR_H
#ifdef LYX_USE_CXX11
#include <memory> #include <memory>
#define LYX_SHAREDPTR_NS std
#else
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#define LYX_SHAREDPTR_NS boost
#endif
namespace lyx namespace lyx
{ {
using LYX_SHAREDPTR_NS::shared_ptr; using std::shared_ptr;
using LYX_SHAREDPTR_NS::make_shared; using std::make_shared;
using LYX_SHAREDPTR_NS::const_pointer_cast; using std::const_pointer_cast;
} }
#undef LYX_SHAREDPTR_NS
#endif #endif

View File

@ -125,15 +125,9 @@ public:
iparserdocstream(idocstream & is) : is_(is) {} iparserdocstream(idocstream & is) : is_(is) {}
#ifdef LYX_USE_CXX11
/// Like std::istream::operator bool() /// Like std::istream::operator bool()
/// Do not convert is_ implicitly to bool, since that is forbidden in C++11. /// Do not convert is_ implicitly to bool, since that is forbidden in C++11.
explicit operator bool() const { return s_.empty() ? !is_.fail() : true; } explicit operator bool() const { return s_.empty() ? !is_.fail() : true; }
#else
/// Like std::istream::operator void*()
operator void*() const { return (s_.empty() && is_.fail()) ?
0 : const_cast<iparserdocstream *>(this); }
#endif
/// change the encoding of the input stream to \p e (iconv name) /// change the encoding of the input stream to \p e (iconv name)
void setEncoding(std::string const & e); void setEncoding(std::string const & e);