configure.ac 73.7 KB
Newer Older
1 2
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
3

4
AC_PREREQ([2.59])
5 6 7 8 9

# For released versions, this is in x.y.z format.
# For GIT versions, this is x.y.z-git, where x.y.z denotes the software
# version that was used as a base + changes that were made later, but
# are not released yet.
10
AC_INIT(kea,1.2.0-git, kea-dev@lists.isc.org)
11
AC_CONFIG_SRCDIR(README)
12 13 14 15 16 17 18 19 20 21 22 23 24

# serial-tests is not available in automake version before 1.13, so
# we'll check that and conditionally use serial-tests. This check is
# adopted from code by Richard W.M. Jones:
# https://www.redhat.com/archives/libguestfs/2013-February/msg00102.html
m4_define([serial_tests], [
    m4_esyscmd([automake --version |
                head -1 |
                awk '{split ($NF,a,"."); if (a[1] == 1 && a[2] >= 12) { print "serial-tests" }}'
    ])
])
AM_INIT_AUTOMAKE(foreign serial_tests)

25
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])dnl be backward compatible
26
AC_CONFIG_HEADERS([config.h])
27
AC_CONFIG_MACRO_DIR([m4macros])
28

29 30
AC_CANONICAL_HOST

31 32
# Checks for programs.
AC_PROG_CXX
33

34 35 36
# Check for exact Kea version.
AC_MSG_CHECKING(whether this is a tarball or git source)
if test -d "${srcdir}/.git"; then
37
        KEA_SRCID="git `(cd "${top_srcdir}";git rev-parse HEAD)`"
38 39 40 41 42 43 44 45 46
        AC_MSG_RESULT("git")
else
        KEA_SRCID="tarball"
        AC_MSG_RESULT("tarball")
fi
# Export EXTENDED_VERSION to config.h
# This will be either "tarball" or "git abcd".
AC_DEFINE_UNQUOTED([EXTENDED_VERSION], ["${KEA_SRCID}"], [Extended Kea version])

47 48
# Find a separator for path_replacer
for sep in "+" "," ";" "&" "__NONE__"; do
49 50 51 52 53 54
        if `pwd | grep -q $sep`; then continue; fi
        if `echo ${prefix} | grep -q $sep`; then continue; fi
        if `echo ${sysconfdir} | grep -q $sep`; then continue; fi
        if `echo ${localstatedir} | grep -q $sep`; then continue; fi
        SEP=$sep
        break
55 56
done
if test "$sep" = "__NONE__"; then
57
        AC_MSG_ERROR([can't find a separator character in '+,;&' for the path_replacer shell script])
58 59 60
fi
AC_SUBST(SEP)

61 62 63
# Enable low-performing debugging facilities? This option optionally
# enables some debugging aids that perform slowly and hence aren't built
# by default.
64 65 66 67
AC_ARG_ENABLE([debug],
  AS_HELP_STRING([--enable-debug],
    [enable debugging (default is no)]),
  [case "${enableval}" in
68 69
    yes) debug_enabled=yes ;;
    no)  debug_enabled=no ;;
70
    *)   AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
71 72
  esac],[debug_enabled=no])
AM_CONDITIONAL([DEBUG_ENABLED], [test x$debug_enabled = xyes])
73
AM_COND_IF([DEBUG_ENABLED], [AC_DEFINE([ENABLE_DEBUG], [1], [Enable low-performing debugging facilities?])])
74

75
PREMIUM_DIR=
76 77 78 79 80 81 82
if test -d "${srcdir}/premium"; then
   PREMIUM_DIR=premium
   AC_CONFIG_SUBDIRS([premium])
fi

AC_SUBST(PREMIUM_DIR)

83 84
# Libtool configuration
#
Jelte Jansen's avatar
Jelte Jansen committed
85 86 87

# libtool cannot handle spaces in paths, so exit early if there is one
if [ test `echo $PWD | grep -c ' '` != "0"  ]; then
88
    AC_MSG_ERROR([Kea cannot be built in a directory that contains spaces, because of libtool limitations. Please change the directory name, or use a symbolic link that does not contain spaces.])
Jelte Jansen's avatar
Jelte Jansen committed
89 90
fi

91 92
# On FreeBSD (and probably some others), clang++ does not meet an autoconf
# assumption in identifying libtool configuration regarding shared library:
93 94 95 96 97
# the configure script will execute "$CC -shared $CFLAGS/$CXXFLAGS -v" and
# expect the output contains -Lxxx or -Ryyy.  This is the case for g++, but
# not for clang++, and, as a result, it will cause various errors in linking
# programs or running them with a shared object (such as some of our python
# scripts).
98 99 100 101 102
# To work around this problem we define a temporary variable
# "CXX_LIBTOOL_LDFLAGS".  It's expected to be defined as, e.g, "-L/usr/lib"
# to temporarily fake the output so that it will be compatible with that of
# g++.
CFLAGS_SAVED=$CFLAGS
103
CXXFLAGS_SAVED=$CXXFLAGS
104
CFLAGS="$CFLAGS $CXX_LIBTOOL_LDFLAGS"
105
CXXFLAGS="$CXXFLAGS $CXX_LIBTOOL_LDFLAGS"
106
LT_INIT
107
CFLAGS=$CFLAGS_SAVED
108
CXXFLAGS=$CXXFLAGS_SAVED
109

110
# Use C++ language
111 112 113
AC_LANG([C++])

# Identify the compiler: this check must be after AC_PROG_CXX and AC_LANG.
114
AM_CONDITIONAL(USE_GXX, test "X${GXX}" = "Xyes")
115
AC_CHECK_DECL([__SUNPRO_CC], [SUNCXX="yes"], [SUNCXX="no"])
116
AC_CHECK_DECL([__clang__], [CLANGPP="yes"], [CLANGPP="no"])
Josh Soref's avatar
Josh Soref committed
117
# USE_CLANGPP is no longer used, keep it by symmetry with USE_GXX?
118
AM_CONDITIONAL(USE_CLANGPP, test "X${CLANGPP}" = "Xyes")
119

120
# Check for C++11 features support
121
AX_ISC_CPP11
122

123 124 125 126 127 128 129 130 131 132 133 134
# Check for std::is_base_of support
AC_MSG_CHECKING([for std::is_base_of])
AC_COMPILE_IFELSE(
	[AC_LANG_PROGRAM(
		[#include <type_traits>
		 class A {};
		 class B : A {};]
		[static_assert(std::is_base_of<A, B>::value, "");])],
	[AC_MSG_RESULT(yes)
	 AC_DEFINE([HAVE_IS_BASE_OF], [1],
	 [Define to 1 if std::is_base_of is available])],
	[AC_MSG_RESULT(no)])
135

136
dnl Determine if we are using GNU sed
137
GNU_SED=no
138
$SED --version 2> /dev/null | grep GNU > /dev/null 2>&1
139 140 141 142
if test $? -eq 0; then
  GNU_SED=yes
fi

143 144 145 146 147 148 149
# Display the C++ version
AC_MSG_CHECKING([C++ version])
cat > conftest.cpp << EOF
long v = __cplusplus;
EOF
CXX_STANDARD=`$CXX $CXXFLAGS -E -o - conftest.cpp | grep '^long v = ' | $SED -e 's/^long v = //' -e 's/[[^0-9]]*$//' 2> /dev/null`
if test -z "$CXX_STANDARD"; then
150
        CXX_STANDARD="unknown"
151 152 153
fi
AC_MSG_RESULT([$CXX_STANDARD])

154 155
# Linker options

156
# check -R, "-Wl,-R" or -rpath
157
AX_ISC_RPATH
158

159
# Compiler dependent settings: define some mandatory CXXFLAGS here.
160
# We also use a separate variable KEA_CXXFLAGS.  This will (and should) be
161
# used as the default value for each specific AM_CXXFLAGS:
162
# AM_CXXFLAGS = $(KEA_CXXFLAGS)
163 164 165 166 167 168 169 170
# AM_CXXFLAGS += ... # add module specific flags
# We need this so that we can disable some specific compiler warnings per
# module basis; since AM_CXXFLAGS are placed before CXXFLAGS, and since
# gcc's -Wno-XXX option must be specified after -Wall or -Wextra, we cannot
# specify the default warning flags in CXXFLAGS and let specific modules
# "override" the default.

