configure.ac 63.4 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.1.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
37
38
39
40
41
42
43
44
45
46
# Check for exact Kea version.
AC_MSG_CHECKING(whether this is a tarball or git source)
if test -d "${srcdir}/.git"; then
	KEA_SRCID="git `(cd "${top_srcdir}";git rev-parse HEAD)`"
        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
49
50
51
52
53
54
55
56
57
58
59
60
# Find a separator for path_replacer
for sep in "+" "," ";" "&" "__NONE__"; do
	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
done
if test "$sep" = "__NONE__"; then
	AC_MSG_ERROR([can't find a separator character in '+,;&' for the path_replacer shell script])
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"])
117
# USE_CLANGPP is no longer used, keep it by summetry with USE_GXX?
118
AM_CONDITIONAL(USE_CLANGPP, test "X${CLANGPP}" = "Xyes")
119

120
dnl Determine if we are using GNU sed
121
GNU_SED=no
122
$SED --version 2> /dev/null | grep GNU > /dev/null 2>&1
123
124
125
126
if test $? -eq 0; then
  GNU_SED=yes
fi

127
128
129
130
131
132
133
134
135
136
137
# 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
	CXX_STANDARD="unknown"
fi
AC_MSG_RESULT([$CXX_STANDARD])

138
139
# Linker options

140
# check -R, "-Wl,-R" or -rpath
141
AX_ISC_RPATH
142

143
# Compiler dependent settings: define some mandatory CXXFLAGS here.
144
# We also use a separate variable KEA_CXXFLAGS.  This will (and should) be
145
# used as the default value for each specific AM_CXXFLAGS:
146
# AM_CXXFLAGS = $(KEA_CXXFLAGS)
147
148
149
150
151
152
153
154
# 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.
155
AC_DEFUN([KEA_CXX_TRY_FLAG], [
156
157
  AC_MSG_CHECKING([whether $CXX supports $1])

158
  kea_save_CXXFLAGS="$CXXFLAGS"
159
  CXXFLAGS="$CXXFLAGS -Werror $1"
160

161
  AC_LINK_IFELSE([AC_LANG_SOURCE([int main(){ return 0;}])],
162
163
                 [kea_cxx_flag=yes], [kea_cxx_flag=no])
  CXXFLAGS="$kea_save_CXXFLAGS"
164

165
  if test "x$kea_cxx_flag" = "xyes"; then
166
167
168
169
170
    ifelse([$2], , :, [$2])
  else
    ifelse([$3], , :, [$3])
  fi

171
  AC_MSG_RESULT([$kea_cxx_flag])
172
173
])

174
175
CXX_VERSION="unknown"

176
177
178
# SunStudio compiler requires special compiler options for boost
# (http://blogs.sun.com/sga/entry/boost_mini_howto)
if test "$SUNCXX" = "yes"; then
179
CXX_VERSION=`$CXX -V 2> /dev/null | head -1`
180
CXXFLAGS="$CXXFLAGS -library=stlport4 -features=tmplife -features=tmplrefstatic"
Francis Dupont's avatar
Francis Dupont committed
181
KEA_CXXFLAGS="$KEA_CXXFLAGS -mt"
182
183
184
185
186
187
188
189
190
191
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.
192
if test "X$CLANGPP" = "Xyes"; then
193
CXX_VERSION=`$CXX --version 2> /dev/null | head -1`
194
KEA_CXXFLAGS="$KEA_CXXFLAGS -Qunused-arguments"
195
196
fi

197
# gcc/clang specific settings:
198
if test "X$GXX" = "Xyes"; then
199
CXX_VERSION=`$CXX --version 2> /dev/null | head -1`
200
KEA_CXXFLAGS="$KEA_CXXFLAGS -Wall -Wextra -Wnon-virtual-dtor -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare"
201
202
203
# 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.`
204
if expr "$CXX_DUMP_VERSION" \< "4.5" > /dev/null; then
205
206
207
208
       WARNING_GCC_44_STRICT_ALIASING_CFLAG="-fno-strict-aliasing"
fi
AC_SUBST(WARNING_GCC_44_STRICT_ALIASING_CFLAG)

209
210
211
212
case "$host" in
*-solaris*)
	MULTITHREADING_FLAG=-pthreads
	# In Solaris, IN6ADDR_ANY_INIT and IN6ADDR_LOOPBACK_INIT need -Wno-missing-braces
213
	KEA_CXXFLAGS="$KEA_CXXFLAGS -Wno-missing-braces"
214
	;;
215
216
217
*-apple-darwin*)
	MULTITHREADING_FLAG=
	;;
