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

4
AC_PREREQ([2.59])
5
AC_INIT(bind10, 20121219, bind10-dev@isc.org)
6
AC_CONFIG_SRCDIR(README)
7
AM_INIT_AUTOMAKE([foreign])
8
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])dnl be backward compatible
9
AC_CONFIG_HEADERS([config.h])
10
AC_CONFIG_MACRO_DIR([m4macros])
11
12
13

# Checks for programs.
AC_PROG_CXX
14

15
16
17
# Enable low-performing debugging facilities? This option optionally
# enables some debugging aids that perform slowly and hence aren't built
# by default.
18
19
20
21
AC_ARG_ENABLE([debug],
  AS_HELP_STRING([--enable-debug],
    [enable debugging (default is no)]),
  [case "${enableval}" in
22
23
    yes) debug_enabled=yes ;;
    no)  debug_enabled=no ;;
24
    *)   AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
25
26
  esac],[debug_enabled=no])
AM_CONDITIONAL([DEBUG_ENABLED], [test x$debug_enabled = xyes])
27
AM_COND_IF([DEBUG_ENABLED], [AC_DEFINE([ENABLE_DEBUG], [1], [Enable low-performing debugging facilities?])])
28

29
30
# Libtool configuration
#
Jelte Jansen's avatar
Jelte Jansen committed
31
32
33
34
35
36

# libtool cannot handle spaces in paths, so exit early if there is one
if [ test `echo $PWD | grep -c ' '` != "0"  ]; then
    AC_MSG_ERROR([BIND 10 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.])
fi

37
38
# On FreeBSD (and probably some others), clang++ does not meet an autoconf
# assumption in identifying libtool configuration regarding shared library:
39
40
41
42
43
# 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).
44
45
46
47
48
# 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
49
CXXFLAGS_SAVED=$CXXFLAGS
50
CFLAGS="$CFLAGS $CXX_LIBTOOL_LDFLAGS"
51
CXXFLAGS="$CXXFLAGS $CXX_LIBTOOL_LDFLAGS"
52
AC_PROG_LIBTOOL
53
CFLAGS=$CFLAGS_SAVED
54
CXXFLAGS=$CXXFLAGS_SAVED
55

56
# Use C++ language
57
58
59
AC_LANG([C++])

# Identify the compiler: this check must be after AC_PROG_CXX and AC_LANG.
60
AM_CONDITIONAL(USE_GXX, test "X${GXX}" = "Xyes")
61
AC_CHECK_DECL([__SUNPRO_CC], [SUNCXX="yes"], [SUNCXX="no"])
62
63
AC_CHECK_DECL([__clang__], [CLANGPP="yes"], [CLANGPP="no"])
AM_CONDITIONAL(USE_CLANGPP, test "X${CLANGPP}" = "Xyes")
64

65
66
# Linker options

67
68
69
# check -R, "-Wl,-R" or -rpath (we share the AX function defined in
#  examples/m4)
AX_ISC_RPATH
70

71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# Compiler dependent settings: define some mandatory CXXFLAGS here.
# We also use a separate variable B10_CXXFLAGS.  This will (and should) be
# used as the default value for each specific AM_CXXFLAGS:
# AM_CXXFLAGS = $(B10_CXXFLAGS)
# 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.
AC_DEFUN([BIND10_CXX_TRY_FLAG], [
  AC_MSG_CHECKING([whether $CXX supports $1])

  bind10_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS $1"

  AC_LINK_IFELSE([AC_LANG_SOURCE([int main(void){ return 0;}])],
                 [bind10_cxx_flag=yes], [bind10_cxx_flag=no])
  CXXFLAGS="$bind10_save_CXXFLAGS"

  if test "x$bind10_cxx_flag" = "xyes"; then
    ifelse([$2], , :, [$2])
  else
    ifelse([$3], , :, [$3])
  fi

  AC_MSG_RESULT([$bind10_cxx_flag])
])

# SunStudio compiler requires special compiler options for boost
# (http://blogs.sun.com/sga/entry/boost_mini_howto)
if test "$SUNCXX" = "yes"; then
CXXFLAGS="$CXXFLAGS -library=stlport4 -features=tmplife -features=tmplrefstatic"
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.
if test "$CLANGPP" = "yes"; then
	B10_CXXFLAGS="$B10_CXXFLAGS -Qunused-arguments"
fi

BIND10_CXX_TRY_FLAG([-Wno-missing-field-initializers],
	[WARNING_NO_MISSING_FIELD_INITIALIZERS_CFLAG="-Wno-missing-field-initializers"])
AC_SUBST(WARNING_NO_MISSING_FIELD_INITIALIZERS_CFLAG)

# gcc specific settings:
if test "X$GXX" = "Xyes"; then
B10_CXXFLAGS="$B10_CXXFLAGS -Wall -Wextra -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare"
case "$host" in
*-solaris*)
	MULTITHREADING_FLAG=-pthreads
	# In Solaris, IN6ADDR_ANY_INIT and IN6ADDR_LOOPBACK_INIT need -Wno-missing-braces
	B10_CXXFLAGS="$B10_CXXFLAGS -Wno-missing-braces"
	;;
*)
	MULTITHREADING_FLAG=-pthread
	;;
esac

# Don't use -Werror if configured not to
AC_ARG_WITH(werror,
    AC_HELP_STRING([--with-werror], [Compile using -Werror (default=yes)]),
    [
     case "${withval}" in
         yes) with_werror=1 ;;
         no)  with_werror=0 ;;
         *)   AC_MSG_ERROR(bad value ${withval} for --with-werror) ;;
     esac],
     [with_werror=1])

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"
   CXXFLAGS="$CXXFLAGS $B10_CXXFLAGS -Werror"
   AC_MSG_CHECKING(for in-TU anonymous namespace breakage)
   AC_TRY_COMPILE([namespace { class Foo {}; }
   namespace isc {class Bar {Foo foo_;};} ],,
	[AC_MSG_RESULT(no)
	 werror_ok=1
	 B10_CXXFLAGS="$B10_CXXFLAGS -Werror"],
	[AC_MSG_RESULT(yes)])
   CXXFLAGS="$CXXFLAGS_SAVED"
fi

167
168
fi				dnl GXX = yes

169
170
AM_CONDITIONAL(GCC_WERROR_OK, test $werror_ok = 1)

JINMEI Tatuya's avatar
JINMEI Tatuya committed
171
172
173
174
175
176
177
178
# 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)

JINMEI Tatuya's avatar
JINMEI Tatuya committed
179
180
181
182
183
184
185
186
# 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
if test $enable_shared = no; then
	AC_MSG_ERROR([BIND 10 requires shared libraries to be built])
