ax_boost_for_kea.m4 8.1 KB
Newer Older
1
dnl @synopsis AX_BOOST_FOR_KEA
2
dnl
3
dnl Test for the Boost C++ header files intended to be used within Kea
4 5 6 7 8 9 10 11 12 13 14 15
dnl
dnl If no path to the installed boost header files is given via the
dnl --with-boost-include option,  the macro searchs under
dnl /usr/local /usr/pkg /opt /opt/local directories.
dnl If it cannot detect any workable path for Boost, this macro treats it
dnl as a fatal error (so it cannot be called if the availability of Boost
dnl is optional).
dnl
dnl This macro also tries to identify some known portability issues, and
dnl sets corresponding variables so the caller can react to (or ignore,
dnl depending on other configuration) specific issues appropriately.
dnl
16
dnl Boost.Asio depends on Boost.System which can be header only with
17 18
dnl versions >= 1.56. On older and perhaps some recent versions
dnl libboost_system is required.
19 20
dnl --with-boost-libs can help forcing link with a Boost library,
dnl e.g., --with-boost-libs=-lboost_system
21
dnl
22 23 24
dnl This macro calls:
dnl
dnl   AC_SUBST(BOOST_INCLUDES)
25
dnl   AC_SUBST(BOOST_LIBS)
26
dnl   AC_SUBST(DISTCHECK_BOOST_CONFIGURE_FLAG)
27 28 29
dnl
dnl And possibly sets:
dnl   CPPFLAGS_BOOST_THREADCONF should be added to CPPFLAGS by caller
30 31 32 33
dnl   BOOST_OFFSET_PTR_WOULDFAIL set to "yes" if offset_ptr would cause build
dnl                              error; otherwise set to "no"
dnl   BOOST_NUMERIC_CAST_WOULDFAIL set to "yes" if numeric_cast would cause
dnl                                build error; otherwise set to "no"
34 35
dnl   BOOST_STATIC_ASSERT_WOULDFAIL set to "yes" if BOOST_STATIC_ASSERT would
dnl                                 cause build error; otherwise set to "no"
36