218
219
220
221
*)
	MULTITHREADING_FLAG=-pthread
	;;
esac
222
KEA_CXXFLAGS="$KEA_CXXFLAGS $MULTITHREADING_FLAG"
223

224
225
226
# Disable -Werror by default. Only use it if specifically enabled.
# The usage of this flag is:
#
227
228
229
230
231
# 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
232
233
234
235
#
# In the last case, "value" may be one or more compiler flags, e.g.

# --with-werror=-Wundef
236
# --with-werror='-Wundef -Wconversion'
237

238
werror_extras=
239
AC_ARG_WITH(werror,
240
    AC_HELP_STRING([--with-werror], [Compile using -Werror (default=no)]),
241
242
243
244
    [
     case "${withval}" in
         yes) with_werror=1 ;;
         no)  with_werror=0 ;;
245
246
         -*)  with_werror=1; werror_extras=${withval} ;;
	 *)   AC_MSG_ERROR(bad value ${withval} for --with-werror) ;;
247
     esac],
248
     [with_werror=0])
249
250
251
252
253
254
255
256

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"
257
   CXXFLAGS="$CXXFLAGS $KEA_CXXFLAGS -Werror"
258
   AC_MSG_CHECKING(for in-TU anonymous namespace breakage)
259
260
261
262
   # 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_;};} ],,
263
264
	[AC_MSG_RESULT(no)
	 werror_ok=1
265
	 KEA_CXXFLAGS="$KEA_CXXFLAGS -Werror"],
266
267
268
269
	[AC_MSG_RESULT(yes)])
   CXXFLAGS="$CXXFLAGS_SAVED"
fi

270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# 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],
	[KEA_CXXFLAGS="$KEA_CXXFLAGS -Wno-missing-field-initializers"])

if test "X$CLANGPP" = "Xyes"; then
	# 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"
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
	KEA_CXX_TRY_FLAG([$extra],
		[KEA_CXXFLAGS="$KEA_CXXFLAGS $extra"],
		[AC_MSG_ERROR([$CXX does not support $extra"])])
done

294
295
fi				dnl GXX = yes

JINMEI Tatuya's avatar
JINMEI Tatuya committed
296
297
298
299
300
301
302
# 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)
303
AM_COND_IF([USE_STATIC_LINK], [AC_DEFINE([USE_STATIC_LINK], [1], [Was Kea statically linked?])])
JINMEI Tatuya's avatar
JINMEI Tatuya committed
304

JINMEI Tatuya's avatar
JINMEI Tatuya committed
305
306
307
308
# Check validity about some libtool options
if test $enable_static_link = yes -a $enable_static = no; then
	AC_MSG_ERROR([--enable-static-link requires --enable-static])
fi
309
310
if test $enable_static_link = no -a $enable_shared = no; then
	AC_MSG_ERROR([--disable-static-link requires --enable-shared])
JINMEI Tatuya's avatar
JINMEI Tatuya committed
311
312
fi

313
# OS dependent configuration
314
kea_undefined_pthread_behavior=no
315

316
case "$host" in
317
318
319
320
*-solaris*)
	# 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__"
Dima Volodin's avatar
Dima Volodin committed
321
322
	# "now" binding is necessary to prevent deadlocks in C++ static initialization code
	LDFLAGS="$LDFLAGS -z now"
323
324
325
	# Destroying locked mutexes, condition variables being waited
	# on, etc. are undefined behavior on Solaris, so we set it as
	# such here.
326
	kea_undefined_pthread_behavior=yes
327
	;;
328
*-apple-darwin*)
329
330
331
332
	# Starting with OSX 10.7 (Lion) we must choose which IPv6 API to use
	# (RFC2292 or RFC3542).
	CPPFLAGS="$CPPFLAGS -D__APPLE_USE_RFC_3542"

333
334
	# 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.
335
336
337
338
339
340
341
342
343
344
345
346
	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])
347
	;;
348
*-freebsd*)
349
350
351
352
353
354
355
356
357
358
	# 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
359
	;;
360
esac
361
if [ test $kea_undefined_pthread_behavior = "yes" ]; then
362
363
   AC_DEFINE([HAS_UNDEFINED_PTHREAD_BEHAVIOR], [1], [Does this platform have some undefined pthreads behavior?])
