configure.ac 60 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, 0.9.1-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
76
# Libtool configuration
#
Jelte Jansen's avatar
Jelte Jansen committed
77
78
79

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

83
84
# On FreeBSD (and probably some others), clang++ does not meet an autoconf
# assumption in identifying libtool configuration regarding shared library:
85
86
87
88
89
# 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).
90
91
92
93
94
# 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
95
CXXFLAGS_SAVED=$CXXFLAGS
96
CFLAGS="$CFLAGS $CXX_LIBTOOL_LDFLAGS"
97
CXXFLAGS="$CXXFLAGS $CXX_LIBTOOL_LDFLAGS"
98
LT_INIT
99
CFLAGS=$CFLAGS_SAVED
100
CXXFLAGS=$CXXFLAGS_SAVED
101

102
# Use C++ language
103
104
105
AC_LANG([C++])

# Identify the compiler: this check must be after AC_PROG_CXX and AC_LANG.
106
AM_CONDITIONAL(USE_GXX, test "X${GXX}" = "Xyes")
107
AC_CHECK_DECL([__SUNPRO_CC], [SUNCXX="yes"], [SUNCXX="no"])
108
109
AC_CHECK_DECL([__clang__], [CLANGPP="yes"], [CLANGPP="no"])
AM_CONDITIONAL(USE_CLANGPP, test "X${CLANGPP}" = "Xyes")
110

111
dnl Determine if we are using GNU sed
112
GNU_SED=no
113
$SED --version 2> /dev/null | grep GNU > /dev/null 2>&1
114
115
116
117
if test $? -eq 0; then
  GNU_SED=yes
fi

118
119
# Linker options

120
# check -R, "-Wl,-R" or -rpath
121
AX_ISC_RPATH
122

123
# Compiler dependent settings: define some mandatory CXXFLAGS here.
124
# We also use a separate variable KEA_CXXFLAGS.  This will (and should) be
125
# used as the default value for each specific AM_CXXFLAGS:
126
# AM_CXXFLAGS = $(KEA_CXXFLAGS)
127
128
129
130
131
132
133
134
# 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.
135
AC_DEFUN([KEA_CXX_TRY_FLAG], [
136
137
  AC_MSG_CHECKING([whether $CXX supports $1])

138
  kea_save_CXXFLAGS="$CXXFLAGS"
139
140
141
  CXXFLAGS="$CXXFLAGS $1"

  AC_LINK_IFELSE([AC_LANG_SOURCE([int main(void){ return 0;}])],
142
143
                 [kea_cxx_flag=yes], [kea_cxx_flag=no])
  CXXFLAGS="$kea_save_CXXFLAGS"
144

145
  if test "x$kea_cxx_flag" = "xyes"; then
146
147
148
149
150
    ifelse([$2], , :, [$2])
  else
    ifelse([$3], , :, [$3])
  fi

151
  AC_MSG_RESULT([$kea_cxx_flag])
152
153
])

154
155
CXX_VERSION="unknown"

156
157
158
# SunStudio compiler requires special compiler options for boost
# (http://blogs.sun.com/sga/entry/boost_mini_howto)
if test "$SUNCXX" = "yes"; then
159
CXX_VERSION=`$CXX -V 2> /dev/null | head -1`
160
161
162
163
164
165
166
167
168
169
170
171
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
172
CXX_VERSION=`$CXX --version 2> /dev/null | head -1`
173
KEA_CXXFLAGS="$KEA_CXXFLAGS -Qunused-arguments"
174
175
fi

176
KEA_CXX_TRY_FLAG([-Wno-missing-field-initializers],
177
178
179
180
181
	[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
182
CXX_VERSION=`$CXX --version 2> /dev/null | head -1`
183
KEA_CXXFLAGS="$KEA_CXXFLAGS -Wall -Wextra -Wnon-virtual-dtor -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare"
184
185
186
187
case "$host" in
*-solaris*)
	MULTITHREADING_FLAG=-pthreads
	# In Solaris, IN6ADDR_ANY_INIT and IN6ADDR_LOOPBACK_INIT need -Wno-missing-braces
188
	KEA_CXXFLAGS="$KEA_CXXFLAGS -Wno-missing-braces"
189
	;;
190
191
192
*-apple-darwin*)
	MULTITHREADING_FLAG=
	;;
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
*)
	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"
216
   CXXFLAGS="$CXXFLAGS $KEA_CXXFLAGS -Werror"
217
   AC_MSG_CHECKING(for in-TU anonymous namespace breakage)
218
219
220
221
   # 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_;};} ],,
222
223
	[AC_MSG_RESULT(no)
	 werror_ok=1
224
	 KEA_CXXFLAGS="$KEA_CXXFLAGS -Werror"],