# This may be used to try linker flags.
171
AC_DEFUN([KEA_CXX_TRY_FLAG], [
172 173
  AC_MSG_CHECKING([whether $CXX supports $1])

174
  kea_save_CXXFLAGS="$CXXFLAGS"
175
  CXXFLAGS="$CXXFLAGS -Werror $1"
176

177
  AC_LINK_IFELSE([AC_LANG_SOURCE([int main(){ return 0;}])],
178 179
                 [kea_cxx_flag=yes], [kea_cxx_flag=no])
  CXXFLAGS="$kea_save_CXXFLAGS"
180

181
  if test "x$kea_cxx_flag" = "xyes"; then
182 183 184 185 186
    ifelse([$2], , :, [$2])
  else
    ifelse([$3], , :, [$3])
  fi

187
  AC_MSG_RESULT([$kea_cxx_flag])
188 189
])

190 191
CXX_VERSION="unknown"

192 193 194
# SunStudio compiler requires special compiler options for boost
# (http://blogs.sun.com/sga/entry/boost_mini_howto)
if test "$SUNCXX" = "yes"; then
195
CXX_VERSION=`$CXX -V 2> /dev/null | head -1`
196
CXXFLAGS="$CXXFLAGS -library=stlport4 -features=tmplife -features=tmplrefstatic"
Francis Dupont's avatar
Francis Dupont committed
197
KEA_CXXFLAGS="$KEA_CXXFLAGS -mt"
198 199 200 201 202 203 204 205 206 207
MULTITHREADING_FLAG="-mt"
fi

# Newer versions of clang++ promotes "unused driver arguments" warnings to
# a fatal error with -Werror, causing build failure.  Since we use multiple
# compilers on multiple systems, this can easily happen due to settings for
# non clang++ environments that could be just ignored otherwise.  It can also
# happen if clang++ is used via ccache.  So, although probably suboptimal,
# we suppress this particular warning.  Note that it doesn't weaken checks
# on the source code.
208
if test "X$CLANGPP" = "Xyes"; then
209
CXX_VERSION=`$CXX --version 2> /dev/null | head -1`
210
KEA_CXXFLAGS="$KEA_CXXFLAGS -Qunused-arguments"
211 212
fi

213
# gcc/clang specific settings:
214
if test "X$GXX" = "Xyes"; then
215
CXX_VERSION=`$CXX --version 2> /dev/null | head -1`
216
KEA_CXXFLAGS="$KEA_CXXFLAGS -Wall -Wextra -Wnon-virtual-dtor -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare"
217 218 219
# gcc 4.4 would emit warnings about breaking strict aliasing rules.
# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41874
CXX_DUMP_VERSION=`$CXX -dumpversion | cut -f1-2 -d.`
220
if expr "$CXX_DUMP_VERSION" \< "4.5" > /dev/null; then
221 222 223
       WARNING_GCC_44_STRICT_ALIASING_CFLAG="-fno-strict-aliasing"
fi
AC_SUBST(WARNING_GCC_44_STRICT_ALIASING_CFLAG)
Francis Dupont's avatar
Francis Dupont committed
224
CPPP="$CPP"
225 226 227 228
# gcc 5 preprocessor requires -P for checking its output
if test "$CXX_DUMP_VERSION" \> "5"; then
       CPPP="$CPP -P"
fi
229

230 231
case "$host" in
*-solaris*)
232 233 234 235
        MULTITHREADING_FLAG=-pthreads
        # In Solaris, IN6ADDR_ANY_INIT and IN6ADDR_LOOPBACK_INIT need -Wno-missing-braces
        KEA_CXXFLAGS="$KEA_CXXFLAGS -Wno-missing-braces"
        ;;
236
*-apple-darwin*)
237 238
        MULTITHREADING_FLAG=
        ;;
239
*)
240 241
        MULTITHREADING_FLAG=-pthread
        ;;
242
esac
243
KEA_CXXFLAGS="$KEA_CXXFLAGS $MULTITHREADING_FLAG"
244

245 246 247
# Disable -Werror by default. Only use it if specifically enabled.
# The usage of this flag is:
#
248 249 250 251 252
# No flag:            -Werror is disabled
# --with-werror:      -Werror is enabled
# --with-werror=yes:  -Werror is enabled
# --with-werror=no:   -Werror is disabled
# --with-werror=value -Werror is enabled and "value" is included in the compiler flags
253 254 255 256
#
# In the last case, "value" may be one or more compiler flags, e.g.

# --with-werror=-Wundef
257
# --with-werror='-Wundef -Wconversion'
258

259
werror_extras=
260
AC_ARG_WITH(werror,
261
    AC_HELP_STRING([--with-werror], [Compile using -Werror (default=no)]),
262 263 264 265
    [
     case "${withval}" in
         yes) with_werror=1 ;;
         no)  with_werror=0 ;;
266
         -*)  with_werror=1; werror_extras=${withval} ;;
267
         *)   AC_MSG_ERROR(bad value ${withval} for --with-werror) ;;
268
     esac],
269
     [with_werror=0])
270 271 272 273 274 275 276 277

werror_ok=0

# Certain versions of gcc (g++) have a bug that incorrectly warns about
# the use of anonymous name spaces even if they're closed in a single
# translation unit.  For these versions we have to disable -Werror.
if test $with_werror = 1; then
   CXXFLAGS_SAVED="$CXXFLAGS"
278
   CXXFLAGS="$CXXFLAGS $KEA_CXXFLAGS -Werror"
279
   AC_MSG_CHECKING(for in-TU anonymous namespace breakage)
280 281 282 283
   # We use struct, not class, here, because some compilers complain about
   # "unused private members", causing a false positive.
   AC_TRY_COMPILE([namespace { struct Foo {}; }
   namespace isc {struct Bar {Foo foo_;};} ],,
284 285 286 287
        [AC_MSG_RESULT(no)
         werror_ok=1
         KEA_CXXFLAGS="$KEA_CXXFLAGS -Werror"],
        [AC_MSG_RESULT(yes)])
288 289 290
   CXXFLAGS="$CXXFLAGS_SAVED"
fi

291 292 293 294 295 296 297
# Added flags after -Werror

# Some versions of GCC warn about some versions of Boost regarding
# missing initializer for members in its posix_time.
# https://svn.boost.org/trac/boost/ticket/3477
# But older GCC compilers don't have the flag.
KEA_CXX_TRY_FLAG([-Wno-missing-field-initializers],
298
        [KEA_CXXFLAGS="$KEA_CXXFLAGS -Wno-missing-field-initializers"])
299 300

if test "X$CLANGPP" = "Xyes"; then
301 302 303 304
        # This is to workaround unused variables tcout and tcerr in
        # log4cplus's streams.h and unused parameters from some of the
        # Boost headers.
        KEA_CXXFLAGS="$KEA_CXXFLAGS -Wno-unused-variable -Wno-unused-parameter"
305 306 307 308 309
fi