fi
364

365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
# 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)
	AC_DEFINE([HAVE_BROKEN_GET_IPV6_USE_MIN_MTU], [1],
	[Define to 1 if getsockopt(IPV6_USE_MIN_MTU) does not work])
	;;
esac

380
m4_define([_AM_PYTHON_INTERPRETER_LIST], [python python3.4 python3.3 python3.2 python3.1 python3])
381
382
AC_ARG_WITH([pythonpath],
AC_HELP_STRING([--with-pythonpath=PATH],
383
  [specify an absolute path to python executable when automatic version check (incorrectly) fails]),
384
385
  [python_path="$withval"], [python_path="auto"])
if test "$python_path" = auto; then
386
	AM_PATH_PYTHON([3.1],,[PYTHON=no])
387
else
388
389
	# Older versions of automake can't handle python3 well.  This is an
	# in-house workaround for them.
390
391
	PYTHON=$python_path
	AC_SUBST(PYTHON)
392
393
394
395
	PYTHON_PREFIX='${prefix}'
	AC_SUBST(PYTHON_PREFIX)
	PYTHON_EXEC_PREFIX='$(exec_prefix)'
	AC_SUBST(PYTHON_EXEC_PREFIX)
396
397
398
399
	PYTHON_VERSION=[`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"`]
	if test `echo "$PYTHON_VERSION >= 3.1" | bc` != 1 ; then
		AC_MSG_ERROR(["Python version too old: $PYTHON_VERSION, need 3.1 or higher"])
	fi
400
401
	AC_SUBST(PYTHON_VERSION)
	PYTHON_PLATFORM=`$PYTHON -c "import sys; print(sys.platform)"`
402
	AC_SUBST(PYTHON_PLATFORM)
403
	pythondir='${prefix}/lib/python'$PYTHON_VERSION'/site-packages'
404
	AC_SUBST(pythondir)
405
	pkgpythondir='${pythondir}/'$PACKAGE
406
	AC_SUBST(pkgpythondir)
407
	pyexecdir='${exec_prefix}/lib/python'$PYTHON_VERSION'/site-packages'
408
	AC_SUBST(pyexecdir)
409
	pkgpyexecdir='${pyexecdir}/'$PACKAGE
410
	AC_SUBST(pkgpyexecdir)
411
fi
412

413
# produce PIC unless we disable shared libraries. need this for python bindings.
414
if test $enable_shared != "no" -a "X$GXX" = "Xyes"; then
415
   KEA_CXXFLAGS="$KEA_CXXFLAGS -fPIC"
416
417
fi

418
AC_SUBST(KEA_CXXFLAGS)
419

420
421
# Checks for libraries.

422
423
AC_SEARCH_LIBS(inet_pton, [nsl])
AC_SEARCH_LIBS(recvfrom, [socket])
424
AC_SEARCH_LIBS(nanosleep, [rt])
425
AC_SEARCH_LIBS(dlsym, [dl])
426

427
428
429
430
431
432
# Checks for header files.

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

433

434
435
# Detect OS type (it may be used to do OS-specific things, e.g.
# interface detection in DHCP)
436
AC_MSG_CHECKING(OS type)
437
BSD_TYPE="notaBSD"
438
439
440
case $host in
    *-linux*)
      AC_DEFINE([OS_LINUX], [1], [Running on Linux?])
441
      OS_TYPE="Linux"
442
443
      CPPFLAGS="$CPPFLAGS -DOS_LINUX"
      ;;
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
    *-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?])
468
      OS_TYPE="BSD"
469
      BSD_TYPE="OpenBSD"
470
471
      CPPFLAGS="$CPPFLAGS -DOS_BSD"
      ;;
472
473
    *-solaris*)
      AC_DEFINE([OS_SOLARIS], [1], [Running on Solaris?])
474
      OS_TYPE="Solaris"
475
      CPPFLAGS="$CPPFLAGS -DOS_SUN"
476
477
478
      ;;
    *)
      OS_TYPE="Unknown"
479
480
      # $host_os is more user friendly than full $host
      AC_MSG_WARN("Unsupported OS: $host_os")
481
482
483
      ;;
esac
AC_MSG_RESULT($OS_TYPE)
484
485

AM_CONDITIONAL(OS_LINUX, test $OS_TYPE = Linux)
486
487
AM_CONDITIONAL(OS_BSD, test $OS_TYPE = BSD)
AM_CONDITIONAL(OS_SOLARIS, test $OS_TYPE = Solaris)
488
489
490
491
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)
492
493