225
226
227
228
	[AC_MSG_RESULT(yes)])
   CXXFLAGS="$CXXFLAGS_SAVED"
fi

229
230
fi				dnl GXX = yes

JINMEI Tatuya's avatar
JINMEI Tatuya committed
231
232
233
234
235
236
237
# 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)
238
AM_COND_IF([USE_STATIC_LINK], [AC_DEFINE([USE_STATIC_LINK], [1], [Was Kea statically linked?])])
JINMEI Tatuya's avatar
JINMEI Tatuya committed
239

JINMEI Tatuya's avatar
JINMEI Tatuya committed
240
241
242
243
244
# 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
245
	AC_MSG_ERROR([Kea requires shared libraries to be built])
JINMEI Tatuya's avatar
JINMEI Tatuya committed
246
247
fi

248
249
250
# OS dependent configuration
SET_ENV_LIBRARY_PATH=no
ENV_LIBRARY_PATH=LD_LIBRARY_PATH
251
kea_undefined_pthread_behavior=no
252

253
case "$host" in
254
255
256
257
*-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
258
259
	# "now" binding is necessary to prevent deadlocks in C++ static initialization code
	LDFLAGS="$LDFLAGS -z now"
260
261
262
	# Destroying locked mutexes, condition variables being waited
	# on, etc. are undefined behavior on Solaris, so we set it as
	# such here.
263
	kea_undefined_pthread_behavior=yes
264
	;;
265
*-apple-darwin*)
266
267
268
269
	# Starting with OSX 10.7 (Lion) we must choose which IPv6 API to use
	# (RFC2292 or RFC3542).
	CPPFLAGS="$CPPFLAGS -D__APPLE_USE_RFC_3542"

270
271
	# 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.
272
273
274
275
276
277
278
279
280
281
282
283
	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])
284

Jeremy C. Reed's avatar
Jeremy C. Reed committed
285
	# libtool doesn't work perfectly with Darwin: libtool embeds the
286
287
288
289
290
291
292
293
	# 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
	;;
294
*-freebsd*)
295
296
297
298
299
300
301
302
303
304
305
	# 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

306
307
	SET_ENV_LIBRARY_PATH=yes
	;;
308
309
310
*-netbsd*)
	SET_ENV_LIBRARY_PATH=yes
	;;
311
312
313
*-openbsd*)
	SET_ENV_LIBRARY_PATH=yes
	;;
314
esac
315
316
317
AM_CONDITIONAL(SET_ENV_LIBRARY_PATH, test $SET_ENV_LIBRARY_PATH = yes)
AC_SUBST(SET_ENV_LIBRARY_PATH)
AC_SUBST(ENV_LIBRARY_PATH)
318
if [ test $kea_undefined_pthread_behavior = "yes" ]; then
319
320
   AC_DEFINE([HAS_UNDEFINED_PTHREAD_BEHAVIOR], [1], [Does this platform have some undefined pthreads behavior?])
fi
321

322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
# 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

337
m4_define([_AM_PYTHON_INTERPRETER_LIST], [python python3.4 python3.3 python3.2 python3.1 python3])
338
339
AC_ARG_WITH([pythonpath],
AC_HELP_STRING([--with-pythonpath=PATH],
340
  [specify an absolute path to python executable when automatic version check (incorrectly) fails]),
341
342
  [python_path="$withval"], [python_path="auto"])
if test "$python_path" = auto; then
343
	AM_PATH_PYTHON([3.1],,[PYTHON=no])
344
else
345
346
	# Older versions of automake can't handle python3 well.  This is an
	# in-house workaround for them.
347
348
	PYTHON=$python_path
	AC_SUBST(PYTHON)
349
350
351
352
	PYTHON_PREFIX='${prefix}'
	AC_SUBST(PYTHON_PREFIX)
	PYTHON_EXEC_PREFIX='$(exec_prefix)'
	AC_SUBST(PYTHON_EXEC_PREFIX)
353
354
355
356
	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
357
358
	AC_SUBST(PYTHON_VERSION)
	PYTHON_PLATFORM=`$PYTHON -c "import sys; print(sys.platform)"`
359
	AC_SUBST(PYTHON_PLATFORM)
360
	pythondir='${prefix}/lib/python'$PYTHON_VERSION'/site-packages'
361
	AC_SUBST(pythondir)
362
	pkgpythondir='${pythondir}/'$PACKAGE
363
	AC_SUBST(pkgpythondir)
364
	pyexecdir='${exec_prefix}/lib/python'$PYTHON_VERSION'/site-packages'
365
	AC_SUBST(pyexecdir)
366
	pkgpyexecdir='${pyexecdir}/'$PACKAGE
367
	AC_SUBST(pkgpyexecdir)
368
fi
369