fi

Michal Vaner's avatar
Michal Vaner committed
187
188
189
190
191
192
# allow configuring without setproctitle.
AC_ARG_ENABLE(setproctitle-check,
AC_HELP_STRING([--disable-setproctitle-check],
  [do not check for python setproctitle module (used to give nice names to python processes)]),
  setproctitle_check=$enableval, setproctitle_check=yes)

193
194
195
196
# OS dependent configuration
SET_ENV_LIBRARY_PATH=no
ENV_LIBRARY_PATH=LD_LIBRARY_PATH

197
case "$host" in
198
199
200
201
*-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
202
203
	# "now" binding is necessary to prevent deadlocks in C++ static initialization code
	LDFLAGS="$LDFLAGS -z now"
204
205
206
207
	# Destroying locked mutexes, condition variables being waited
	# on, etc. are undefined behavior on Solaris, so we set it as
	# such here.
	AC_DEFINE([HAS_UNDEFINED_PTHREAD_BEHAVIOR], [1], [Does this platform have some undefined pthreads behavior?])
208
	;;
209
*-apple-darwin*)
210
211
212
213
	# Starting with OSX 10.7 (Lion) we must choose which IPv6 API to use
	# (RFC2292 or RFC3542).
	CPPFLAGS="$CPPFLAGS -D__APPLE_USE_RFC_3542"

Jeremy C. Reed's avatar
Jeremy C. Reed committed
214
	# libtool doesn't work perfectly with Darwin: libtool embeds the
215
216
217
218
219
220
221
222
	# final install path in dynamic libraries and our loadable python
	# modules always refer to that path even if it's loaded within the
	# source tree.  This prevents pre-install tests from working.
	# To work around this problem we explicitly specify paths to dynamic
	# libraries when we use them in the source tree.
	SET_ENV_LIBRARY_PATH=yes
	ENV_LIBRARY_PATH=DYLD_LIBRARY_PATH
	;;
223
224
225
*-freebsd*)
	SET_ENV_LIBRARY_PATH=yes
	;;
226
227
228
*-netbsd*)
	SET_ENV_LIBRARY_PATH=yes
	;;
229
230
231
*-openbsd*)
	SET_ENV_LIBRARY_PATH=yes
	;;
232
esac
233
234
235
AM_CONDITIONAL(SET_ENV_LIBRARY_PATH, test $SET_ENV_LIBRARY_PATH = yes)
AC_SUBST(SET_ENV_LIBRARY_PATH)
AC_SUBST(ENV_LIBRARY_PATH)
236

237
m4_define([_AM_PYTHON_INTERPRETER_LIST], [python python3.2 python3.1 python3])
238
239
AC_ARG_WITH([pythonpath],
AC_HELP_STRING([--with-pythonpath=PATH],
240
  [specify an absolute path to python executable when automatic version check (incorrectly) fails]),
241
242
243
244
  [python_path="$withval"], [python_path="auto"])
if test "$python_path" = auto; then
	AM_PATH_PYTHON([3.1])
else
245
246
	# Older versions of automake can't handle python3 well.  This is an
	# in-house workaround for them.
247
248
	PYTHON=$python_path
	AC_SUBST(PYTHON)
249
250
251
252
	PYTHON_PREFIX='${prefix}'
	AC_SUBST(PYTHON_PREFIX)
	PYTHON_EXEC_PREFIX='$(exec_prefix)'
	AC_SUBST(PYTHON_EXEC_PREFIX)
253
254
255
256
	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
257
258
	AC_SUBST(PYTHON_VERSION)
	PYTHON_PLATFORM=`$PYTHON -c "import sys; print(sys.platform)"`
259
	AC_SUBST(PYTHON_PLATFORM)
260
	pythondir='${prefix}/lib/python'$PYTHON_VERSION'/site-packages'
261
	AC_SUBST(pythondir)
262
	pkgpythondir='${pythondir}/'$PACKAGE
263
	AC_SUBST(pkgpythondir)
264
	pyexecdir='${exec_prefix}/lib/python'$PYTHON_VERSION'/site-packages'
265
	AC_SUBST(pyexecdir)
266
	pkgpyexecdir='${pyexecdir}/'$PACKAGE
267
	AC_SUBST(pkgpyexecdir)
268
fi
269

270
271
272
273
274
275
276
277
278
279
# We need to store the default pyexecdir in a separate variable so that
# we can specify in Makefile.am the install directory of various BIND 10
# python scripts and loadable modules; in Makefile.am we cannot replace
# $(pyexecdir) using itself, e.g, this doesn't work:
# pyexecdir = $(pyexecdir)/isc/some_module
# The separate variable makes this setup possible as follows:
# pyexecdir = $(PYTHON_SITEPKG_DIR)/isc/some_module
PYTHON_SITEPKG_DIR=${pyexecdir}
AC_SUBST(PYTHON_SITEPKG_DIR)

280
# This will be commonly used in various Makefile.am's that need to generate
281
282
283
284
285
286
287
288
289
# python log messages.
PYTHON_LOGMSGPKG_DIR="\$(top_builddir)/src/lib/python/isc/log_messages"
AC_SUBST(PYTHON_LOGMSGPKG_DIR)

# This is python package paths commonly used in python tests.  See
# README of log_messages for why it's included.
COMMON_PYTHON_PATH="\$(abs_top_builddir)/src/lib/python/isc/log_messages:\$(abs_top_srcdir)/src/lib/python:\$(abs_top_builddir)/src/lib/python"
AC_SUBST(COMMON_PYTHON_PATH)

290
291
292
# Check for python development environments
if test -x ${PYTHON}-config; then
	PYTHON_INCLUDES=`${PYTHON}-config --includes`
293

294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
	for flag in `${PYTHON}-config --ldflags`; do
		# add any '-L..." flags to PYTHON_LDFLAGS
		flag=`echo $flag | sed -ne 's/^\(\-L.*\)$/\1/p'`
		if test "X${flag}" != X; then
			PYTHON_LDFLAGS="$PYTHON_LDFLAGS ${flag}"
		fi
	done
	# on some platforms, ${PYTHON}-config --ldflags doesn't provide a -L
	# option while having the library under a non trivial directory.
	# as a workaround we try the "lib" sub directory under the common
	# prefix for this python.
	if test -z "${PYTHON_LDFLAGS}"; then
		PYTHON_LDFLAGS="-L`${PYTHON}-config --prefix`/lib"
	fi