494
495
496
497
498
499
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)
500
        AC_DEFINE(HAVE_SA_LEN, 1, [Define to 1 if sockaddr has a sa_len member, and corresponding sin_len and sun_len])],
501
502
        AC_MSG_RESULT(no))

503
enable_gtest="no"
504
GTEST_INCLUDES=
505
506
507

AC_ARG_WITH([gtest-source],
            [AS_HELP_STRING([--with-gtest-source=PATH],
508
509
                            [location of the Googletest source])],
            [enable_gtest="yes" ; GTEST_SOURCE="$withval"])
510
511
512
513
514
515

AC_ARG_WITH([gtest],
	    [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"])

516
AC_ARG_WITH(lcov,
517
[  --with-lcov[=PROGRAM]         enable gtest and coverage target using the specified lcov], lcov="$withval", lcov="no")
518
519
520
521

USE_LCOV="no"
if test "$lcov" != "no"; then
	# force gtest if not set
522
	if test "$enable_gtest" = "no"; then
523
524
#		AC_MSG_ERROR("lcov needs gtest for test coverage report")
		AC_MSG_NOTICE([gtest support is now enabled, because used by coverage tests])
525
		enable_gtest="yes"
526
527
	fi
	if test "$lcov" != "yes"; then
528
		LCOV=$lcov
529
	else
530
		AC_PATH_PROG([LCOV], [lcov])
531
	fi
532
533
534
535
	if test -x "${LCOV}"; then
		USE_LCOV="yes"
	else
		AC_MSG_ERROR([Cannot find lcov.])
536
537
	fi
	# is genhtml always in the same directory?
Jelte Jansen's avatar
Jelte Jansen committed
538
	GENHTML=`echo "$LCOV" | ${SED} s/lcov$/genhtml/`
539
540
541
	if test ! -x $GENHTML; then
		AC_MSG_ERROR([genhtml not found, needed for lcov])
	fi
542
	# GCC specific?
543
	CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
544
	LIBS=" $LIBS -lgcov"
545
546
547
548
549
550
551
	AC_SUBST(CPPFLAGS)
	AC_SUBST(LIBS)
	AC_SUBST(LCOV)
	AC_SUBST(GENHTML)
fi
AC_SUBST(USE_LCOV)

552
553
554
555
# 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
556
557
# is set to that. If not, the value is untouched.
# Does not take absolute paths into account at this point,
558
559
560
561
562
# 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"
563
    IFS=${PATH_SEPARATOR}
564
565
566
567
568
569
    for cur_path in ${PATH} ; do
      if test -e "${cur_path}/$2" ; then
          RESULT="${cur_path}/$2"
      fi
    done
    if test "$RESULT" = "" ; then
570
        :
571
572
573
574
575
576
577
        m4_ifvaln([$3], [$1=$3])
    else
        $1=$RESULT
    fi
    IFS="$IFS_SAVED"
])

578
579
580
581
582
583
584
# 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"])

585
# Botan helper test function
586
587
# Tries to compile a botan program, given the output of the given
# config tool
588
589
590
591
592
593
594
595
# 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=""
596
597
    ACX_CHECK_PROG_NONCACHE([BOTAN_TOOL], [${TOOL}])
    AC_MSG_CHECKING([usability of ${TOOL} ${TOOL_ARG}])
598
599
    if test "$BOTAN_TOOL" != "" ; then
        if test -x ${BOTAN_TOOL}; then
600
            CRYPTO_LIBS=`$BOTAN_TOOL $TOOL_ARG --libs`
601
            LIBS_SAVED=${LIBS}
602
603
            LIBS="$LIBS $CRYPTO_LIBS"
            CRYPTO_INCLUDES=`$BOTAN_TOOL $TOOL_ARG --cflags`
604
            CPPFLAGS_SAVED=${CPPFLAGS}
605
            CPPFLAGS="$CRYPTO_INCLUDES $CPPFLAGS"
606
607
608
609
610
611
612
613
614
615
616
617
            #AC_MSG_RESULT([found])
            AC_LINK_IFELSE(
                [AC_LANG_PROGRAM([#include <botan/botan.h>
                                  #include <botan/hash.h>
                                 ],
                                 [using namespace Botan;
                                  LibraryInitializer::initialize();
                                  HashFunction *h = get_hash("MD5");
                                 ])],
                [ AC_MSG_RESULT([ok])
                  $3
                ],
618
                [ AC_MSG_RESULT([not usable]) ]
619
620
621
622
623
624
625
626
627
628
629
630
631
632
            )
            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