370
# produce PIC unless we disable shared libraries. need this for python bindings.
371
if test $enable_shared != "no" -a "X$GXX" = "Xyes"; then
372
   KEA_CXXFLAGS="$KEA_CXXFLAGS -fPIC"
373
374
fi

375
AC_SUBST(KEA_CXXFLAGS)
376

377
378
# Checks for libraries.

379
380
AC_SEARCH_LIBS(inet_pton, [nsl])
AC_SEARCH_LIBS(recvfrom, [socket])
381
AC_SEARCH_LIBS(nanosleep, [rt])
382
AC_SEARCH_LIBS(dlsym, [dl])
383

384
385
386
387
388
389
# Checks for header files.

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

390

391
392
# Detect OS type (it may be used to do OS-specific things, e.g.
# interface detection in DHCP)
393
AC_MSG_CHECKING(OS type)
394
BSD_TYPE="notaBSD"
395
396
397
case $host in
    *-linux*)
      AC_DEFINE([OS_LINUX], [1], [Running on Linux?])
398
      OS_TYPE="Linux"
399
400
      CPPFLAGS="$CPPFLAGS -DOS_LINUX"
      ;;
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
    *-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?])
425
      OS_TYPE="BSD"
426
      BSD_TYPE="OpenBSD"
427
428
      CPPFLAGS="$CPPFLAGS -DOS_BSD"
      ;;
429
430
    *-solaris*)
      AC_DEFINE([OS_SOLARIS], [1], [Running on Solaris?])
431
      OS_TYPE="Solaris"
432
      CPPFLAGS="$CPPFLAGS -DOS_SUN"
433
434
435
      ;;
    *)
      OS_TYPE="Unknown"
436
437
      # $host_os is more user friendly than full $host
      AC_MSG_WARN("Unsupported OS: $host_os")
438
439
440
      ;;
esac
AC_MSG_RESULT($OS_TYPE)
441
442

AM_CONDITIONAL(OS_LINUX, test $OS_TYPE = Linux)
443
444
AM_CONDITIONAL(OS_BSD, test $OS_TYPE = BSD)
AM_CONDITIONAL(OS_SOLARIS, test $OS_TYPE = Solaris)
445
446
447
448
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)
449
450


451
452
453
454
455
456
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)
457
        AC_DEFINE(HAVE_SA_LEN, 1, [Define to 1 if sockaddr has a sa_len member, and corresponding sin_len and sun_len])],
458
459
        AC_MSG_RESULT(no))

460
enable_gtest="no"
461
GTEST_INCLUDES=
462
463
464

AC_ARG_WITH([gtest-source],
            [AS_HELP_STRING([--with-gtest-source=PATH],
465
466
                            [location of the Googletest source])],
            [enable_gtest="yes" ; GTEST_SOURCE="$withval"])
467
468
469
470
471
472

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

473
AC_ARG_WITH(lcov,
474
[  --with-lcov[=PROGRAM]         enable gtest and coverage target using the specified lcov], lcov="$withval", lcov="no")
475
476
477
478

USE_LCOV="no"
if test "$lcov" != "no"; then
	# force gtest if not set
479
	if test "$enable_gtest" = "no"; then
480
481
#		AC_MSG_ERROR("lcov needs gtest for test coverage report")
		AC_MSG_NOTICE([gtest support is now enabled, because used by coverage tests])
482
		enable_gtest="yes"
483
484
	fi
	if test "$lcov" != "yes"; then
485
		LCOV=$lcov
486
	else
487
		AC_PATH_PROG([LCOV], [lcov])
488
	fi
489
490
491
492
	if test -x "${LCOV}"; then
		USE_LCOV="yes"
	else
		AC_MSG_ERROR([Cannot find lcov.])
493
494
	fi
	# is genhtml always in the same directory?
Jelte Jansen's avatar
Jelte Jansen committed
495
	GENHTML=`echo "$LCOV" | ${SED} s/lcov$/genhtml/`
496
497
498
	if test ! -x $GENHTML; then
		AC_MSG_ERROR([genhtml not found, needed for lcov])
	fi
499
	# GCC specific?
500
	CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
501
	LIBS=" $LIBS -lgcov"
502
503
504
505
506
507
508
	AC_SUBST(CPPFLAGS)
	AC_SUBST(LIBS)
	AC_SUBST(LCOV)
	AC_SUBST(GENHTML)
fi
AC_SUBST(USE_LCOV)

509
510
511
512
# 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
513
514
# is set to that. If not, the value is untouched.
# Does not take absolute paths into account at this point,
515
516
517
518
519
# 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"
520
    IFS=${PATH_SEPARATOR}
521
522
523
524
525
526
    for cur_path in ${PATH} ; do
      if test -e "${cur_path}/$2" ; then
          RESULT="${cur_path}/$2"
      fi
    done
    if test "$RESULT" = "" ; then