else
	if test "X$PYTHON_INCLUDES" = X -o "X$PYTHON_LDFLAGS" = X; then
		AC_MSG_WARN([${PYTHON}-config does not exist or is not executable, so we could not detect python development environment.  Your system may require an additional package (e.g. "python3-dev").  Alternatively, if you are sure you have python headers and libraries, define PYTHON_INCLUDES and PYTHON_LDFLAGS and run this script.])
311
312
	fi
fi
313

314
315
316
317
# Some OSes including NetBSD don't install libpython.so in a well known path.
# To avoid requiring dynamic library path with our python wrapper loadable
# modules, we embed the path to the modules when possible.  We do this even
# when the path is known in the common operational environment (e.g. when
Jeremy C. Reed's avatar
Jeremy C. Reed committed
318
# it's stored in a common "hint" file) for simplicity.
319
if test "x$ISC_RPATH_FLAG" != "x"; then
320
321
	python_rpath=
	for flag in ${PYTHON_LDFLAGS}; do
322
		python_rpath="${python_rpath} `echo $flag | sed -ne "s/^\(\-L\)/${ISC_RPATH_FLAG}/p"`"
323
324
325
326
	done
	PYTHON_LDFLAGS="${PYTHON_LDFLAGS} ${python_rpath}"
fi

327
328
329
AC_SUBST(PYTHON_INCLUDES)
AC_SUBST(PYTHON_LDFLAGS)

330
331
332
333
334
CPPFLAGS_SAVED="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS ${PYTHON_INCLUDES}"
AC_CHECK_HEADERS([Python.h],, AC_MSG_ERROR([Missing Python.h]))
CPPFLAGS="$CPPFLAGS_SAVED"

335
# Check for python library.  Needed for Python-wrapper libraries.
336
337
338
339
340
341
342
343
LDFLAGS_SAVED="$LDFLAGS"
LDFLAGS="$LDFLAGS $PYTHON_LDFLAGS"
python_bin="python${PYTHON_VERSION}"
AC_CHECK_LIB($python_bin, main, python_lib=$python_bin, python_lib=no)
if test $python_lib != "no"; then
	PYTHON_LIB="-l$python_lib"
fi
AC_SUBST(PYTHON_LIB)
344
LDFLAGS=$LDFLAGS_SAVED
345

Michal Vaner's avatar
Michal Vaner committed
346
347
348
349
350
351
352
# Check for the setproctitle module
if test "$setproctitle_check" = "yes" ; then
    AC_MSG_CHECKING(for setproctitle module)
    if "$PYTHON" -c 'import setproctitle' 2>/dev/null ; then
        AC_MSG_RESULT(ok)
    else
        AC_MSG_RESULT(missing)
353
354
355
        AC_MSG_WARN([Missing setproctitle python module.
Use --disable-setproctitle-check to skip this check.
In this case we will continue, but naming of python processes will not work.])
Michal Vaner's avatar
Michal Vaner committed
356
357
358
    fi
fi

359
360
# TODO: check for _sqlite3.py module

361
# (g++ only check)
362
363
364
# Python 3.2 has an unused parameter in one of its headers. This
# has been reported, but not fixed as of yet, so we check if we need
# to set -Wno-unused-parameter.
365
if test "X$GXX" = "Xyes" -a $werror_ok = 1; then
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
	CPPFLAGS_SAVED="$CPPFLAGS"
	CPPFLAGS=${PYTHON_INCLUDES}
	CXXFLAGS_SAVED="$CXXFLAGS"
	CXXFLAGS="$CXXFLAGS $B10_CXXFLAGS -Werror"
	AC_MSG_CHECKING([whether we need -Wno-unused-parameter for python])
	AC_TRY_COMPILE(
		[#include <Python.h>],
		[],
		[AC_MSG_RESULT(no)],
		[
		CXXFLAGS="$CXXFLAGS -Wno-unused-parameter"
		AC_TRY_COMPILE([#include <Python.h>],
		[],
		[AC_MSG_RESULT(yes)
		 PYTHON_CXXFLAGS="${PYTHON_CXXFLAGS} -Wno-unused-parameter"
		 AC_SUBST(PYTHON_CXXFLAGS)
		],
383
		[AC_MSG_ERROR([Can't compile against Python.h.  If you're using MacOS X and have installed Python with Homebrew, see http://bind10.isc.org/wiki/SystemNotesMacOSX])]
384
385
386
387
388
389
390
                )
                ]
	)
	CXXFLAGS="$CXXFLAGS_SAVED"
	CPPFLAGS="$CPPFLAGS_SAVED"
fi

391
# produce PIC unless we disable shared libraries. need this for python bindings.
392
if test $enable_shared != "no" -a "X$GXX" = "Xyes"; then
393
   B10_CXXFLAGS="$B10_CXXFLAGS -fPIC"
394
395
fi

396
397
AC_SUBST(B10_CXXFLAGS)

398
399
# Checks for libraries.

400
401
AC_SEARCH_LIBS(inet_pton, [nsl])
AC_SEARCH_LIBS(recvfrom, [socket])
402
AC_SEARCH_LIBS(nanosleep, [rt])
403

404
405
406
407
408
409
# Checks for header files.

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

410

411
412
413
414
415
416
# Detect OS type (it may be used to do OS-specific things, e.g.
# interface detection in DHCP)
AC_MSG_CHECKING(OS family)
system=`uname -s`
case $system in
    Linux)
417
      OS_TYPE="Linux"
418
419
420
421
422
423
      CPPFLAGS="$CPPFLAGS -DOS_LINUX"
      ;;
    Darwin | FreeBSD | NetBSD | OpenBSD)
      OS_TYPE="BSD"
      CPPFLAGS="$CPPFLAGS -DOS_BSD"
      ;;
424
    SunOS)
425
      OS_TYPE="Solaris"
426
      CPPFLAGS="$CPPFLAGS -DOS_SUN"
427
428
429
430
431
432
433
      ;;
    *)
      OS_TYPE="Unknown"
      AC_MSG_WARN("Unsupported OS: uname returned $system")
      ;;
esac
AC_MSG_RESULT($OS_TYPE)
434
435
436

AM_CONDITIONAL(OS_LINUX, test $OS_TYPE = Linux)
AM_COND_IF([OS_LINUX], [AC_DEFINE([OS_LINUX], [1], [Running on Linux?])])
437
AM_CONDITIONAL(OS_BSD, test $OS_TYPE = BSD)
438
AM_COND_IF([OS_BSD], [AC_DEFINE([OS_BSD], [1], [Running on BSD?])])
439
AM_CONDITIONAL(OS_SOLARIS, test $OS_TYPE = Solaris)
440
AM_COND_IF([OS_SOLARIS], [AC_DEFINE([OS_SOLARIS], [1], [Running on Solaris?])])
441

442
443
444
445
446
447
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)
448
        AC_DEFINE(HAVE_SA_LEN, 1, [Define to 1 if sockaddr has a sa_len member, and corresponding sin_len and sun_len])],