633
# Check for Botan
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
#
# 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).
#
649
botan_config="yes"
650
651
652
if test "${use_openssl}" != "auto" -a "${use_openssl}" != "no" ; then
   botan_config="no"
fi
653
654
655
656
AC_ARG_WITH([botan-config],
  AC_HELP_STRING([--with-botan-config=PATH],
    [specify the path to the botan-config script]),
    [botan_config="$withval"])
657
distcheck_botan="--with-botan-config=$botan_config"
658
if test "${botan_config}" = "no" ; then
659
660
661
662
    if test "${use_openssl}" = "no" ; then
       AC_MSG_ERROR([Need Botan or OpenSSL for libcryptolink])
    fi
elif test "${botan_config}" != "yes" ; then
663
664
665
666
667
668
    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
669
    else
670
        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
671
672
    fi
else
673
    BOTAN_CONFIG=""
674
    # first try several possible names of the config script
675
676
    # (botan-config-1.8 is there just in case, the official name change
    # came later)
677
678
    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
679
        ACX_TRY_BOTAN_TOOL([$botan_config],,
680
                           [ BOTAN_CONFIG="$botan_config"  ]
681
682
                          )
        if test "$BOTAN_CONFIG" != "" ; then
683
684
685
            break
        fi
    done
686
    if test "$BOTAN_CONFIG" = "" ; then
687
688
689
690
691
692
693
        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
            BOTAN_VERSIONS="botan-1.10 botan-1.9 botan-1.8"
            for version in $BOTAN_VERSIONS; do
694
                ACX_TRY_BOTAN_TOOL([pkg-config], ["$version --silence-errors"],
695
                                   [ BOTAN_CONFIG="$PKG_CONFIG $version" ]
696
697
                                  )
            if test "$BOTAN_CONFIG" != "" ; then
698
699
                break
            fi
700
701
            done
        fi
702
    fi
Jelte Jansen's avatar
Jelte Jansen committed
703
fi
704

705
706
if test "x${BOTAN_CONFIG}" != "x"
then
707
708
    CRYPTO_LIBS=`${BOTAN_CONFIG} --libs`
    CRYPTO_INCLUDES=`${BOTAN_CONFIG} --cflags`
709
710
711
712

    # 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).
713
    # Same for CRYPTO_INCLUDES (but using include instead of lib) below.
714
    if [ ${BOTAN_CONFIG} --prefix >/dev/null 2>&1 ] ; then
715
716
717
718
        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}"
719
    fi
Jelte Jansen's avatar
Jelte Jansen committed
720
fi
721

722
723
724
725
726
if test "x${CRYPTO_LIBS}" != "x"
then
   dnl Determine the Botan version
   AC_MSG_CHECKING([Botan version])
   cat > conftest.cpp << EOF
727
728
729
730
#include <botan/version.h>
AUTOCONF_BOTAN_VERSION=BOTAN_VERSION_MAJOR . BOTAN_VERSION_MINOR . BOTAN_VERSION_PATCH
EOF

731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
   CRYPTO_VERSION=`$CPP $CPPFLAGS $CRYPTO_INCLUDES conftest.cpp | grep '^AUTOCONF_BOTAN_VERSION=' | $SED -e 's/^AUTOCONF_BOTAN_VERSION=//' -e 's/[[ 	]]//g' -e 's/"//g' 2> /dev/null`
   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=""
780
	if test "x$ac_header_preproc" = "xyes"; then
781
		AC_MSG_RESULT([
782
783
784
785
786
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.])
787
	else
788
		AC_MSG_RESULT([Missing required header files.])
789
	fi]