# Add the extras at the very last
# Note it can be used to re-enable a (fatal) warning
for extra in $werror_extras; do
310 311 312
        KEA_CXX_TRY_FLAG([$extra],
                [KEA_CXXFLAGS="$KEA_CXXFLAGS $extra"],
                [AC_MSG_ERROR([$CXX does not support $extra"])])
313 314
done

315
fi                              dnl GXX = yes
316

JINMEI Tatuya's avatar
JINMEI Tatuya committed
317 318 319 320 321 322 323
# allow building programs with static link.  we need to make it selective
# because loadable modules cannot be statically linked.
AC_ARG_ENABLE([static-link],
AC_HELP_STRING([--enable-static-link],
  [build programs with static link [[default=no]]]),
  [enable_static_link=yes], [enable_static_link=no])
AM_CONDITIONAL(USE_STATIC_LINK, test $enable_static_link = yes)
324
AM_COND_IF([USE_STATIC_LINK], [AC_DEFINE([USE_STATIC_LINK], [1], [Was Kea statically linked?])])
JINMEI Tatuya's avatar
JINMEI Tatuya committed
325

JINMEI Tatuya's avatar
JINMEI Tatuya committed
326 327
# Check validity about some libtool options
if test $enable_static_link = yes -a $enable_static = no; then
328
        AC_MSG_ERROR([--enable-static-link requires --enable-static])
JINMEI Tatuya's avatar
JINMEI Tatuya committed
329
fi
330
if test $enable_static_link = no -a $enable_shared = no; then
331
        AC_MSG_ERROR([--disable-static-link requires --enable-shared])
JINMEI Tatuya's avatar
JINMEI Tatuya committed
332 333
fi

334
# OS dependent configuration
335
kea_undefined_pthread_behavior=no
336

337
case "$host" in
338
*-solaris*)
339 340 341 342 343 344 345 346 347 348
        # Solaris requires special definitions to get some standard libraries
        # (e.g. getopt(3)) available with common used header files.
        CPPFLAGS="$CPPFLAGS -D_XPG4_2 -D__EXTENSIONS__"
        # "now" binding is necessary to prevent deadlocks in C++ static initialization code
        LDFLAGS="$LDFLAGS -z now"
        # Destroying locked mutexes, condition variables being waited
        # on, etc. are undefined behavior on Solaris, so we set it as
        # such here.
        kea_undefined_pthread_behavior=yes
        ;;
349
*-apple-darwin*)
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368
        # Starting with OSX 10.7 (Lion) we must choose which IPv6 API to use
        # (RFC2292 or RFC3542).
        CPPFLAGS="$CPPFLAGS -D__APPLE_USE_RFC_3542"

        # In OS X 10.9 (and possibly any future versions?) pthread_cond_destroy
        # doesn't work as documented, which makes some of unit tests fail.
        AC_MSG_CHECKING([OS X versions where destroying locked locks do not fail])
        AC_TRY_COMPILE(
        [#include <Availability.h>],
        [#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
         #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
         #error " OS X >= 10.9"
         #endif
         #endif
         return 1;],
        [AC_MSG_RESULT([OS X < 10.9])],
        [AC_MSG_RESULT([OS X >= 10.9])
         kea_undefined_pthread_behavior=yes])
        ;;
369
*-freebsd*)
370 371 372 373 374 375 376 377 378 379 380
        # On FreeBSD10.1 pthread_cond_destroy doesn't work as documented, which
        # causes the CondVarTest.destroyWhileWait test to fail. According to the
        # pthread_cond_destroy documentation for FreeBSD, this function should
        # return EBUSY error when there is a thread waiting for the conditional
        # variable, whereas this function returned success code. We treat it here
        # as an undefined behavior. Also note that this issue was only visible
        # when gtest 1.7 was in use, because the previous versions of gtest
        # didn't seem to have support for the death tests on FreeBSD. As a
        # result, the test was not executed and the error didn't occur.
        kea_undefined_pthread_behavior=yes
        ;;
381
esac
382
if [ test $kea_undefined_pthread_behavior = "yes" ]; then
383 384
   AC_DEFINE([HAS_UNDEFINED_PTHREAD_BEHAVIOR], [1], [Does this platform have some undefined pthreads behavior?])
fi
385

386 387 388 389 390 391 392 393 394 395
# Our experiments have shown Solaris 10 has broken support for the
# IPV6_USE_MIN_MTU socket option for getsockopt(); it doesn't return the value
# previously set via setsockopt().  We know it doesn't happen on one instance
# on Solaris 11, but we don't know whether it happens for any Solaris 10
# implementations or for earlier versions of Solaris.  In any case, at the
# moment this matters for only one unittest case, so we'll simply disable
# the affected test using the following definition with the specific hardcoding
# of that version of Solaris.
case "$host" in
*-solaris2.10)
396 397 398
        AC_DEFINE([HAVE_BROKEN_GET_IPV6_USE_MIN_MTU], [1],
        [Define to 1 if getsockopt(IPV6_USE_MIN_MTU) does not work])
        ;;
399 400
esac

401 402 403 404 405 406 407 408 409

# Kea-shell is written in python. It can work with python 2.7 or any 3.x.
# It may likely work with earlier versions, but 2.7 was the oldest one we tested
# it with. We require python only if kea-shell was enabled. It is disabled
# by default to not introduce hard dependency on python.
AC_ARG_ENABLE(shell, [AC_HELP_STRING([--enable-shell],
  [enable kea-shell, a text management client for Control Agent [default=no]])],
  enable_shell=$enableval, enable_shell=no)

Francis Dupont's avatar
Francis Dupont committed
410
PKGPYTHONDIR=
411 412 413
m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
 [python3 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 dnl
  python3.3 python3.2 python3.1 python3.0 python python2 python2.7])
414 415
if test "x$enable_shell" != xno ; then
# If kea-shell is enabled, we really need python. 2.7 or anything newer will do.
Tomek Mrugalski's avatar
Tomek Mrugalski committed
416
# We try to find 3.x first. If not found, we can do with 2.7.
417
  AM_PATH_PYTHON([2.7])
Francis Dupont's avatar
Francis Dupont committed
418
  # pkgpythondir needs to be expanded
419 420 421 422
  saved_prefix="$prefix"
  if test "$prefix" = "NONE"; then
    prefix=$ac_default_prefix
  fi
Francis Dupont's avatar
Francis Dupont committed
423 424 425 426 427 428
  PKGPYTHONDIR="$pkgpythondir"
  OLD=
  while test "x$OLD" != "x$PKGPYTHONDIR"; do
    OLD="$PKGPYTHONDIR"
    eval PKGPYTHONDIR="\"$OLD\""
  done
429
  prefix="$saved_prefix"
430
else
431
  PYTHON=no
432
fi
433

434 435
# Export to makefiles the info whether we have shell enabled or not
AM_CONDITIONAL(KEA_SHELL, test x$enable_shell != xno)
Francis Dupont's avatar
Francis Dupont committed
436
AC_SUBST(PKGPYTHONDIR)
437

438
# produce PIC unless we disable shared libraries. need this for python bindings.
439
if test $enable_shared != "no" -a "X$GXX" = "Xyes"; then
440
   KEA_CXXFLAGS="$KEA_CXXFLAGS -fPIC"
441 442
fi

443
# Look for glib static libs if they're trying to do static builds
444
if test $enable_static_link != "no"; then
445 446 447 448
   CXX_SAVED=$CXX
   CXX="$CXX -static"

   AC_LINK_IFELSE(
449
     [AC_LANG_PROGRAM([#include <math.h>],[(void)sqrt(-1.0);])],
450 451
     [AC_MSG_RESULT([checking for static glib libraries... yes])],
     [AC_MSG_RESULT([checking for static glib libraries... no])
452
      AC_MSG_ERROR([Building with --enable-static-link does not work. You appear to be missing glib static libraries. Check config.log for details.])])
453 454 455

   CXX=$CXX_SAVED
fi
456

457
AC_SUBST(KEA_CXXFLAGS)
458

459 460
# Checks for libraries.

461 462
AC_SEARCH_LIBS(inet_pton, [nsl])
AC_SEARCH_LIBS(recvfrom, [socket])
463
AC_SEARCH_LIBS(nanosleep, [rt])
464
AC_SEARCH_LIBS(dlsym, [dl])
465

466 467 468 469 470 471
# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_TYPE_SIZE_T

472

473 474
# Detect OS type (it may be used to do OS-specific things, e.g.
# interface detection in DHCP)
475
AC_MSG_CHECKING(OS type)
476
BSD_TYPE="notaBSD"
477 478 479
case $host in
    *-linux*)
      AC_DEFINE([OS_LINUX], [1], [Running on Linux?])
480
      OS_TYPE="Linux"
481 482
      CPPFLAGS="$CPPFLAGS -DOS_LINUX"
      ;;
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
    *-apple-darwin*)
      AC_DEFINE([OS_BSD], [1], [Running on BSD?])
      AC_DEFINE([OS_OSX], [1], [Running on OSX?])
      OS_TYPE="BSD"
      BSD_TYPE="OSX"
      CPPFLAGS="$CPPFLAGS -DOS_BSD"
      ;;
    *-freebsd*)
      AC_DEFINE([OS_BSD], [1], [Running on BSD?])
      AC_DEFINE([OS_FREEBSD], [1], [Running on FreeBSD?])
      OS_TYPE="BSD"
      BSD_TYPE="FreeBSD"
      CPPFLAGS="$CPPFLAGS -DOS_BSD"
      ;;
    *-netbsd*)
      AC_DEFINE([OS_BSD], [1], [Running on BSD?])
      AC_DEFINE([OS_NETBSD], [1], [Running on NetBSD?])
      OS_TYPE="BSD"
      BSD_TYPE="NetBSD"
      CPPFLAGS="$CPPFLAGS -DOS_BSD"
      ;;
    *-openbsd*)
      AC_DEFINE([OS_BSD], [1], [Running on BSD?])
      AC_DEFINE([OS_OPENBSD], [1], [Running on OpenBSD?])
507
      OS_TYPE="BSD"
508
      BSD_TYPE="OpenBSD"
509 510
      CPPFLAGS="$CPPFLAGS -DOS_BSD"
      ;;
511 512
    *-solaris*)
      AC_DEFINE([OS_SOLARIS], [1], [Running on Solaris?])
513
      OS_TYPE="Solaris"
514
      CPPFLAGS="$CPPFLAGS -DOS_SUN"
515 516 517
      ;;
    *)
      OS_TYPE="Unknown"
518 519
      # $host_os is more user friendly than full $host
      AC_MSG_WARN("Unsupported OS: $host_os")
520 521 522
      ;;
esac
AC_MSG_RESULT($OS_TYPE)
523 524