449
450
        AC_MSG_RESULT(no))

451
452
AC_ARG_WITH(pycoverage,
[  --with-pycoverage[=PROGRAM]         enable python code coverage using the specified coverage], pycoverage="$withval", pycoverage="no")
453
454
455
456
457
458
459
460
if test "$pycoverage" = "no" ; then
	# just run the tests normally with python
	PYCOVERAGE_RUN="${PYTHON}"
	USE_PYCOVERAGE="no"
elif test "$pycoverage" = "yes" ; then
	PYCOVERAGE="coverage"
	PYCOVERAGE_RUN="${PYCOVERAGE} run --branch --append"
	USE_PYCOVERAGE="yes"
461
else
462
463
464
	PYCOVERAGE="$pycoverage"
	PYCOVERAGE_RUN="${PYCOVERAGE} run --branch --append"
	USE_PYCOVERAGE="yes"
465
fi
466
AM_CONDITIONAL(ENABLE_PYTHON_COVERAGE, test x$USE_PYCOVERAGE != xno)
467
AC_SUBST(PYCOVERAGE)
Jeremy C. Reed's avatar
Jeremy C. Reed committed
468
AC_SUBST(PYCOVERAGE_RUN)
469
AC_SUBST(USE_PYCOVERAGE)
470

471
enable_gtest="no"
472
GTEST_INCLUDES=
473
474
475
476

AC_ARG_WITH([gtest-source],
            [AS_HELP_STRING([--with-gtest-source=PATH],
                            [location of the Googletest source, defaults to /usr/src/gtest])],
477
            [enable_gtest="yes" ; GTEST_SOURCE="$withval"],
478
479
480
481
482
483
484
            [GTEST_SOURCE="/usr/src/gtest"])

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

485
AC_ARG_WITH(lcov,
486
[  --with-lcov[=PROGRAM]         enable gtest and coverage target using the specified lcov], lcov="$withval", lcov="no")
487
488
489
490

USE_LCOV="no"
if test "$lcov" != "no"; then
	# force gtest if not set
491
	if test "$enable_gtest" = "no"; then
492
493
#		AC_MSG_ERROR("lcov needs gtest for test coverage report")
		AC_MSG_NOTICE([gtest support is now enabled, because used by coverage tests])
494
		enable_gtest="yes"
495
496
	fi
	if test "$lcov" != "yes"; then
497
		LCOV=$lcov
498
	else
499
		AC_PATH_PROG([LCOV], [lcov])
500
	fi
501
502
503
504
	if test -x "${LCOV}"; then
		USE_LCOV="yes"
	else
		AC_MSG_ERROR([Cannot find lcov.])
505
506
507
508
509
510
	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
511
	# GCC specific?
512
	CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
513
	LIBS=" $LIBS -lgcov"
514
515
516
517
518
519
520
	AC_SUBST(CPPFLAGS)
	AC_SUBST(LIBS)
	AC_SUBST(LCOV)
	AC_SUBST(GENHTML)
fi
AC_SUBST(USE_LCOV)

521
522
523
524
# 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
525
526
# is set to that. If not, the value is untouched.
# Does not take absolute paths into account at this point,
527
528
529
530
531
# 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"
532
    IFS=${PATH_SEPARATOR}
533
534
535
536
537
538
    for cur_path in ${PATH} ; do
      if test -e "${cur_path}/$2" ; then
          RESULT="${cur_path}/$2"
      fi
    done
    if test "$RESULT" = "" ; then
539
        :
540
541
542
543
544
545
546
547
        m4_ifvaln([$3], [$1=$3])
    else
        $1=$RESULT
    fi
    IFS="$IFS_SAVED"
])

# Botan helper test function
548
549
# Tries to compile a botan program, given the output of the given
# config tool
550
551
552
553
554
555
556
557
# 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=""
558
559
    ACX_CHECK_PROG_NONCACHE([BOTAN_TOOL], [${TOOL}])
    AC_MSG_CHECKING([usability of ${TOOL} ${TOOL_ARG}])
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
    if test "$BOTAN_TOOL" != "" ; then
        if test -x ${BOTAN_TOOL}; then
            BOTAN_LIBS=`$BOTAN_TOOL $TOOL_ARG --libs`
            LIBS_SAVED=${LIBS}
            LIBS="$LIBS $BOTAN_LIBS"
            BOTAN_INCLUDES=`$BOTAN_TOOL $TOOL_ARG --cflags`
            CPPFLAGS_SAVED=${CPPFLAGS}
            CPPFLAGS="$BOTAN_INCLUDES $CPPFLAGS"
            #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
                ],
580
                [ AC_MSG_RESULT([not usable]) ]
581
582
583
584
585
586
587
588
589
590
591
592
593
594
            )
            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
595
# Check for Botan
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
#
# 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).
#
611
612
613
614
615
616
botan_config="yes"
AC_ARG_WITH([botan-config],
  AC_HELP_STRING([--with-botan-config=PATH],
    [specify the path to the botan-config script]),
    [botan_config="$withval"])
if test "${botan_config}" = "no" ; then
Jelte Jansen's avatar
Jelte Jansen committed
617
    AC_MSG_ERROR([Need botan for libcryptolink])
Jelte Jansen's avatar
Jelte Jansen committed
618
fi
619
620
621
622
623
624
625
if test "${botan_config}" != "yes" ; then
    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
626
    else
627
        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
628
629
    fi
else
630
    BOTAN_CONFIG=""
631
    # first try several possible names of the config script
632
633
    # (botan-config-1.8 is there just in case, the official name change
    # came later)
634
635
    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
636
        ACX_TRY_BOTAN_TOOL([$botan_config],,
637
                           [ BOTAN_CONFIG="$botan_config"  ]
638
639
                          )
        if test "$BOTAN_CONFIG" != "" ; then
640
641
642
            break
        fi
    done
643
    if test "$BOTAN_CONFIG" = "" ; then
644
645
646
647
648
649
650
        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
651
                ACX_TRY_BOTAN_TOOL([pkg-config], ["$version --silence-errors"],
652
                                   [ BOTAN_CONFIG="$PKG_CONFIG $version" ]
653
654
                                  )
            if test "$BOTAN_CONFIG" != "" ; then
655
656
                break
            fi
657
658
            done
        fi
659
    fi
Jelte Jansen's avatar
Jelte Jansen committed
660
fi
661

