mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 04:52:59 +01:00
c++11: detect and correct for boost builds with an incompatible abi
This is ugly, but temporary. boost::filesystem will likely be dropped soon after c++11 is enabled. Otherwise, we could simply roll our own copy_file. I've fixed this at the buildsystem level for now in order to avoid mixing in functional changes. Explanation: If boost (prior to 1.57) was built without c++11, it emulated scoped enums using c++98 constructs. Unfortunately, this implementation detail leaked into the abi. This was fixed in 1.57. When building against that installed version using c++11, the headers pick up on the native c++11 scoped enum support and enable it, however it will fail to link. This can be worked around by disabling c++11 scoped enums if linking will fail. Add an autoconf test to determine incompatibility. At build-time, if native enums are being used (a c++11 build), and force-disabling them causes a successful link, we can be sure that there's an incompatibility and enable the work-around.
This commit is contained in:
parent
605c17844e
commit
76ac35f36d
25
configure.ac
25
configure.ac
@ -619,6 +619,31 @@ if test x$use_boost = xyes; then
|
|||||||
|
|
||||||
BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB $BOOST_CHRONO_LIB"
|
BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB $BOOST_CHRONO_LIB"
|
||||||
|
|
||||||
|
TEMP_LIBS="$LIBS"
|
||||||
|
LIBS="$BOOST_LIBS $LIBS"
|
||||||
|
TEMP_CPPFLAGS="$CPPFLAGS"
|
||||||
|
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||||
|
AC_MSG_CHECKING([for mismatched boost c++11 scoped enums])
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
#include "boost/config.hpp"
|
||||||
|
#include "boost/version.hpp"
|
||||||
|
#if !defined(BOOST_NO_SCOPED_ENUMS) && !defined(BOOST_NO_CXX11_SCOPED_ENUMS) && BOOST_VERSION < 105700
|
||||||
|
#define BOOST_NO_SCOPED_ENUMS
|
||||||
|
#define BOOST_NO_CXX11_SCOPED_ENUMS
|
||||||
|
#define CHECK
|
||||||
|
#endif
|
||||||
|
#include "boost/filesystem.hpp"
|
||||||
|
]],[[
|
||||||
|
#if defined(CHECK)
|
||||||
|
boost::filesystem::copy_file("foo", "bar");
|
||||||
|
#else
|
||||||
|
choke;
|
||||||
|
#endif
|
||||||
|
]])],
|
||||||
|
[AC_MSG_RESULT(mismatched); AC_DEFINE(FORCE_BOOST_EMULATED_SCOPED_ENUMS, 1, [Define this symbol if boost scoped enums are emulated])], [AC_MSG_RESULT(ok)])
|
||||||
|
LIBS="$TEMP_LIBS"
|
||||||
|
CPPFLAGS="$TEMP_CPPFLAGS"
|
||||||
|
|
||||||
dnl Boost >= 1.50 uses sleep_for rather than the now-deprecated sleep, however
|
dnl Boost >= 1.50 uses sleep_for rather than the now-deprecated sleep, however
|
||||||
dnl it was broken from 1.50 to 1.52 when backed by nanosleep. Use sleep_for if
|
dnl it was broken from 1.50 to 1.52 when backed by nanosleep. Use sleep_for if
|
||||||
dnl a working version is available, else fall back to sleep. sleep was removed
|
dnl a working version is available, else fall back to sleep. sleep was removed
|
||||||
|
@ -15,6 +15,12 @@
|
|||||||
#include "utiltime.h"
|
#include "utiltime.h"
|
||||||
#include "wallet/wallet.h"
|
#include "wallet/wallet.h"
|
||||||
|
|
||||||
|
#if defined(FORCE_BOOST_EMULATED_SCOPED_ENUMS)
|
||||||
|
#define BOOST_NO_SCOPED_ENUMS
|
||||||
|
#define BOOST_NO_CXX11_SCOPED_ENUMS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <boost/version.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include <boost/scoped_ptr.hpp>
|
#include <boost/scoped_ptr.hpp>
|
||||||
|
Loading…
Reference in New Issue
Block a user