AM_CONDITIONAL(OS_LINUX, test $OS_TYPE = Linux)
525 526
AM_CONDITIONAL(OS_BSD, test $OS_TYPE = BSD)
AM_CONDITIONAL(OS_SOLARIS, test $OS_TYPE = Solaris)
527 528 529 530
AM_CONDITIONAL(OS_OSX, test $BSD_TYPE = OSX)
AM_CONDITIONAL(OS_FREEBSD, test $BSD_TYPE = FreeBSD)
AM_CONDITIONAL(OS_NETBSD, test $BSD_TYPE = NetBSD)
AM_CONDITIONAL(OS_OPENBSD, test $BSD_TYPE = OpenBSD)
531 532


533 534 535 536 537 538
AC_MSG_CHECKING(for sa_len in struct sockaddr)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>],
[struct sockaddr sa; sa.sa_len = 0; return (0);],
        [AC_MSG_RESULT(yes)
539
        AC_DEFINE(HAVE_SA_LEN, 1, [Define to 1 if sockaddr has a sa_len member, and corresponding sin_len and sun_len])],
540 541
        AC_MSG_RESULT(no))

542
enable_gtest="no"
543
GTEST_INCLUDES=
544 545 546

AC_ARG_WITH([gtest-source],
            [AS_HELP_STRING([--with-gtest-source=PATH],
547 548
                            [location of the Googletest source])],
            [enable_gtest="yes" ; GTEST_SOURCE="$withval"])
549 550

AC_ARG_WITH([gtest],
551 552 553
            [AS_HELP_STRING([--with-gtest=PATH],
                            [specify a path to gtest header files (PATH/include) and library (PATH/lib)])],
        [gtest_path="$withval"; enable_gtest="yes"], [gtest_path="no"])
554

555
AC_ARG_WITH(lcov,
556
[  --with-lcov[=PROGRAM]         enable gtest and coverage target using the specified lcov], lcov="$withval", lcov="no")
557 558 559

USE_LCOV="no"
if test "$lcov" != "no"; then
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587
        # force gtest if not set
        if test "$enable_gtest" = "no"; then
#               AC_MSG_ERROR("lcov needs gtest for test coverage report")
                AC_MSG_NOTICE([gtest support is now enabled, because used by coverage tests])
                enable_gtest="yes"
        fi
        if test "$lcov" != "yes"; then
                LCOV=$lcov
        else
                AC_PATH_PROG([LCOV], [lcov])
        fi
        if test -x "${LCOV}"; then
                USE_LCOV="yes"
        else
                AC_MSG_ERROR([Cannot find lcov.])
        fi
        # is genhtml always in the same directory?
        GENHTML=`echo "$LCOV" | ${SED} s/lcov$/genhtml/`
        if test ! -x $GENHTML; then
                AC_MSG_ERROR([genhtml not found, needed for lcov])
        fi
        # GCC specific?
        CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
        LIBS=" $LIBS -lgcov"
        AC_SUBST(CPPFLAGS)
        AC_SUBST(LIBS)
        AC_SUBST(LCOV)
        AC_SUBST(GENHTML)
588 589 590
fi
AC_SUBST(USE_LCOV)

Andrei Pavel's avatar
Andrei Pavel committed
591 592 593 594 595 596 597 598 599 600 601 602 603
enable_benchmark="no"
BENCHMARK_INCLUDES=

AC_ARG_WITH([benchmark-source],
            [AS_HELP_STRING([--with-benchmark-source=PATH],
                            [location of the benchmark source])],
            [enable_benchmark="yes" ; BENCHMARK_SOURCE="$withval"])

AC_ARG_WITH([benchmark],
            [AS_HELP_STRING([--with-benchmark=PATH],
                            [specify a path to benchmark header files (PATH/include) and library (PATH/lib)])],
        [benchmark_path="$withval"; enable_benchmark="yes"], [benchmark_path="no"])

604 605 606 607
# Simplified, non-caching AC_CHECK_PROG
# Searches $PATH for the existence of argument 2,
# and sets the full path to the variable in argument 1.
# if not found, and a third argument is given, the value
608 609
# is set to that. If not, the value is untouched.
# Does not take absolute paths into account at this point,
610 611 612 613 614
# and also works for single files only (arguments are not
# stripped like in AC_CHECK_PROG)
AC_DEFUN([ACX_CHECK_PROG_NONCACHE], [
    RESULT=""
    IFS_SAVED="$IFS"
615
    IFS=${PATH_SEPARATOR}
616 617 618 619 620 621
    for cur_path in ${PATH} ; do
      if test -e "${cur_path}/$2" ; then
          RESULT="${cur_path}/$2"
      fi
    done
    if test "$RESULT" = "" ; then
622
        :
623 624 625 626 627 628 629
        m4_ifvaln([$3], [$1=$3])
    else
        $1=$RESULT
    fi
    IFS="$IFS_SAVED"
])

630 631 632 633 634 635 636
# Avoid checking Botan if OpenSSL is wanted
AC_ARG_WITH([openssl],
            [AS_HELP_STRING([--with-openssl[[=PATH]]], [Enables OpenSSL,
            location can be specified optionally])],
            [use_openssl="$withval"],
            [use_openssl="auto"])

637
# Botan helper test function
638 639
# Tries to compile a botan program, given the output of the given
# config tool
640 641 642 643 644 645 646 647
# Arguments:
# - name of tool (checked for path), must support --libs and --cflags
# - fixed argument(s) for tool
# - action if successful
AC_DEFUN([ACX_TRY_BOTAN_TOOL], [
    TOOL=$1
    TOOL_ARG=$2
    BOTAN_TOOL=""
648 649
    ACX_CHECK_PROG_NONCACHE([BOTAN_TOOL], [${TOOL}])
    AC_MSG_CHECKING([usability of ${TOOL} ${TOOL_ARG}])
650 651
    if test "$BOTAN_TOOL" != "" ; then
        if test -x ${BOTAN_TOOL}; then
652
            CRYPTO_LIBS=`$BOTAN_TOOL $TOOL_ARG --libs`
653
            LIBS_SAVED=${LIBS}
654 655
            LIBS="$LIBS $CRYPTO_LIBS"
            CRYPTO_INCLUDES=`$BOTAN_TOOL $TOOL_ARG --cflags`
656
            CPPFLAGS_SAVED=${CPPFLAGS}
657
            CPPFLAGS="$CRYPTO_INCLUDES $CPPFLAGS"
658 659 660
            #AC_MSG_RESULT([found])
            AC_LINK_IFELSE(
                [AC_LANG_PROGRAM([#include <botan/botan.h>
661
                                  #include <botan/init.h>
662 663 664 665 666 667 668 669 670
                                  #include <botan/hash.h>
                                 ],
                                 [using namespace Botan;
                                  LibraryInitializer::initialize();
                                  HashFunction *h = get_hash("MD5");
                                 ])],
                [ AC_MSG_RESULT([ok])
                  $3
                ],
671
                [ AC_MSG_RESULT([not usable]) ]
672 673 674 675 676 677 678 679 680 681 682 683 684 685
            )
            LIBS=${LIBS_SAVED}
            CPPFLAGS=${CPPFLAGS_SAVED}
        else
            AC_MSG_RESULT([not executable])
        fi
    else
        AC_MSG_RESULT([not found])
    fi
    BOTAN_TOOL=""
    AC_SUBST(BOTAN_TOOL)
    ]
)

Jelte Jansen's avatar
Jelte Jansen committed
686
# Check for Botan
687 688 689 690 691 692 693 694 695 696 697 698 699 700 701
#
# Unless --with-botan-config is given, we first try to find these config
# scripts ourselves. Unfortunately, on some systems, these scripts do not
# provide the correct implementation, so for each script found, we try
# a compilation test (ACX_TRY_BOTAN_TOOL). If none are found, or none of
# them work, we see if pkg-config is available. If so, we try the several
# potential pkg-config .pc files. Again, on some systems, these can return
# incorrect information as well, so the try-compile test is repeated for
# each.
#
# If a working config script or pkgconfig file is found, we then munge its
# output for use in our Makefiles, and to make sure it works, another header
# and compilation test is done (this should also check whether we can compile
# against botan should neither -config scripts nor pkgconfig data exist).
#
702
botan_config="yes"
703 704 705
if test "${use_openssl}" != "auto" -a "${use_openssl}" != "no" ; then
   botan_config="no"
fi
706 707 708 709
AC_ARG_WITH([botan-config],
  AC_HELP_STRING([--with-botan-config=PATH],
    [specify the path to the botan-config script]),
    [botan_config="$withval"])
710
distcheck_botan="--with-botan-config=$botan_config"
711
if test "${botan_config}" = "no" ; then
712 713 714 715
    if test "${use_openssl}" = "no" ; then
       AC_MSG_ERROR([Need Botan or OpenSSL for libcryptolink])
    fi