662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
if test "x${BOTAN_CONFIG}" != "x"
then
    BOTAN_LIBS=`${BOTAN_CONFIG} --libs`
    BOTAN_INCLUDES=`${BOTAN_CONFIG} --cflags`

    # 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).
    # Same for BOTAN_INCLUDES (but using include instead of lib) below.
    if [ ${BOTAN_CONFIG} --prefix >/dev/null 2>&1 ] ; then
        echo ${BOTAN_LIBS} | grep -- -L > /dev/null || \
            BOTAN_LIBS="-L`${BOTAN_CONFIG} --prefix`/lib ${BOTAN_LIBS}"
        echo ${BOTAN_INCLUDES} | grep -- -I > /dev/null || \
            BOTAN_INCLUDES="-I`${BOTAN_CONFIG} --prefix`/include ${BOTAN_INCLUDES}"
    fi
Jelte Jansen's avatar
Jelte Jansen committed
677
fi
678
679
680
681
682
683
684
685
686
# botan-config script (and the way we call pkg-config) returns -L and -l
# as one string, but we need them in separate values
BOTAN_LDFLAGS=
BOTAN_NEWLIBS=
for flag in ${BOTAN_LIBS}; do
    BOTAN_LDFLAGS="${BOTAN_LDFLAGS} `echo $flag | sed -ne '/^\(\-L\)/p'`"
    BOTAN_LIBS="${BOTAN_LIBS} `echo $flag | sed -ne '/^\(\-l\)/p'`"
done

687
# See python_rpath for some info on why we do this
688
if test "x$ISC_RPATH_FLAG" != "x"; then
689
    BOTAN_RPATH=
690
    for flag in ${BOTAN_LIBS}; do
691
            BOTAN_RPATH="${BOTAN_RPATH} `echo $flag | sed -ne "s/^\(\-L\)/${ISC_RPATH_FLAG}/p"`"
692
693
694
695
696
697
698
699
700
701
702
703
704
705
    done
AC_SUBST(BOTAN_RPATH)

# 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="$BOTAN_RPATH $LDFLAGS"
fi

AC_SUBST(BOTAN_LDFLAGS)
706
AC_SUBST(BOTAN_LIBS)
707
AC_SUBST(BOTAN_INCLUDES)
708
709
710
# 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.
711
712
CPPFLAGS_SAVED=$CPPFLAGS
CPPFLAGS="$BOTAN_INCLUDES $CPPFLAGS"
713
LIBS_SAVED="$LIBS"
714
LIBS="$LIBS $BOTAN_LIBS"
Jelte Jansen's avatar
Jelte Jansen committed
715
716
AC_CHECK_HEADERS([botan/botan.h],,AC_MSG_ERROR([Missing required header files.]))
AC_LINK_IFELSE(
717
718
719
        [AC_LANG_PROGRAM([#include <botan/botan.h>
                          #include <botan/hash.h>
                         ],
Jelte Jansen's avatar
Jelte Jansen committed
720
721
                         [using namespace Botan;
                          LibraryInitializer::initialize();
722
                          HashFunction *h = get_hash("MD5");
Jelte Jansen's avatar
Jelte Jansen committed
723
724
725
                         ])],
        [AC_MSG_RESULT([checking for Botan library... yes])],
        [AC_MSG_RESULT([checking for Botan library... no])
726
727
728
729
730
         AC_MSG_ERROR([Needs Botan library 1.8 or higher. On some systems,
         the botan package has a few missing dependencies (libbz2 and
         libgmp), if libbotan has been installed and you see this error,
         try upgrading to a higher version of botan or installing libbz2
         and libgmp.])]
Jelte Jansen's avatar
Jelte Jansen committed
731
)
732
CPPFLAGS=$CPPFLAGS_SAVED
733
LIBS=$LIBS_SAVED
734
735