790
791
792
793
794
795
796
797
798
799
800
801
   )
   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(
802
803
804
        [AC_LANG_PROGRAM([#include <botan/botan.h>
                          #include <botan/hash.h>
                         ],
Jelte Jansen's avatar
Jelte Jansen committed
805
806
                         [using namespace Botan;
                          LibraryInitializer::initialize();
807
                          HashFunction *h = get_hash("MD5");
Jelte Jansen's avatar
Jelte Jansen committed
808
809
810
                         ])],
        [AC_MSG_RESULT([checking for Botan library... yes])],
        [AC_MSG_RESULT([checking for Botan library... no])
811
812
813
814
815
         CRYPTO_INCLUDES=""
         CRYPTO_LIBS=""
         CRYPTO_LDFLAGS=""
         CRYPTO_RPATH=""
         AC_MSG_RESULT([Needs Botan library 1.8 or higher. On some systems,
816
         the botan package has a few missing dependencies (libbz2 and
817
         libgmp), if libbotan has been installed and you see this message,
818
819
         try upgrading to a higher version of botan or installing libbz2
         and libgmp.])]
820
821
822
823
824
825
826
827
828
829
830
   )
   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=""
831
   DISTCHECK_CRYPTO_CONFIGURE_FLAG="$distcheck_botan"
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
   AC_DEFINE_UNQUOTED([WITH_BOTAN], [], [Compile with Botan crypto])
else
   CRYPTO_NAME="OpenSSL"
   DISABLED_CRYPTO="Botan"
   CRYPTO_PACKAGE="openssl-1.0.0"
   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
      CRYPTO_INCLUDES=""
      CRYPTO_LIBS="-lcrypto"
      DISTCHECK_CRYPTO_CONFIGURE_FLAG="--with-openssl"
      case "$host" in
          *-apple-darwin*)
              # Starting with OSX 10.7 (Lion) OpenSSL is deprecated
              CRYPTO_CFLAGS="-Wno-deprecated-declarations"
              ;;
          *)
              CRYPTO_CFLAGS=""
              ;;
      esac
   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
    AC_MSG_CHECKING([OpenSSL version])
    cat > conftest.cpp << EOF
#include <openssl/opensslv.h>
AUTOCONF_OPENSSL_VERSION=OPENSSL_VERSION_TEXT
EOF

    CRYPTO_VERSION=`$CPP $CPPFLAGS $CRYPTO_INCLUDES conftest.cpp | grep '^AUTOCONF_OPENSSL_VERSION=' | $SED -e 's/^AUTOCONF_OPENSSL_VERSION=//' -e 's/"//g' 2> /dev/null`
    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=""
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
    dnl Check avaibility of SHA-2
    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])])
    LIBS=${LIBS_SAVED}
    CPPFLAGS=${CPPFLAGS_SAVED}
927
928
929
930
931
932
933
934
935
936
937
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)
938
939