elif test "${botan_config}" != "yes" ; then
716 717 718 719 720 721
    if test -x "${botan_config}" ; then
        if test -d "${botan_config}" ; then
            AC_MSG_ERROR([${botan_config} is a directory])
        else
            BOTAN_CONFIG="${botan_config}"
        fi
Jelte Jansen's avatar
Jelte Jansen committed
722
    else
723
        AC_MSG_ERROR([--with-botan-config should point to a botan-config program and not a directory (${botan_config})])
Jelte Jansen's avatar
Jelte Jansen committed
724 725
    fi
else
726
    BOTAN_CONFIG=""
727
    # first try several possible names of the config script
728 729
    # (botan-config-1.8 is there just in case, the official name change
    # came later)
730 731
    BOTAN_CONFIG_VERSIONS="botan-config-1.10 botan-config-1.9 botan-config-1.8 botan-config"
    for botan_config in $BOTAN_CONFIG_VERSIONS; do
732
        ACX_TRY_BOTAN_TOOL([$botan_config],,
733
                           [ BOTAN_CONFIG="$botan_config"  ]
734 735
                          )
        if test "$BOTAN_CONFIG" != "" ; then
736 737 738
            break
        fi
    done
739
    if test "$BOTAN_CONFIG" = "" ; then
740 741 742 743 744
        AC_PATH_PROG([PKG_CONFIG], [pkg-config])
        if test "$PKG_CONFIG" != "" ; then
            # Ok so no script found, see if pkg-config knows of it.
            # Unfortunately, the botan.pc files also have their minor version
            # in their name, so we need to try them one by one
745
            BOTAN_VERSIONS="botan-2 botan-1.11 botan-1.10 botan-1.9 botan-1.8"
746
            for version in $BOTAN_VERSIONS; do
747
                ACX_TRY_BOTAN_TOOL([pkg-config], ["$version --silence-errors"],
748
                                   [ BOTAN_CONFIG="$PKG_CONFIG $version" ]
749 750
                                  )
            if test "$BOTAN_CONFIG" != "" ; then
751 752
                break
            fi
753 754
            done
        fi
755
    fi
Jelte Jansen's avatar
Jelte Jansen committed
756
fi
757

758 759
if test "x${BOTAN_CONFIG}" != "x"
then
760 761
    CRYPTO_LIBS=`${BOTAN_CONFIG} --libs`
    CRYPTO_INCLUDES=`${BOTAN_CONFIG} --cflags`
762 763 764 765

    # We expect botan-config --libs to contain -L<path_to_libbotan>, but
    # this is not always the case.  As a heuristics workaround we add
    # -L`botan-config --prefix/lib` in this case (if not present already).
766
    # Same for CRYPTO_INCLUDES (but using include instead of lib) below.
767
    if [ ${BOTAN_CONFIG} --prefix >/dev/null 2>&1 ] ; then
768 769 770 771
        echo ${CRYPTO_LIBS} | grep -- -L > /dev/null || \
            CRYPTO_LIBS="-L`${BOTAN_CONFIG} --prefix`/lib ${CRYPTO_LIBS}"
        echo ${CRYPTO_INCLUDES} | grep -- -I > /dev/null || \
            CRYPTO_INCLUDES="-I`${BOTAN_CONFIG} --prefix`/include ${CRYPTO_INCLUDES}"
772
    fi
Jelte Jansen's avatar
Jelte Jansen committed
773
fi
774

775 776 777 778 779
if test "x${CRYPTO_LIBS}" != "x"
then
   dnl Determine the Botan version
   AC_MSG_CHECKING([Botan version])
   cat > conftest.cpp << EOF
780 781 782 783
#include <botan/version.h>
AUTOCONF_BOTAN_VERSION=BOTAN_VERSION_MAJOR . BOTAN_VERSION_MINOR . BOTAN_VERSION_PATCH
EOF

784
   CRYPTO_VERSION=`$CPPP $CPPFLAGS $CRYPTO_INCLUDES conftest.cpp | grep '^AUTOCONF_BOTAN_VERSION=' | $SED -e 's/^AUTOCONF_BOTAN_VERSION=//' -e 's/[[ 	]]//g' -e 's/"//g' 2> /dev/null`
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832
   if test -z "$CRYPTO_VERSION"; then
      CRYPTO_VERSION="unknown"
   fi
   $RM -f conftest.cpp
   AC_MSG_RESULT([$CRYPTO_VERSION])

   # botan-config script (and the way we call pkg-config) returns -L and -l
   # as one string, but we need them in separate values
   CRYPTO_LDFLAGS=
   for flag in ${CRYPTO_LIBS}; do
       CRYPTO_LDFLAGS="${CRYPTO_LDFLAGS} `echo $flag | ${SED} -ne '/^\(\-L\)/p'`"
       CRYPTO_LIBS="${CRYPTO_LIBS} `echo $flag | ${SED} -ne '/^\(\-l\)/p'`"
   done

   # See crypto_rpath for some info on why we do this
   if test "x$ISC_RPATH_FLAG" != "x"; then
       CRYPTO_RPATH=
       for flag in ${CRYPTO_LIBS}; do
               CRYPTO_RPATH="${CRYPTO_RPATH} `echo $flag | ${SED} -ne "s/^\(\-L\)/${ISC_RPATH_FLAG}/p"`"
       done
   # According to the libtool manual, it should be sufficient if we
   # specify the "-R libdir" in our wrapper library of botan (no other
   # programs will need libbotan directly); "libdir" should be added to
   # the program's binary image.  But we've seen in our build environments
   # that (some versions of?) libtool doesn't propagate -R as documented,
   # and it caused a linker error at run time.  To work around this, we
   # also add the rpath to the global LDFLAGS.
       LDFLAGS="$CRYPTO_RPATH $LDFLAGS"
   fi

   # Even though chances are high we already performed a real compilation check
   # in the search for the right (pkg)config data, we try again here, to
   # be sure.
   CPPFLAGS_SAVED=$CPPFLAGS
   CPPFLAGS="$CRYPTO_INCLUDES $CPPFLAGS"
   LIBS_SAVED="$LIBS"
   LIBS="$LIBS $CRYPTO_LIBS"

   # ac_header_preproc is an autoconf symbol (undocumented but stable) that
   # is set if the pre-processor phase passes. Thus by adding a custom
   # failure handler we can detect the difference between a header not existing
   # (or not even passing the pre-processor phase) and a header file resulting
   # in compilation failures.
   AC_CHECK_HEADERS([botan/botan.h],,[
        CRYPTO_INCLUDES=""
        CRYPTO_LIBS=""
        CRYPTO_LDFLAGS=""
        CRYPTO_RPATH=""
833 834
        if test "x$ac_header_preproc" = "xyes"; then
                AC_MSG_RESULT([
835 836 837 838 839
botan/botan.h was found but is unusable. The most common cause of this problem
is attempting to use an updated C++ compiler with older C++ libraries, such as
the version of Botan that comes with your distribution. If you have updated
your C++ compiler we highly recommend that you use support libraries such as
Boost and Botan that were compiled with the same compiler version.])
840 841 842
        else
                AC_MSG_RESULT([Missing required header files.])
        fi]
843 844 845 846 847 848 849 850 851 852 853 854
   )
   CPPFLAGS=$CPPFLAGS_SAVED
   LIBS=$LIBS_SAVED
fi

if test "x${CRYPTO_LIBS}" != "x"
then
   CPPFLAGS_SAVED=$CPPFLAGS
   CPPFLAGS="$CRYPTO_INCLUDES $CPPFLAGS"
   LIBS_SAVED="$LIBS"
   LIBS="$LIBS $CRYPTO_LIBS"
   AC_LINK_IFELSE(
855
        [AC_LANG_PROGRAM([#include <botan/botan.h>
856
                          #include <botan/init.h>
857 858
                          #include <botan/hash.h>
                         ],
Jelte Jansen's avatar
Jelte Jansen committed
859 860
                         [using namespace Botan;
                          LibraryInitializer::initialize();
861
                          HashFunction *h = get_hash("MD5");
Jelte Jansen's avatar
Jelte Jansen committed
862 863 864
                         ])],
        [AC_MSG_RESULT([checking for Botan library... yes])],
        [AC_MSG_RESULT([checking for Botan library... no])
865 866 867 868 869
         CRYPTO_INCLUDES=""
         CRYPTO_LIBS=""
         CRYPTO_LDFLAGS=""
         CRYPTO_RPATH=""
         AC_MSG_RESULT([Needs Botan library 1.8 or higher. On some systems,
870
         the botan package has a few missing dependencies (libbz2 and
871
         libgmp), if libbotan has been installed and you see this message,
872 873
         try upgrading to a higher version of botan or installing libbz2
         and libgmp.])]
874 875 876 877 878 879 880 881 882 883 884
   )
   CPPFLAGS=$CPPFLAGS_SAVED
   LIBS=$LIBS_SAVED