# Check for MySql.  The path to the mysql_config program is given with
736
737
# the --with-mysql-config (default to /usr/bin/mysql-config).  By default,
# the software is not built with MySQL support enabled.
738
mysql_config="no"
739
740
741
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)]),
742
743
744
745
746
747
748
749
750
    [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
751
752
    if test -d "$MYSQL_CONFIG" -o ! -x "$MYSQL_CONFIG" ; then
        AC_MSG_ERROR([--with-dhcp-mysql should point to a mysql_config program])
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
    fi

    MYSQL_CPPFLAGS=`$MYSQL_CONFIG --cflags`
    MYSQL_LIBS=`$MYSQL_CONFIG --libs`

    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(
769
            [AC_LANG_PROGRAM([#include <mysql.h>],
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
                             [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

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

Jelte Jansen's avatar
Jelte Jansen committed
788

789
790
791
792
793
794
# 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"])
795
if test "${log4cplus_path}" = "no" ; then
796
797
798
    AC_MSG_ERROR([Need log4cplus])
elif test "${log4cplus_path}" != "yes" ; then
  LOG4CPLUS_INCLUDES="-I${log4cplus_path}/include"
799
  LOG4CPLUS_LIBS="-L${log4cplus_path}/lib"
800
801
802
803
804
805
806
else
# If not specified, try some common paths.
	log4cplusdirs="/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"
807
			LOG4CPLUS_LIBS="-L$d/lib"
808
809
810
811
812
			break
		fi
	done
fi

813
LOG4CPLUS_LIBS="$LOG4CPLUS_LIBS -llog4cplus $MULTITHREADING_FLAG"
814

815
AC_SUBST(LOG4CPLUS_LIBS)
816
817
818
819
AC_SUBST(LOG4CPLUS_INCLUDES)

CPPFLAGS_SAVED=$CPPFLAGS
CPPFLAGS="$LOG4CPLUS_INCLUDES $CPPFLAGS"
820
LIBS_SAVED="$LIBS"
821
LIBS="$LOG4CPLUS_LIBS $LIBS"
822
823
824
825
826
827
828
829
830
831
832
833
834
835

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

CPPFLAGS=$CPPFLAGS_SAVED
836
LIBS=$LIBS_SAVED
837

838
839
840
841
#
# Configure Boost header path
#
# If explicitly specified, use it.
842
843
844
845
AC_ARG_WITH([boost-include],
  AC_HELP_STRING([--with-boost-include=PATH],
    [specify exact directory for Boost headers]),
    [boost_include_path="$withval"])
846
847
848
849
850
851
852
853
854
855
856
# If not specified, try some common paths.
if test -z "$with_boost_include"; then
	boostdirs="/usr/local /usr/pkg /opt /opt/local"
	for d in $boostdirs
	do
		if test -f $d/include/boost/shared_ptr.hpp; then
			boost_include_path=$d/include
			break
		fi
	done
fi
857
CPPFLAGS_SAVES="$CPPFLAGS"
858
if test "${boost_include_path}" ; then
859
860
	BOOST_INCLUDES="-I${boost_include_path}"
	CPPFLAGS="$CPPFLAGS $BOOST_INCLUDES"
861
fi
862
AC_CHECK_HEADERS([boost/shared_ptr.hpp boost/foreach.hpp boost/interprocess/sync/interprocess_upgradable_mutex.hpp boost/date_time/posix_time/posix_time_types.hpp boost/bind.hpp boost/function.hpp],,
863
  AC_MSG_ERROR([Missing required header files.]))
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878

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

879
880
881
882
883
884
885
886
887
# Boost offset_ptr is required in one library (not optional right now), and
# it's known it doesn't compile on some platforms, depending on boost version,
# its local configuration, and compiler.
AC_MSG_CHECKING([Boost offset_ptr compiles])
AC_TRY_COMPILE([
#include <boost/interprocess/offset_ptr.hpp>
],,
[AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no)
888
 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.])])
889

890
CPPFLAGS="$CPPFLAGS_SAVES $CPPFLAGS_BOOST_THREADCONF"
891
AC_SUBST(BOOST_INCLUDES)
892

893
894
895
896
897
898
899
# I can't get some of the #include <asio.hpp> right without this
# TODO: find the real cause of asio/boost wanting pthreads
# (this currently only occurs for src/lib/cc/session_unittests)
PTHREAD_LDFLAGS=
AC_CHECK_LIB(pthread, pthread_create,[ PTHREAD_LDFLAGS=-lpthread ], [])
AC_SUBST(PTHREAD_LDFLAGS)
AC_SUBST(MULTITHREADING_FLAG)
900

901
#
902
# Check availability of gtest, which will be used for unit tests.
903
#
904
905
906
GTEST_LDFLAGS=
GTEST_LDADD=
DISTCHECK_GTEST_CONFIGURE_FLAG=
907

908
if test "x$enable_gtest" = "xyes" ; then
909

910
911
    DISTCHECK_GTEST_CONFIGURE_FLAG="--with-gtest=$gtest_path"

912
    if test -n "$with_gtest_source" ; then
913
914
915

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

916
            AC_MSG_CHECKING([for gtest source])
917
            # If not specified, try some common paths.
918
            GTEST_SOURCE=
919
920
921
922
923
924
925
            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
926
            if test -z $GTEST_SOURCE ; then
927
                AC_MSG_ERROR([no gtest source but it was selected])
928
            fi
929
         else
930
            AC_CHECK_FILES([$GTEST_SOURCE/src/gtest-all.cc]
931
932
               [$GTEST_SOURCE/src/gtest_main.cc],
               [have_gtest_source=yes],
933
               [AC_MSG_ERROR([no gtest source at $GTEST_SOURCE])])
934
          fi
935
          have_gtest_source=yes
936
          GTEST_LDFLAGS="\$(top_builddir)/libgtest.a"
937
938
          DISTCHECK_GTEST_CONFIGURE_FLAG="--with-gtest-source=$GTEST_SOURCE"
          GTEST_INCLUDES="-I$GTEST_SOURCE -I$GTEST_SOURCE/include"
939
940
941
942
943
944
945
          # See $GTEST_SOURCE/include/gtest/internal/gtest-port.h
          # about GTEST_HAS_PTHREAD.
          case "$host" in
            *-solaris*|*-linux*|*-hpux*)
                GTEST_LDADD="$GTEST_LDADD $PTHREAD_LDFLAGS"
                ;;
          esac
946
947
        fi

948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
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])
    fi
    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_FOUND="true"
    else
        AC_MSG_WARN([Unable to locate Google Test gtest-config.])
        if test -z "${GTEST_PATHS}" ; then
            GTEST_PATHS="/usr /usr/local"
        fi
        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"
                # There is no gtest-config script on this
                # system, which is supposed to inform us
                # whether we need pthreads as well (a
                # gtest compile-time option). So we still
                # need to test that manually.
                CPPFLAGS_SAVED="$CPPFLAGS"
                CPPFLAGS="$CPPFLAGS $GTEST_INCLUDES"
                LDFLAGS_SAVED="$LDFLAGS"
                LDFLAGS="$LDFLAGS $GTEST_LDFLAGS"
                LIBS_SAVED=$LIBS
                LIBS="$LIBS $GTEST_LDADD"
                AC_MSG_CHECKING([Checking whether gtest tests need pthreads])
                # First try to compile without pthreads
                AC_TRY_LINK([
                    #include <gtest/gtest.h>
                    ],[
                        int i = 0;
                        char* c = NULL;
                        ::testing::InitGoogleTest(&i, &c);
                        return (0);
                    ],
                    [ AC_MSG_RESULT(no) ],
                    [
                        LIBS="$SAVED_LIBS $GTEST_LDADD $PTHREAD_LDFLAGS"
                        # Now try to compile with pthreads
                        AC_TRY_LINK([
                            #include <gtest/gtest.h>
                            ],[
                                int i = 0;
                                char* c = NULL;
                                ::testing::InitGoogleTest(&i, &c);
                                return (0);
                            ],
                            [ AC_MSG_RESULT(yes)
                              GTEST_LDADD="$GTEST_LDADD $PTHREAD_LDFLAGS"
                            ],
                            # Apparently we can't compile it at all
                            [ AC_MSG_ERROR(unable to compile with gtest) ])
                ])
                CPPFLAGS=$CPPFLAGS_SAVED
                LDFLAGS=$LDFLAGS_SAVED
                LIBS=$LIBS_SAVED
                break
            fi
        done
    fi
    if test "${GTEST_FOUND}" != "true"; then
        AC_MSG_ERROR([Cannot find gtest in: $GTEST_PATHS])
    fi
1027
1028

  fi
1029
fi
1030
1031
AM_CONDITIONAL(HAVE_GTEST, test $enable_gtest != "no")
AM_CONDITIONAL(HAVE_GTEST_SOURCE, test "X$have_gtest_source" = "Xyes")
1032
AC_SUBST(DISTCHECK_GTEST_CONFIGURE_FLAG)
1033
1034
1035
AC_SUBST(GTEST_INCLUDES)
AC_SUBST(GTEST_LDFLAGS)
AC_SUBST(GTEST_LDADD)
1036
AC_SUBST(GTEST_SOURCE)
1037

1038
1039
1040
1041
1042
dnl check for pkg-config itself so we don't try the m4 macro without pkg-config
AC_CHECK_PROG(HAVE_PKG_CONFIG, pkg-config, yes, no)
if test "x$HAVE_PKG_CONFIG" = "xno" ; then
  AC_MSG_ERROR(Please install pkg-config)