527
        :
528
529
530
531
532
533
534
        m4_ifvaln([$3], [$1=$3])
    else
        $1=$RESULT
    fi
    IFS="$IFS_SAVED"
])

535
536
537
538
539
540
541
# 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"])

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

661
662
if test "x${BOTAN_CONFIG}" != "x"
then
663
664
    CRYPTO_LIBS=`${BOTAN_CONFIG} --libs`
    CRYPTO_INCLUDES=`${BOTAN_CONFIG} --cflags`
665
666
667
668

    # 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).
669
    # Same for CRYPTO_INCLUDES (but using include instead of lib) below.
670
    if [ ${BOTAN_CONFIG} --prefix >/dev/null 2>&1 ] ; then
671
672
673
674
        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}"
675
    fi
Jelte Jansen's avatar
Jelte Jansen committed
676
fi
677

678
679
680
681
682
if test "x${CRYPTO_LIBS}" != "x"
then
   dnl Determine the Botan version
   AC_MSG_CHECKING([Botan version])
   cat > conftest.cpp << EOF
683
684
685
686
#include <botan/version.h>
AUTOCONF_BOTAN_VERSION=BOTAN_VERSION_MAJOR . BOTAN_VERSION_MINOR . BOTAN_VERSION_PATCH
EOF

687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
   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=""
736
	if test "x$ac_header_preproc" = "xyes"; then
737
		AC_MSG_RESULT([
738
739
740
741
742
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.])
743
	else
744
		AC_MSG_RESULT([Missing required header files.])
745
	fi]
746
747
748
749
750
751
752
753
754
755
756
757
   )
   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(
758
759
760
        [AC_LANG_PROGRAM([#include <botan/botan.h>
                          #include <botan/hash.h>
                         ],
Jelte Jansen's avatar
Jelte Jansen committed
761
762
                         [using namespace Botan;
                          LibraryInitializer::initialize();
763
                          HashFunction *h = get_hash("MD5");
Jelte Jansen's avatar
Jelte Jansen committed
764
765
766
                         ])],
        [AC_MSG_RESULT([checking for Botan library... yes])],
        [AC_MSG_RESULT([checking for Botan library... no])
767
768
769
770
771
         CRYPTO_INCLUDES=""
         CRYPTO_LIBS=""
         CRYPTO_LDFLAGS=""
         CRYPTO_RPATH=""
         AC_MSG_RESULT([Needs Botan library 1.8 or higher. On some systems,
772
         the botan package has a few missing dependencies (libbz2 and
773
         libgmp), if libbotan has been installed and you see this message,
774
775
         try upgrading to a higher version of botan or installing libbz2
         and libgmp.])]
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
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
   )
   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=""
   DISTCHECK_CRYPTO_CONFIGURE_FLAG="--with-botan=$botan_config"
   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=""
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
    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}
883
884
885
886
887
888
889
890
891
892
893
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)
894
895

# Check for MySql.  The path to the mysql_config program is given with
896
897
# the --with-mysql-config (default to /usr/bin/mysql-config).  By default,
# the software is not built with MySQL support enabled.
898
mysql_config="no"
899
900
901
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)]),
902
903
904
905
906
907
908
909
910
    [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
911
912
    if test -d "$MYSQL_CONFIG" -o ! -x "$MYSQL_CONFIG" ; then
        AC_MSG_ERROR([--with-dhcp-mysql should point to a mysql_config program])
913
914
915
916
    fi

    MYSQL_CPPFLAGS=`$MYSQL_CONFIG --cflags`
    MYSQL_LIBS=`$MYSQL_CONFIG --libs`
917
    MYSQL_VERSION=`$MYSQL_CONFIG --version`
918
919
920
921
922
923
924
925
926
927
928
929

    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(
930
            [AC_LANG_PROGRAM([#include <mysql.h>],
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
                             [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

946
# Solaris puts FIONREAD in filio.h
947
AC_CHECK_HEADERS(sys/filio.h,,,)
948

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

952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
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`
971
972
    PGSQL_INCLUDEDIR_SERVER=`$PG_CONFIG --includedir-server`
    PGSQL_CPPFLAGS="$PGSQL_CPPFLAGS -I$PGSQL_INCLUDEDIR -I$PGSQL_INCLUDEDIR_SERVER"
973
974
    PGSQL_LIBS=`$PG_CONFIG --libdir`
    PGSQL_LIBS="-L$PGSQL_LIBS -lpq"
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
    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])]
    )

996
    AC_CHECK_HEADERS([utils/errcodes.h],,
997
    AC_MSG_ERROR([Missing required header file (errcodes.h) from PostgreSQL server-development package]))
998

999
1000
    CPPFLAGS=$CPPFLAGS_SAVED
    LIBS=$LIBS_SAVED