fi

if test "x${CRYPTO_LIBS}" != "x"
then
   CRYPTO_NAME="Botan"
   DISABLED_CRYPTO="OpenSSL"
   CRYPTO_PACKAGE="botan-1.8"
   CRYPTO_CFLAGS=""
885
   DISTCHECK_CRYPTO_CONFIGURE_FLAG="$distcheck_botan"
886 887 888 889
   AC_DEFINE_UNQUOTED([WITH_BOTAN], [], [Compile with Botan crypto])
else
   CRYPTO_NAME="OpenSSL"
   DISABLED_CRYPTO="Botan"
890
   CRYPTO_PACKAGE="openssl-1.0.2"
891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912
   AC_DEFINE_UNQUOTED([WITH_OPENSSL], [], [Compile with OpenSSL crypto])
   AC_MSG_CHECKING(for OpenSSL library)
   # from bind9

   if test "${use_openssl}" = "auto" ; then
      use_openssl="yes"
   fi
   if test "${use_openssl}" = "yes" ; then
      for d in /usr /usr/local /usr/local/ssl /usr/pkg /usr/sfw; do
          if test -f $d/include/openssl/opensslv.h; then
             use_openssl=$d; break
          fi
      done
   fi
   if test "${use_openssl}" = "yes" ; then
      AC_MSG_ERROR([OpenSSL auto detection failed])
   fi
   if ! test -f "${use_openssl}"/include/openssl/opensslv.h ; then
      AC_MSG_ERROR([OpenSSL not found at ${use_openssl}])
   fi
   AC_MSG_RESULT(yes)
   if test "${use_openssl}" = "/usr" ; then
Francis Dupont's avatar
Francis Dupont committed
913
      CRYPTO_CFLAGS=""
914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
      CRYPTO_INCLUDES=""
      CRYPTO_LIBS="-lcrypto"
      DISTCHECK_CRYPTO_CONFIGURE_FLAG="--with-openssl"
   else
      CRYPTO_CFLAGS=""
      CRYPTO_INCLUDES="-I${use_openssl}/include"
      DISTCHECK_CRYPTO_CONFIGURE_FLAG="--with-openssl=${use_openssl}"
      case $host in
          *-solaris*)
              CRYPTO_LIBS="-L${use_openssl}/lib -R${use_openssl}/lib -lcrypto"
              ;;
          *-hp-hpux*)
              CRYPTO_LIBS="-L${use_openssl}/lib -Wl,+b: -lcrypto"
              ;;
          *-apple-darwin*)
              if test -f "${use_openssl}/lib/libcrypto.dylib" ; then
                 CRYPTO_LIBS="-L${use_openssl}/lib -lcrypto"
              else
                 CRYPTO_LIBS="${use_openssl}/lib/libcrypto.a"
              fi
              ;;
          *)
              CRYPTO_LIBS="-L${use_openssl}/lib -lcrypto"
              ;;
      esac
    fi
    dnl Determine the OpenSSL version
Francis Dupont's avatar
Francis Dupont committed
941 942
    # Officially we support >= 1.0.1, 0.9.8 should fail the HMAC API,
    # 1.0.0 could work but is not recommended.
943 944 945 946 947 948
    AC_MSG_CHECKING([OpenSSL version])
    cat > conftest.cpp << EOF
#include <openssl/opensslv.h>
AUTOCONF_OPENSSL_VERSION=OPENSSL_VERSION_TEXT
EOF

949
    CRYPTO_VERSION=`$CPPP $CPPFLAGS $CRYPTO_INCLUDES conftest.cpp | grep '^AUTOCONF_OPENSSL_VERSION=' | $SED -e 's/^AUTOCONF_OPENSSL_VERSION=//' -e 's/"//g' 2> /dev/null`
950 951 952 953 954 955 956 957
    if test -z "$CRYPTO_VERSION" ; then
       CRYPTO_VERSION="unknown"
    fi
    $RM -f conftest.cpp
    AC_MSG_RESULT([$CRYPTO_VERSION])
    #CRYPTO_LDFLAGS="-ldl"
    CRYPTO_LDFLAGS=""
    CRYPTO_RPATH=""
Josh Soref's avatar
Josh Soref committed
958
    dnl Check availability of SHA-2