# Check for MySql.  The path to the mysql_config program is given with
940
941
# the --with-mysql-config (default to /usr/bin/mysql-config).  By default,
# the software is not built with MySQL support enabled.
942
mysql_config="no"
943
944
945
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)]),
946
947
948
949
950
951
952
953
954
    [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
955
956
    if test -d "$MYSQL_CONFIG" -o ! -x "$MYSQL_CONFIG" ; then
        AC_MSG_ERROR([--with-dhcp-mysql should point to a mysql_config program])
957
958
959
960
    fi

    MYSQL_CPPFLAGS=`$MYSQL_CONFIG --cflags`
    MYSQL_LIBS=`$MYSQL_CONFIG --libs`
961
    MYSQL_VERSION=`$MYSQL_CONFIG --version`
962
963
964
965
966
967
968
969
970
971
972
973

    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(
974
            [AC_LANG_PROGRAM([#include <mysql.h>],
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
                             [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

990
# Solaris puts FIONREAD in filio.h
991
AC_CHECK_HEADERS(sys/filio.h,,,)
992

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

996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
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`
1015
1016
    PGSQL_INCLUDEDIR_SERVER=`$PG_CONFIG --includedir-server`
    PGSQL_CPPFLAGS="$PGSQL_CPPFLAGS -I$PGSQL_INCLUDEDIR -I$PGSQL_INCLUDEDIR_SERVER"
1017
1018
    PGSQL_LIBS=`$PG_CONFIG --libdir`
    PGSQL_LIBS="-L$PGSQL_LIBS -lpq"
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
    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])]
    )

1040
    AC_CHECK_HEADERS([utils/errcodes.h],,
1041
    AC_MSG_ERROR([Missing required header file (errcodes.h) from PostgreSQL server-development package]))
1042

1043
1044
1045
1046
1047
1048
1049
1050
1051
    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
1052

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
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
    cql_config="/usr/bin/cql_config"
elif test "${cql_config}" != "no" ; then
    CQL_CONFIG="${withval}"
1063
1064
fi

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1065
1066
1067
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])
1068
1069
    fi

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1070
    CQL_INCLUDEDIR=`$CQL_CONFIG --includedir`
1071
1072
    CQL_CPPFLAGS="`$CQL_CONFIG --cppflags` -I$CQL_INCLUDEDIR"
    CQL_LIBS="-L`$CQL_CONFIG --libdir` -lcassandra_static -luv"
Tomek Mrugalski's avatar
Tomek Mrugalski committed
1073
    CQL_VERSION=`$CQL_CONFIG --version`
1074

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1075
1076
    AC_SUBST(CQL_CPPFLAGS)
    AC_SUBST(CQL_LIBS)
1077

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1078
    # Check that a simple program using CQL functions can compile and link.
1079
1080
1081
    CPPFLAGS_SAVED="$CPPFLAGS"
    LIBS_SAVED="$LIBS"

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1082
1083
    CPPFLAGS="$CQL_CPPFLAGS $CPPFLAGS"
    LIBS="$CQL_LIBS $LIBS"
1084
1085
1086
1087
1088

    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
1089
1090
1091
            [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])]
1092
1093
1094
1095
    )
    CPPFLAGS=$CPPFLAGS_SAVED
    LIBS=$LIBS_SAVED

Tomek Mrugalski's avatar
Tomek Mrugalski committed
1096
1097
    # Note that CQL is present in the config.h file
    AC_DEFINE([HAVE_CQL], [1], [CQL is present])
1098
1099
1100
fi

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

1103
1104
1105
1106
1107
1108
# 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"])
1109
if test "${log4cplus_path}" = "no" ; then
1110
1111
1112
    AC_MSG_ERROR([Need log4cplus])
elif test "${log4cplus_path}" != "yes" ; then
  LOG4CPLUS_INCLUDES="-I${log4cplus_path}/include"
1113
  LOG4CPLUS_LIBS="-L${log4cplus_path}/lib"
1114
1115
else
# If not specified, try some common paths.
1116
	log4cplusdirs="/usr /usr/local /usr/pkg /opt /opt/local"
1117
1118
1119
1120
	for d in $log4cplusdirs
	do
		if test -f $d/include/log4cplus/logger.h; then
			LOG4CPLUS_INCLUDES="-I$d/include"
1121
			LOG4CPLUS_LIBS="-L$d/lib -L$d/lib64"
1122
1123
1124
1125
1126
			break
		fi
	done
fi

Francis Dupont's avatar
Francis Dupont committed
1127
LOG4CPLUS_LIBS="$LOG4CPLUS_LIBS -llog4cplus"
1128

1129
AC_SUBST(LOG4CPLUS_LIBS)
1130
1131
1132
1133
AC_SUBST(LOG4CPLUS_INCLUDES)

CPPFLAGS_SAVED=$CPPFLAGS
CPPFLAGS="$LOG4CPLUS_INCLUDES $CPPFLAGS"
1134
LIBS_SAVED="$LIBS"
Francis Dupont's avatar
Francis Dupont committed
1135
LIBS="$LOG4CPLUS_LIBS $MULTITHREADING_FLAG $LIBS"
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148

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])]
)

1149
1150
1151
dnl Determine the log4cplus version, used mainly for config.report.
AC_MSG_CHECKING([log4cplus version])
cat > conftest.cpp << EOF
1152
#include <log4cplus/version.h>
1153
1154
1155
AUTOCONF_LOG4CPLUS_VERSION=LOG4CPLUS_VERSION_STR
EOF

1156
LOG4CPLUS_VERSION=`$CPP $CPPFLAGS conftest.cpp | grep '^AUTOCONF_LOG4CPLUS_VERSION=' | $SED -e 's/^AUTOCONF_LOG4CPLUS_VERSION=//' -e 's/[[ 	]]//g' -e 's/"//g' 2> /dev/null`
1157
1158
1159
1160
1161
1162
if test -z "$LOG4CPLUS_VERSION"; then
  LOG4CPLUS_VERSION="unknown"
fi
$RM -f conftest.cpp
AC_MSG_RESULT([$LOG4CPLUS_VERSION])

1163
CPPFLAGS=$CPPFLAGS_SAVED
1164
LIBS=$LIBS_SAVED
1165

1166
1167
1168
#
# Configure Boost header path
#
1169
AX_BOOST_FOR_KEA
1170
1171
# Boost offset_ptr is required in one library and not optional right now, so
# we unconditionally fail here if it doesn't work.
1172
if test "$BOOST_OFFSET_PTR_WOULDFAIL" = "yes" -a X"$werror_ok" = X1; then
1173
    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.])
1174
fi
1175

1176
1177
1178
1179
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

1180
# There's a known bug in FreeBSD ports for Boost that would trigger a false
1181
1182
# warning in build with g++ and -Werror (we exclude clang++ explicitly to
# avoid unexpected false positives).
1183
if test "$BOOST_NUMERIC_CAST_WOULDFAIL" = "yes" -a X"$werror_ok" = X1 -a $CLANGPP = "no"; then
1184
1185
1186
1187
    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.
1188
CPPFLAGS="$CPPFLAGS $CPPFLAGS_BOOST_THREADCONF"
1189

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

1193
#
1194
# Check availability of gtest, which will be used for unit tests.
1195
#
1196
1197
1198
GTEST_LDFLAGS=
GTEST_LDADD=
DISTCHECK_GTEST_CONFIGURE_FLAG=
1199
GTEST_VERSION="unknown"
1200

1201
if test "x$enable_gtest" = "xyes" ; then
1202

1203
1204
    DISTCHECK_GTEST_CONFIGURE_FLAG="--with-gtest=$gtest_path"

1205
    if test -n "$with_gtest_source" ; then
1206

1207
        if test "x$GTEST_SOURCE" = "xyes" ; then
1208

1209
            AC_MSG_CHECKING([for gtest source])
1210
            # If not specified, try some common paths.
1211
            GTEST_SOURCE=
1212
1213
1214
1215
1216
1217
1218
            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
1219
            if test -z $GTEST_SOURCE ; then
1220
                AC_MSG_ERROR([no gtest source but it was selected])
1221
            fi
1222
        else
1223
            AC_CHECK_FILES([$GTEST_SOURCE/src/gtest-all.cc]
1224
1225
1226
1227
1228
1229
1230
1231
                [$GTEST_SOURCE/src/gtest_main.cc],
                [have_gtest_source=yes],
                [AC_MSG_ERROR([no gtest source at $GTEST_SOURCE])])
        fi
        have_gtest_source=yes
        GTEST_LDFLAGS="\$(top_builddir)/ext/gtest/libgtest.a"
        DISTCHECK_GTEST_CONFIGURE_FLAG="--with-gtest-source=$GTEST_SOURCE"
        GTEST_INCLUDES="-I$GTEST_SOURCE -I$GTEST_SOURCE/include"
1232
    fi
1233
1234
1235
1236
1237
1238
1239
1240
1241

    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])
1242
        fi
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
        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"
1254
            fi
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
            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
                    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
1272

1273
    fi
1274
fi
1275
1276
AM_CONDITIONAL(HAVE_GTEST, test $enable_gtest != "no")
AM_CONDITIONAL(HAVE_GTEST_SOURCE, test "X$have_gtest_source" = "Xyes")
1277
AC_SUBST(DISTCHECK_GTEST_CONFIGURE_FLAG)
1278
1279
1280
AC_SUBST(GTEST_INCLUDES)
AC_SUBST(GTEST_LDFLAGS)
AC_SUBST(GTEST_LDADD)
1281
AC_SUBST(GTEST_SOURCE)
1282

1283
1284
1285
1286
1287
1288
#
# Some Googletest versions bug with C++11 compilers
#
if test $enable_gtest != "no"; then
   AC_MSG_CHECKING([if Google Test is compatible with the compiler])
   CPPFLAGS_SAVED=$CPPFLAGS
1289
   CPPFLAGS="$CPPFLAGS $BOOST_INCLUDES $GTEST_INCLUDES"
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
   AC_COMPILE_IFELSE(
       [AC_LANG_PROGRAM(
           [#include <boost/shared_ptr.hpp>
	    #include <gtest/gtest.h>
	    void foo() {
	        boost::shared_ptr<int> bar;
		ASSERT_TRUE(bar);
            }],
	    [return 0;])],
	[AC_MSG_RESULT(yes)],
Francis Dupont's avatar
Francis Dupont committed
1300
    	[AC_MSG_ERROR([XXX_TRUE() Google Test macros won't compile; the most likely reason is that a later version of Google Test is required])])
1301
1302
1303
    CPPFLAGS=$CPPFLAGS_SAVED
fi
	    
1304
1305
1306
#
# ASIO: we extensively use it as the C++ event management module.
#