fi
1043
PKG_CHECK_MODULES(SQLITE, sqlite3 >= 3.3.9, enable_features="$enable_features SQLite3")
1044

1045
1046
1047
#
# ASIO: we extensively use it as the C++ event management module.
#
1048
# Use local ASIO headers from ext
1049
#
1050
CPPFLAGS="$CPPFLAGS -I\$(top_srcdir)/ext/asio"
1051
#
1052
1053
1054
# Use our 'coroutine' header from ext
CPPFLAGS="$CPPFLAGS -I\$(top_srcdir)/ext/coroutine"
#
1055
1056
# Disable threads: Currently we don't use them.
CPPFLAGS="$CPPFLAGS -DASIO_DISABLE_THREADS=1"
1057

1058
# Check for functions that are not available on all platforms
1059
1060
AC_CHECK_FUNCS([pselect])

1061
1062
1063
1064
# /dev/poll issue: ASIO uses /dev/poll by default if it's available (generally
# the case with Solaris).  Unfortunately its /dev/poll specific code would
# trigger the gcc's "missing-field-initializers" warning, which would
# subsequently make the build fail with -Werror.  Further, older versions of
1065
# gcc don't provide an option to selectively suppress this warning.
1066
1067
1068
# So, for the moment, we simply disable the use of /dev/poll.  Unless we
# implement recursive DNS server with randomized ports, we don't need the
# scalability that /dev/poll can provide, so this decision wouldn't affect
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1069
# run time performance.  Hopefully we can find a better solution or the ASIO
1070
1071
# code will be updated by the time we really need it.
AC_CHECK_HEADERS(sys/devpoll.h, ac_cv_have_devpoll=yes, ac_cv_have_devpoll=no)
1072
if test "X$ac_cv_have_devpoll" = "Xyes" -a "X$GXX" = "Xyes"; then
1073
1074
	CPPFLAGS="$CPPFLAGS -DASIO_DISABLE_DEV_POLL=1"
fi
1075

1076
1077
1078
1079
1080
#
# Perl is optional; it is used only by some of the system test scripts.
#
AC_PATH_PROGS(PERL, perl5 perl)
AC_SUBST(PERL)
1081
1082
AC_PATH_PROGS(AWK, gawk awk)
AC_SUBST(AWK)
1083

1084
1085
1086
AC_ARG_ENABLE(generate_docs, [AC_HELP_STRING([--enable-generate-docs],
  [regenerate documentation using Docbook [default=no]])],
  enable_generate_docs=$enableval, enable_generate_docs=no)
1087
1088

# Check for xsltproc
1089
if test "x$enable_generate_docs" != xno ; then
1090
1091
  AC_PATH_PROG([XSLTPROC], [xsltproc])
  if test -z "$XSLTPROC"; then
1092
    AC_MSG_ERROR("xsltproc not found; it is required for --enable-generate-docs")
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
  else
    AC_MSG_CHECKING([if $XSLTPROC works])
    # run xsltproc to see if works
    $XSLTPROC --novalid --xinclude --nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl
    if test $? -ne 0 ; then
      AC_MSG_ERROR("Error with $XSLTPROC using release/xsl/current/manpages/docbook.xsl")
    fi
    $XSLTPROC --novalid --xinclude --nonet http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl
    if test $? -ne 0 ; then
      AC_MSG_ERROR("Error with $XSLTPROC using release/xsl/current/html/docbook.xsl")
    fi
1104
    AC_MSG_RESULT(yes)
1105
1106
1107
  fi
fi

1108

1109
AM_CONDITIONAL(GENERATE_DOCS, test x$enable_generate_docs != xno)
1110

1111
1112
1113
AC_ARG_ENABLE(install-configurations,
  [AC_HELP_STRING([--disable-install-configurations],
  [do not install configuration])], install_configurations=$enableval, install_configurations=yes)
1114

1115
AM_CONDITIONAL(INSTALL_CONFIGURATIONS, test x$install_configurations = xyes || test x$install_configurations = xtrue)
1116

1117
1118
1119
1120
1121
AC_ARG_ENABLE(logger-checks, [AC_HELP_STRING([--enable-logger-checks],
  [check logger messages [default=no]])], enable_logger_checks=$enableval, enable_logger_checks=no)
AM_CONDITIONAL(ENABLE_LOGGER_CHECKS, test x$enable_logger_checks != xno)
AM_COND_IF([ENABLE_LOGGER_CHECKS], [AC_DEFINE([ENABLE_LOGGER_CHECKS], [1], [Check logger messages?])])

1122
1123
1124
1125
# Check for valgrind
AC_PATH_PROG(VALGRIND, valgrind, no)
AM_CONDITIONAL(HAVE_VALGRIND, test "x$VALGRIND" != "xno")

1126
1127
1128
1129
1130
1131
1132
# Also check for valgrind headers
# We could consider adding them to the source code tree, as this
# is the encouraged method of using them; they are BSD-licensed.
# However, until we find that this is a problem, we just use
# the system-provided ones, if available
AC_CHECK_HEADERS(valgrind/valgrind.h, [AC_DEFINE([HAVE_VALGRIND_HEADERS], [1], [Check valgrind headers])])

1133
1134
1135
found_valgrind="not found"
if test "x$VALGRIND" != "xno"; then
   found_valgrind="found"
1136
1137
fi