959 960 961 962 963 964 965 966 967 968 969 970 971 972
    AC_MSG_CHECKING([support of SHA-2])
    LIBS_SAVED=${LIBS}
    LIBS="$LIBS $CRYPTO_LIBS"
    CPPFLAGS_SAVED=${CPPFLAGS}
    CPPFLAGS="$CRYPTO_INCLUDES $CPPFLAGS"
    AC_LINK_IFELSE(
        [AC_LANG_PROGRAM([#include <openssl/evp.h>],
                         [const EVP_MD* h224 = EVP_sha224();
                          const EVP_MD* h256 = EVP_sha256();
                          const EVP_MD* h384 = EVP_sha384();
                          const EVP_MD* h512 = EVP_sha512();
                          ])],
        [AC_MSG_RESULT([yes])],
        [AC_MSG_ERROR([missing EVP entry for SHA-2])])
973 974 975
    dnl Check HMAC API
    AC_MSG_CHECKING([HMAC functions returning ints])
    AC_LINK_IFELSE(
976 977 978 979
         [AC_LANG_PROGRAM([#include <openssl/opensslv.h>
                           #include <openssl/hmac.h>],
                          [#if OPENSSL_VERSION_NUMBER < 0x10100000L
                           HMAC_CTX ctx, tmp;
980 981 982 983
                           int n = HMAC_Init(&ctx, NULL, 0, NULL);
                           n += HMAC_Update(&ctx, NULL, 0);
                           n += HMAC_CTX_copy(&tmp, &ctx);
                           n += HMAC_Final(&tmp, NULL, NULL);
984
                           #endif
985 986
                           ])],
         [AC_MSG_RESULT([yes])],
Francis Dupont's avatar
Francis Dupont committed
987
         [AC_MSG_ERROR([HMAC functions return void: please use OpenSSL version 1.0.1 or later])])
988 989
    LIBS=${LIBS_SAVED}
    CPPFLAGS=${CPPFLAGS_SAVED}
990 991 992 993 994 995 996 997 998 999 1000
fi

AM_CONDITIONAL(HAVE_BOTAN, test "$CRYPTO_NAME" = "Botan")
AM_CONDITIONAL(HAVE_OPENSSL, test "$CRYPTO_NAME" = "OpenSSL")
AC_SUBST(CRYPTO_INCLUDES)
AC_SUBST(CRYPTO_CFLAGS)
AC_SUBST(CRYPTO_LIBS)
AC_SUBST(CRYPTO_LDFLAGS)
AC_SUBST(CRYPTO_PACKAGE)
AC_SUBST(CRYPTO_RPATH)
AC_SUBST(DISTCHECK_CRYPTO_CONFIGURE_FLAG)
1001 1002

# Check for MySql.  The path to the mysql_config program is given with
1003 1004
# the --with-mysql-config (default to /usr/bin/mysql-config).  By default,
# the software is not built with MySQL support enabled.
1005
mysql_config="no"
1006 1007 1008
AC_ARG_WITH([dhcp-mysql],
  AC_HELP_STRING([--with-dhcp-mysql=PATH],
    [path to the MySQL 'mysql_config' script (MySQL is used for the DHCP database)]),
1009 1010 1011 1012 1013 1014 1015 1016 1017
    [mysql_config="$withval"])

if test "${mysql_config}" = "yes" ; then
    MYSQL_CONFIG="/usr/bin/mysql_config"
elif test "${mysql_config}" != "no" ; then
    MYSQL_CONFIG="${withval}"
fi

if test "$MYSQL_CONFIG" != "" ; then
1018 1019
    if test -d "$MYSQL_CONFIG" -o ! -x "$MYSQL_CONFIG" ; then
        AC_MSG_ERROR([--with-dhcp-mysql should point to a mysql_config program])
1020 1021 1022 1023
    fi

    MYSQL_CPPFLAGS=`$MYSQL_CONFIG --cflags`
    MYSQL_LIBS=`$MYSQL_CONFIG --libs`
1024
    MYSQL_VERSION=`$MYSQL_CONFIG --version`
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036

    AC_SUBST(MYSQL_CPPFLAGS)
    AC_SUBST(MYSQL_LIBS)

    # Check that a simple program using MySQL functions can compile and link.
    CPPFLAGS_SAVED="$CPPFLAGS"
    LIBS_SAVED="$LIBS"

    CPPFLAGS="$MYSQL_CPPFLAGS $CPPFLAGS"
    LIBS="$MYSQL_LIBS $LIBS"

    AC_LINK_IFELSE(
1037
            [AC_LANG_PROGRAM([#include <mysql.h>],
1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052
                             [MYSQL mysql_handle;
                              (void) mysql_init(&mysql_handle);
                             ])],
            [AC_MSG_RESULT([checking for MySQL headers and library... yes])],
            [AC_MSG_RESULT([checking for MySQL headers and library... no])
             AC_MSG_ERROR([Needs MySQL library])]
    )

    CPPFLAGS=$CPPFLAGS_SAVED
    LIBS=$LIBS_SAVED

    # Note that MYSQL is present in the config.h file
    AC_DEFINE([HAVE_MYSQL], [1], [MySQL is present])
fi

1053
# Solaris puts FIONREAD in filio.h
1054
AC_CHECK_HEADERS(sys/filio.h,,,)
1055

1056 1057 1058
# ... and at the shell level, so Makefile.am can take action depending on this.
AM_CONDITIONAL(HAVE_MYSQL, test "$MYSQL_CONFIG" != "")

1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
pg_config="no"
AC_ARG_WITH([dhcp-pgsql],
  AC_HELP_STRING([--with-dhcp-pgsql=PATH],
    [path to the PostgreSQL 'pg_config' script]),
    [pg_config="$withval"])

if test "${pg_config}" = "yes" ; then
    PG_CONFIG="/usr/bin/pg_config"
elif test "${pg_config}" != "no" ; then
    PG_CONFIG="${withval}"
fi

if test "$PG_CONFIG" != "" ; then
    if test -d "$PG_CONFIG" -o ! -x "$PG_CONFIG" ; then
        AC_MSG_ERROR([--with-dhcp-pgsql should point to a pg_config program])
    fi

    PGSQL_CPPFLAGS=`$PG_CONFIG --cppflags`
    PGSQL_INCLUDEDIR=`$PG_CONFIG --includedir`
1078 1079
    PGSQL_INCLUDEDIR_SERVER=`$PG_CONFIG --includedir-server`
    PGSQL_CPPFLAGS="$PGSQL_CPPFLAGS -I$PGSQL_INCLUDEDIR -I$PGSQL_INCLUDEDIR_SERVER"
1080 1081
    PGSQL_LIBS=`$PG_CONFIG --libdir`
    PGSQL_LIBS="-L$PGSQL_LIBS -lpq"
1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102
    PGSQL_VERSION=`$PG_CONFIG --version`

    AC_SUBST(PGSQL_CPPFLAGS)
    AC_SUBST(PGSQL_LIBS)

    # Check that a simple program using PostgreSQL functions can compile and link.
    CPPFLAGS_SAVED="$CPPFLAGS"
    LIBS_SAVED="$LIBS"

    CPPFLAGS="$PGSQL_CPPFLAGS $CPPFLAGS"
    LIBS="$PGSQL_LIBS $LIBS"

    AC_LINK_IFELSE(
            [AC_LANG_PROGRAM([#include <libpq-fe.h>],
                             [PGconn * c = PQconnectdb("dbname = 'postgres'");
                              PQfinish(c);])],
            [AC_MSG_RESULT([checking for PostgreSQL headers and library... yes])],
            [AC_MSG_RESULT([checking for PostgreSQL headers and library... no])
             AC_MSG_ERROR([Needs PostgreSQL library])]
    )

1103
    AC_CHECK_HEADERS([utils/errcodes.h],,
1104
    AC_MSG_ERROR([Missing required header file (errcodes.h) from PostgreSQL server-development package]))
1105

1106 1107 1108 1109 1110 1111 1112 1113 1114
    CPPFLAGS=$CPPFLAGS_SAVED
    LIBS=$LIBS_SAVED

    # Note that PostgreSQL is present in the config.h file
    AC_DEFINE([HAVE_PGSQL], [1], [PostgreSQL is present])
fi

# ... and at the shell level, so Makefile.am can take action depending on this.
AM_CONDITIONAL(HAVE_PGSQL, test "$PG_CONFIG" != "")
Jelte Jansen's avatar
Jelte Jansen committed
1115

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1116 1117 1118 1119 1120 1121 1122
cql_config="no"
AC_ARG_WITH([cql],
  AC_HELP_STRING([--with-cql=PATH],
    [path to the Cassandra CQL 'cql_config' script]),
    [cql_config="$withval"])

if test "${cql_config}" = "yes" ; then
1123
    CQL_CONFIG="/usr/bin/cql_config"
Tomek Mrugalski's avatar
Tomek Mrugalski committed
1124
elif test "${cql_config}" != "no" ; then
Francis Dupont's avatar
Francis Dupont committed
1125
    CQL_CONFIG="${cql_config}"
1126 1127
fi

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1128 1129 1130
if test "$CQL_CONFIG" != "" ; then
    if test -d "$CQL_CONFIG" -o ! -x "$CQL_CONFIG" ; then
        AC_MSG_ERROR([--with-cql should point to a cql_config program])
1131 1132
    fi

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1133
    CQL_INCLUDEDIR=`$CQL_CONFIG --includedir`
1134 1135
    CQL_CPPFLAGS="`$CQL_CONFIG --cppflags` -I$CQL_INCLUDEDIR"
    CQL_LIBS="-L`$CQL_CONFIG --libdir` -lcassandra_static -luv"
Tomek Mrugalski's avatar
Tomek Mrugalski committed
1136
    CQL_VERSION=`$CQL_CONFIG --version`
1137

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1138 1139
    AC_SUBST(CQL_CPPFLAGS)
    AC_SUBST(CQL_LIBS)
1140

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1141
    # Check that a simple program using CQL functions can compile and link.
1142 1143 1144
    CPPFLAGS_SAVED="$CPPFLAGS"
    LIBS_SAVED="$LIBS"

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1145 1146
    CPPFLAGS="$CQL_CPPFLAGS $CPPFLAGS"
    LIBS="$CQL_LIBS $LIBS"
1147 1148 1149 1150 1151

    AC_LINK_IFELSE(
            [AC_LANG_PROGRAM([#include <cassandra.h>],
                             [CassCluster* cluster = cass_cluster_new();
                              cass_cluster_free(cluster);])],
Tomek Mrugalski's avatar
Tomek Mrugalski committed
1152 1153 1154
            [AC_MSG_RESULT([checking for Cassandra CQL headers and library... yes])],
            [AC_MSG_RESULT([checking for Cassandra CQL headers and library... no])
             AC_MSG_ERROR([Needs Cassandra CQL library])]
1155 1156 1157 1158
    )
    CPPFLAGS=$CPPFLAGS_SAVED
    LIBS=$LIBS_SAVED

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1159 1160
    # Note that CQL is present in the config.h file
    AC_DEFINE([HAVE_CQL], [1], [CQL is present])
1161 1162 1163
fi

# ... and at the shell level, so Makefile.am can take action depending on this.
Tomek Mrugalski's avatar
Tomek Mrugalski committed
1164
AM_CONDITIONAL(HAVE_CQL, test "$CQL_CONFIG" != "")
1165

1166 1167 1168 1169 1170 1171
# Check for log4cplus
log4cplus_path="yes"
AC_ARG_WITH([log4cplus],
  AC_HELP_STRING([--with-log4cplus=PATH],
    [specify exact directory of log4cplus library and headers]),
    [log4cplus_path="$withval"])
1172
if test "${log4cplus_path}" = "no" ; then
1173 1174 1175
    AC_MSG_ERROR([Need log4cplus])
elif test "${log4cplus_path}" != "yes" ; then
  LOG4CPLUS_INCLUDES="-I${log4cplus_path}/include"
1176
  LOG4CPLUS_LIBS="-L${log4cplus_path}/lib"
1177 1178
else
# If not specified, try some common paths.
1179 1180 1181 1182 1183 1184 1185 1186 1187
        log4cplusdirs="/usr /usr/local /usr/pkg /opt /opt/local"
        for d in $log4cplusdirs
        do
                if test -f $d/include/log4cplus/logger.h; then
                        LOG4CPLUS_INCLUDES="-I$d/include"
                        LOG4CPLUS_LIBS="-L$d/lib -L$d/lib64"
                        break
                fi
        done
1188 1189
fi

Francis Dupont's avatar
Francis Dupont committed
1190
LOG4CPLUS_LIBS="$LOG4CPLUS_LIBS -llog4cplus"
1191

1192
AC_SUBST(LOG4CPLUS_LIBS)
1193 1194 1195 1196
AC_SUBST(LOG4CPLUS_INCLUDES)

CPPFLAGS_SAVED=$CPPFLAGS
CPPFLAGS="$LOG4CPLUS_INCLUDES $CPPFLAGS"
1197
LIBS_SAVED="$LIBS"
Francis Dupont's avatar
Francis Dupont committed
1198
LIBS="$LOG4CPLUS_LIBS $MULTITHREADING_FLAG $LIBS"
1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211

AC_CHECK_HEADERS([log4cplus/logger.h],,AC_MSG_ERROR([Missing required header files.]))
AC_LINK_IFELSE(
        [AC_LANG_PROGRAM([#include <log4cplus/logger.h>
                         ],
                         [using namespace log4cplus;
                          Logger logger = Logger::getInstance("main");
                         ])],
        [AC_MSG_RESULT([checking for log4cplus library... yes])],
        [AC_MSG_RESULT([checking for log4cplus library... no])
         AC_MSG_ERROR([Needs log4cplus library])]
)

1212 1213 1214
dnl Determine the log4cplus version, used mainly for config.report.
AC_MSG_CHECKING([log4cplus version])
cat > conftest.cpp << EOF
1215
#include <log4cplus/version.h>
1216 1217 1218
AUTOCONF_LOG4CPLUS_VERSION=LOG4CPLUS_VERSION_STR
EOF

1219
LOG4CPLUS_VERSION=`$CPPP $CPPFLAGS conftest.cpp | grep '^AUTOCONF_LOG4CPLUS_VERSION=' | $SED -e 's/^AUTOCONF_LOG4CPLUS_VERSION=//' -e 's/[[ 	]]//g' -e 's/"//g' 2> /dev/null`
1220 1221 1222 1223 1224 1225
if test -z "$LOG4CPLUS_VERSION"; then
  LOG4CPLUS_VERSION="unknown"
fi
$RM -f conftest.cpp
AC_MSG_RESULT([$LOG4CPLUS_VERSION])

1226
CPPFLAGS=$CPPFLAGS_SAVED
1227
LIBS=$LIBS_SAVED
1228

1229 1230 1231
#
# Configure Boost header path
#
1232
AX_BOOST_FOR_KEA
1233 1234
# Boost offset_ptr is required in one library and not optional right now, so
# we unconditionally fail here if it doesn't work.
1235
if test "$BOOST_OFFSET_PTR_WOULDFAIL" = "yes" -a X"$werror_ok" = X1; then
1236
    AC_MSG_ERROR([Failed to compile a required header file.  Try upgrading Boost to 1.44 or higher (when using clang++) or specifying --without-werror.  See the ChangeLog entry for Trac no. 2147 for more details.])
1237
fi
1238

1239 1240 1241 1242
if test "$BOOST_STATIC_ASSERT_WOULDFAIL" = "yes" -a X"$werror_ok" = X1; then
    AC_MSG_ERROR([Failed to use Boost static assertions. Try upgrading Boost to 1.54 or higher (when using GCC 4.8) or specifying --without-werror.  See trac ticket no. 3039 for more details.])
fi

1243
# There's a known bug in FreeBSD ports for Boost that would trigger a false
1244 1245
# warning in build with g++ and -Werror (we exclude clang++ explicitly to
# avoid unexpected false positives).
1246
if test "$BOOST_NUMERIC_CAST_WOULDFAIL" = "yes" -a X"$werror_ok" = X1 -a $CLANGPP = "no"; then
1247 1248 1249 1250
    AC_MSG_ERROR([Failed to compile a required header file.  If you are using FreeBSD and Boost installed via ports, retry with specifying --without-werror.  See the ChangeLog entry for Trac no. 1991 for more details.])
fi

# Add some default CPP flags needed for Boost, identified by the AX macro.
1251
CPPFLAGS="$CPPFLAGS $CPPFLAGS_BOOST_THREADCONF"
1252

1253
# Can be required by gtest, boost and perhaps still asio
Francis Dupont's avatar
Francis Dupont committed
1254
AC_CHECK_LIB(pthread, pthread_create,[ LDFLAGS="$LDFLAGS -lpthread" ], [])
1255

1256
#
1257
# Check availability of gtest, which will be used for unit tests.
1258
#
1259 1260 1261
GTEST_LDFLAGS=
GTEST_LDADD=
DISTCHECK_GTEST_CONFIGURE_FLAG=
1262
GTEST_VERSION="unknown"
1263

1264
if test "x$enable_gtest" = "xyes" ; then
1265

1266 1267
    DISTCHECK_GTEST_CONFIGURE_FLAG="--with-gtest=$gtest_path"

1268
    if test -n "$with_gtest_source" ; then
1269

1270
        if test "x$GTEST_SOURCE" = "xyes" ; then
1271

1272
            AC_MSG_CHECKING([for gtest source])
1273
            # If not specified, try some common paths.
1274
            GTEST_SOURCE=
1275 1276 1277 1278 1279 1280 1281
            for d in /usr/src/gtest /usr/local /usr/pkg /opt /opt/local ; do
                if test -f $d/src/gtest-all.cc -a $d/src/gtest_main.cc; then
                    GTEST_SOURCE=$d
                    AC_MSG_RESULT([$GTEST_SOURCE])
                    break
                fi
            done
1282
            if test -z $GTEST_SOURCE ; then
1283
                AC_MSG_ERROR([no gtest source but it was selected])
1284
            fi
1285
        else
1286 1287 1288
	    if test ! -d $GTEST_SOURCE/src -a -d $GTEST_SOURCE/googletest; then
		GTEST_SOURCE=$GTEST_SOURCE/googletest
	    fi
1289
            AC_CHECK_FILES([$GTEST_SOURCE/src/gtest-all.cc]
1290 1291 1292 1293 1294
                [$GTEST_SOURCE/src/gtest_main.cc],
                [have_gtest_source=yes],
                [AC_MSG_ERROR([no gtest source at $GTEST_SOURCE])])
        fi
        have_gtest_source=yes
Francis Dupont's avatar
Francis Dupont committed
1295
        GTEST_LDADD="\$(top_builddir)/ext/gtest/libgtest.a"
1296 1297
        DISTCHECK_GTEST_CONFIGURE_FLAG="--with-gtest-source=$GTEST_SOURCE"
        GTEST_INCLUDES="-I$GTEST_SOURCE -I$GTEST_SOURCE/include"
1298
	GTEST_VERSION="`basename $GTEST_SOURCE`"
1299
    fi
1300 1301 1302 1303 1304 1305 1306 1307 1308

    if test "$gtest_path" != "no" ; then
        if test "$gtest_path" != "yes"; then
            GTEST_PATHS=$gtest_path
            if test -x "${gtest_path}/bin/gtest-config" ; then
                GTEST_CONFIG="${gtest_path}/bin/gtest-config"
            fi
        else
            AC_PATH_PROG([GTEST_CONFIG], [gtest-config])
1309
        fi
1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
        if test -x "${GTEST_CONFIG}" ; then :
            # using cppflags instead of cxxflags
            GTEST_INCLUDES=`${GTEST_CONFIG} --cppflags`
            GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`
            GTEST_LDADD=`${GTEST_CONFIG} --libs`
            GTEST_VERSION=`${GTEST_CONFIG} --version`
            GTEST_FOUND="true"
        else
            AC_MSG_WARN([Unable to locate Google Test gtest-config.])
            if test -z "${GTEST_PATHS}" ; then
                GTEST_PATHS="/usr /usr/local"
1321
            fi
1322 1323 1324 1325 1326 1327
            GTEST_FOUND="false"
        fi
        if test "${GTEST_FOUND}" != "true"; then
            GTEST_FOUND="false"
            for dir in $GTEST_PATHS; do
                if test -f "$dir/include/gtest/gtest.h"; then
1328 1329 1330 1331
                    if ! test -f "$dir/lib/libgtests.a"; then
                        AC_MSG_WARN([Found Google Test include but not the library in $dir.])
                        continue
                    fi
1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342
                    GTEST_INCLUDES="-I$dir/include"
                    GTEST_LDFLAGS="-L$dir/lib"
                    GTEST_LDADD="-lgtest"
                    GTEST_FOUND="true"
                    break
                fi
            done
        fi
        if test "${GTEST_FOUND}" != "true"; then
            AC_MSG_ERROR([Cannot find gtest in: $GTEST_PATHS])
        fi
1343

1344
    fi
1345
fi
1346 1347
AM_CONDITIONAL(HAVE_GTEST, test $enable_gtest != "no")
AM_CONDITIONAL(HAVE_GTEST_SOURCE, test "X$have_gtest_source" = "Xyes")
1348
AC_SUBST(DISTCHECK_GTEST_CONFIGURE_FLAG)
1349 1350 1351
AC_SUBST(GTEST_INCLUDES)
AC_SUBST(GTEST_LDFLAGS)
AC_SUBST(GTEST_LDADD)
1352
AC_SUBST(GTEST_SOURCE)
1353

Andrei Pavel's avatar
Andrei Pavel committed
1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420