37
AC_DEFUN([AX_BOOST_FOR_KEA], [
38 39 40
AC_LANG_SAVE
AC_LANG([C++])

41 42
DISTCHECK_BOOST_CONFIGURE_FLAG=

43
# We'll attempt to Use Boost system library by default
44
BOOST_LIBS=
45
BOOST_LIB_DIR=
46
boost_lib_path=
47

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
#
# Configure Boost header path
#
# If explicitly specified, use it.
AC_ARG_WITH([boost-include],
  AC_HELP_STRING([--with-boost-include=PATH],
    [specify exact directory for Boost headers]),
    [boost_include_path="$withval"])
# If not specified, try some common paths.
if test -z "$with_boost_include"; then
	boostdirs="/usr/local /usr/pkg /opt /opt/local"
	for d in $boostdirs
	do
		if test -f $d/include/boost/shared_ptr.hpp; then
			boost_include_path=$d/include
63
			boost_lib_path=$d/lib
64 65 66
			break
		fi
	done
67 68
else
	DISTCHECK_BOOST_CONFIGURE_FLAG="--with-boost-include=${boost_include_path}"
69 70 71 72 73 74 75 76
fi

# Check the path with some specific headers.
CPPFLAGS_SAVED="$CPPFLAGS"
if test "${boost_include_path}" ; then
	BOOST_INCLUDES="-I${boost_include_path}"
	CPPFLAGS="$CPPFLAGS $BOOST_INCLUDES"
fi
77
AC_CHECK_HEADERS([boost/shared_ptr.hpp boost/foreach.hpp boost/interprocess/sync/interprocess_upgradable_mutex.hpp boost/date_time/posix_time/posix_time_types.hpp boost/bind.hpp boost/function.hpp boost/asio/coroutine.hpp boost/asio.hpp boost/asio/ip/address.hpp boost/system/error_code.hpp],,
78 79
  AC_MSG_ERROR([Missing required header files.]))

80 81 82 83
# clang can cause false positives with -Werror without -Qunused-arguments.
# it can be triggered if used with ccache.
AC_CHECK_DECL([__clang__], [CLANG_CXXFLAGS="-Qunused-arguments"], [])

84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
# Detect whether Boost tries to use threads by default, and, if not,
# make it sure explicitly.  In some systems the automatic detection
# may depend on preceding header files, and if inconsistency happens
# it could lead to a critical disruption.
AC_MSG_CHECKING([whether Boost tries to use threads])
AC_TRY_COMPILE([
#include <boost/config.hpp>
#ifdef BOOST_HAS_THREADS
#error "boost will use threads"
#endif],,
[AC_MSG_RESULT(no)
 CPPFLAGS_BOOST_THREADCONF="-DBOOST_DISABLE_THREADS=1"],
[AC_MSG_RESULT(yes)])

# Boost offset_ptr is known to not compile on some platforms, depending on
# boost version, its local configuration, and compiler.  Detect it.
100
CXXFLAGS_SAVED="$CXXFLAGS"
101
CXXFLAGS="$CXXFLAGS $CLANG_CXXFLAGS -Werror"
102 103 104 105 106 107 108 109
AC_MSG_CHECKING([Boost offset_ptr compiles])
AC_TRY_COMPILE([
#include <boost/interprocess/offset_ptr.hpp>
],,
[AC_MSG_RESULT(yes)
 BOOST_OFFSET_PTR_WOULDFAIL=no],
[AC_MSG_RESULT(no)
 BOOST_OFFSET_PTR_WOULDFAIL=yes])
110
CXXFLAGS="$CXXFLAGS_SAVED"
111

112 113
# Detect build failure case known to happen with Boost installed via
# FreeBSD ports
114 115
if test "X$GXX" = "Xyes"; then
   CXXFLAGS_SAVED="$CXXFLAGS"
116
   CXXFLAGS="$CXXFLAGS $CLANG_CXXFLAGS -Werror"
117 118 119 120 121 122 123 124 125 126 127 128 129

   AC_MSG_CHECKING([Boost numeric_cast compiles with -Werror])
   AC_TRY_COMPILE([
   #include <boost/numeric/conversion/cast.hpp>
   ],[
   return (boost::numeric_cast<short>(0));
   ],[AC_MSG_RESULT(yes)
      BOOST_NUMERIC_CAST_WOULDFAIL=no],
   [AC_MSG_RESULT(no)
    BOOST_NUMERIC_CAST_WOULDFAIL=yes])

   CXXFLAGS="$CXXFLAGS_SAVED"
else
130
   # This doesn't matter for non-g++
131
   BOOST_NUMERIC_CAST_WOULDFAIL=no
132 133
fi

134 135 136 137 138 139 140 141 142 143 144 145
# BOOST_STATIC_ASSERT in versions below Boost 1.54.0 is known to result
# in warnings with GCC 4.8.  Detect it.
AC_MSG_CHECKING([BOOST_STATIC_ASSERT compiles])
AC_TRY_COMPILE([
#include <boost/static_assert.hpp>
void testfn(void) { BOOST_STATIC_ASSERT(true); }
],,
[AC_MSG_RESULT(yes)
 BOOST_STATIC_ASSERT_WOULDFAIL=no],
[AC_MSG_RESULT(no)
 BOOST_STATIC_ASSERT_WOULDFAIL=yes])

146 147 148
# Get libs when explicitly configured
AC_ARG_WITH([boost-libs],
  AC_HELP_STRING([--with-boost-libs=SPEC],
149
    [specify Boost libraries to link with, e.g., '-lboost_system']),
150 151 152
    [BOOST_LIBS="$withval"
     DISTCHECK_BOOST_CONFIGURE_FLAG="$DISTCHECK_BOOST_CONFIGURE_FLAG --with-boost-libs=$withval"])

153 154 155 156 157
# Get lib dir when explicitly configured
AC_ARG_WITH([boost-lib-dir],
  AC_HELP_STRING([--with-boost-lib-dir=PATH],
    [specify directory where to find Boost libraries]),
    [BOOST_LIB_DIR="$withval"
158
     DISTCHECK_BOOST_CONFIGURE_FLAG="$DISTCHECK_BOOST_CONFIGURE_FLAG --with-boost-lib-dir=$withval"])
159

160 161 162 163 164 165 166 167 168
AC_ARG_ENABLE([boost-headers-only],
    [AS_HELP_STRING([--enable-boost-headers-only],
        [Build with boost headers only rather than link
         with boost_system library. This is NOT recommended
         as it may result in non-optimized code on some
         platforms or introduce runtime errors on others.])],
    [enable_boost_header="yes"; BOOST_LIBS=""],
    [BOOST_LIBS="${BOOST_LIBS} -lboost_system"])

169 170
# BOOST_ERROR_CODE_HEADER_ONLY in versions below Boost 1.56.0 can fail
# to find the error_code.cpp file.
171 172 173 174 175 176 177 178 179 180 181 182
if test "x${BOOST_LIBS}" = "x"; then
   AC_MSG_CHECKING([BOOST_ERROR_CODE_HEADER_ONLY works])
   CXXFLAGS_SAVED2="$CPPFLAGS"
   CPPFLAGS="$CPPFLAGS -DBOOST_ERROR_CODE_HEADER_ONLY"
   CPPFLAGS="$CPPFLAGS -DBOOST_SYSTEM_NO_DEPRECATED"

   AC_TRY_COMPILE([
   #include <boost/system/error_code.hpp>
   ],,
   [AC_MSG_RESULT(yes)],
   [AC_MSG_RESULT(no)
    AC_MSG_WARN([The Boost system library is required.])
183 184 185 186
    BOOST_LIBS="-lboost_system"
    if test "x${BOOST_LIB_DIR}" = "x"; then
       BOOST_LIB_DIR="$boost_lib_path"
    fi])
187 188 189 190 191 192

   CPPFLAGS="$CXXFLAGS_SAVED2"
fi

# A Boost library is used.
if test "x${BOOST_LIBS}" != "x"; then
193 194 195
   if test "x${BOOST_LIB_DIR}" != "x"; then
      BOOST_LIBS="-L$BOOST_LIB_DIR $BOOST_LIBS"
   fi
196 197 198
   LIBS_SAVED="$LIBS"
   LIBS="$BOOST_LIBS $LIBS"

199 200 201 202
   if test $enable_static_link = yes; then
       LIBS="-static $LIBS"
   fi

203 204 205 206 207
   AC_LINK_IFELSE(
     [AC_LANG_PROGRAM([#include <boost/system/error_code.hpp>],
                      [boost::system::error_code ec;])],
     [AC_MSG_RESULT([checking for Boost system library... yes])],
     [AC_MSG_RESULT([checking for Boost system library... no])
208
      AC_MSG_ERROR([Linking with ${BOOST_LIBS} is not enough: please make sure libboost_system is installed; Check config.log for details, you may be missing other libraries.])])
209

210
   LIBS="$LIBS_SAVED"
211
fi
212

213
CXXFLAGS="$CXXFLAGS_SAVED"
214

215
AC_SUBST(BOOST_INCLUDES)
216
AC_SUBST(BOOST_LIBS)
217
AC_SUBST(DISTCHECK_BOOST_CONFIGURE_FLAG)
218

219 220 221
dnl Determine the Boost version, used mainly for config.report.
AC_MSG_CHECKING([Boost version])
cat > conftest.cpp << EOF
222
#include <boost/version.hpp>
223 224 225
AUTOCONF_BOOST_LIB_VERSION=BOOST_LIB_VERSION
EOF

Francis Dupont's avatar
Francis Dupont committed
226
dnl CPPP is defined in configure to $CPP or $CPP -P
227
BOOST_VERSION=`$CPPP $CPPFLAGS conftest.cpp | grep '^AUTOCONF_BOOST_LIB_VERSION=' | $SED -e 's/^AUTOCONF_BOOST_LIB_VERSION=//' -e 's/_/./g' -e 's/"//g' 2> /dev/null`
228 229 230 231 232 233
if test -z "$BOOST_VERSION"; then
  BOOST_VERSION="unknown"
fi
$RM -f conftest.cpp
AC_MSG_RESULT([$BOOST_VERSION])

234 235
CPPFLAGS="$CPPFLAGS_SAVED"
AC_LANG_RESTORE
236
])dnl AX_BOOST_FOR_KEA