1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
# Check for optreset in unistd.h. On BSD systems the optreset is
# used to reset the state of getopt() function. Resetting its state
# is required if command line arguments are parsed multiple times
# during a program. On Linux this variable will not exist because
# getopt() reset is performed by setting optind = 0. On Operating
# Systems where optreset is defined use optreset = 1 and optind = 1
# to reset internal state of getopt(). Failing to do so will result
# in unpredictable output from getopt().
AC_MSG_CHECKING([whether optreset variable is defined in unistd.h])
AC_TRY_LINK(
    [#include <unistd.h>],
1149
    [extern int optreset; optreset=1;],
1150
1151
1152
1153
1154
1155
    [ AC_MSG_RESULT(yes)
      var_optreset_exists=yes],
    [ AC_MSG_RESULT(no)
      var_optreset_exists=no]
)
AM_CONDITIONAL(HAVE_OPTRESET, test "x$var_optreset_exists" != "xno")
1156
AM_COND_IF([HAVE_OPTRESET], [AC_DEFINE([HAVE_OPTRESET], [1], [Check for optreset?])])
1157

1158
AC_CONFIG_FILES([Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1159
                 doc/Makefile
1160
                 doc/guide/Makefile
1161
                 compatcheck/Makefile
1162
                 src/Makefile
1163
                 src/bin/Makefile
1164
                 src/bin/bind10/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1165
                 src/bin/bind10/tests/Makefile
Jelte Jansen's avatar
Jelte Jansen committed
1166
                 src/bin/cmdctl/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1167
                 src/bin/cmdctl/tests/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1168
                 src/bin/bindctl/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1169
                 src/bin/bindctl/tests/Makefile
Jelte Jansen's avatar
Jelte Jansen committed
1170
                 src/bin/cfgmgr/Makefile
1171
                 src/bin/cfgmgr/local_plugins/Makefile
1172
                 src/bin/cfgmgr/plugins/Makefile
1173
                 src/bin/cfgmgr/plugins/tests/Makefile
Jelte Jansen's avatar
Jelte Jansen committed
1174
                 src/bin/cfgmgr/tests/Makefile
1175
1176
                 src/bin/dbutil/Makefile
                 src/bin/dbutil/tests/Makefile
Stephen Morris's avatar
Stephen Morris committed
1177
                 src/bin/dbutil/tests/testdata/Makefile
Evan Hunt's avatar
Evan Hunt committed
1178
                 src/bin/loadzone/Makefile
1179
                 src/bin/loadzone/tests/Makefile
1180
                 src/bin/loadzone/tests/correct/Makefile
1181
                 src/bin/msgq/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1182
                 src/bin/msgq/tests/Makefile
1183
                 src/bin/auth/Makefile
JINMEI Tatuya's avatar
JINMEI Tatuya committed
1184
                 src/bin/auth/tests/Makefile
1185
                 src/bin/auth/tests/testdata/Makefile
JINMEI Tatuya's avatar
JINMEI Tatuya committed
1186
                 src/bin/auth/benchmarks/Makefile
1187
1188
                 src/bin/ddns/Makefile
                 src/bin/ddns/tests/Makefile
1189
                 src/bin/dhcp6/Makefile
1190
                 src/bin/dhcp6/tests/Makefile
1191
1192
                 src/bin/dhcp4/Makefile
                 src/bin/dhcp4/tests/Makefile
1193
1194
                 src/bin/resolver/Makefile
                 src/bin/resolver/tests/Makefile
1195
                 src/bin/sysinfo/Makefile
1196
1197
                 src/bin/sockcreator/Makefile
                 src/bin/sockcreator/tests/Makefile
Likun Zhang's avatar
Likun Zhang committed
1198
                 src/bin/xfrin/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1199
                 src/bin/xfrin/tests/Makefile
1200
                 src/bin/xfrin/tests/testdata/Makefile
1201
                 src/bin/xfrout/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1202
                 src/bin/xfrout/tests/Makefile
1203
1204
                 src/bin/zonemgr/Makefile
                 src/bin/zonemgr/tests/Makefile
1205
1206
                 src/bin/stats/Makefile
                 src/bin/stats/tests/Makefile
1207
                 src/bin/stats/tests/testdata/Makefile
1208
                 src/bin/usermgr/Makefile
Michal Vaner's avatar
Michal Vaner committed
1209
                 src/bin/tests/Makefile
1210
                 src/lib/Makefile
1211
1212
                 src/lib/asiolink/Makefile
                 src/lib/asiolink/tests/Makefile
Ocean Wang's avatar
Ocean Wang committed
1213
                 src/lib/asiodns/Makefile
1214
                 src/lib/asiodns/tests/Makefile
JINMEI Tatuya's avatar
JINMEI Tatuya committed
1215
1216
1217
                 src/lib/bench/Makefile
                 src/lib/bench/example/Makefile
                 src/lib/bench/tests/Makefile
1218
                 src/lib/cc/Makefile
JINMEI Tatuya's avatar
JINMEI Tatuya committed
1219
                 src/lib/cc/tests/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1220
1221
                 src/lib/python/Makefile
                 src/lib/python/isc/Makefile
1222
1223
                 src/lib/python/isc/acl/Makefile
                 src/lib/python/isc/acl/tests/Makefile
1224
1225
                 src/lib/python/isc/util/Makefile
                 src/lib/python/isc/util/tests/Makefile
Michal 'vorner' Vaner's avatar
Michal 'vorner' Vaner committed
1226
1227
                 src/lib/python/isc/util/cio/Makefile
                 src/lib/python/isc/util/cio/tests/Makefile
Evan Hunt's avatar
Evan Hunt committed
1228
                 src/lib/python/isc/datasrc/Makefile
1229
                 src/lib/python/isc/datasrc/tests/Makefile
1230
                 src/lib/python/isc/dns/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1231
                 src/lib/python/isc/cc/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1232
                 src/lib/python/isc/cc/tests/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1233
                 src/lib/python/isc/config/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1234
                 src/lib/python/isc/config/tests/Makefile
1235
1236
                 src/lib/python/isc/log/Makefile
                 src/lib/python/isc/log/tests/Makefile
1237
1238
                 src/lib/python/isc/log_messages/Makefile
                 src/lib/python/isc/log_messages/work/Makefile
1239
                 src/lib/python/isc/net/Makefile
Michal Vaner's avatar
Michal Vaner committed
1240
                 src/lib/python/isc/net/tests/Makefile
1241
1242
                 src/lib/python/isc/notify/Makefile
                 src/lib/python/isc/notify/tests/Makefile
1243
                 src/lib/python/isc/testutils/Makefile
1244
1245
                 src/lib/python/isc/bind10/Makefile
                 src/lib/python/isc/bind10/tests/Makefile
1246
1247
                 src/lib/python/isc/ddns/Makefile
                 src/lib/python/isc/ddns/tests/Makefile
1248
1249
                 src/lib/python/isc/xfrin/Makefile
                 src/lib/python/isc/xfrin/tests/Makefile
1250
1251
                 src/lib/python/isc/server_common/Makefile
                 src/lib/python/isc/server_common/tests/Makefile
1252
                 src/lib/python/isc/sysinfo/Makefile
1253
                 src/lib/python/isc/sysinfo/tests/Makefile
1254
                 src/lib/config/Makefile
1255
                 src/lib/config/tests/Makefile
1256
                 src/lib/config/tests/testdata/Makefile
1257
1258
                 src/lib/cryptolink/Makefile
                 src/lib/cryptolink/tests/Makefile
Jelte Jansen's avatar
Jelte Jansen committed
1259
                 src/lib/dns/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
1260
                 src/lib/dns/tests/Makefile
1261
                 src/lib/dns/tests/testdata/Makefile
1262
                 src/lib/dns/python/Makefile