Log parameter to GlassTable::close()
[xapian.git] / xapian-core / configure.ac
blob687d33c4ee81913b9144dda9e311f42a96a5816d
1 dnl Process this file with autoconf to produce a configure script.
3 dnl NB When updating the version for a release, update LIBRARY_VERSION_INFO
4 dnl below too.
5 AC_INIT([xapian-core], [1.3.3], [http://xapian.org/bugs])
6 dnl See HACKING document for details of the reasons for required versions.
7 AC_PREREQ([2.64])
8 dnl Extract from the libtool info manual:
9 dnl
10 dnl Here are a set of rules to help you update your library version information:
11 dnl
12 dnl 1. Start with version information of '0:0:0' for each libtool library.
13 dnl
14 dnl 2. Update the version information only immediately before a public
15 dnl    release of your software.  More frequent updates are unnecessary,
16 dnl    and only guarantee that the current interface number gets larger
17 dnl    faster.
18 dnl
19 dnl 3. If the library source code has changed at all since the last
20 dnl    update, then increment REVISION ('C:R:A' becomes 'C:r+1:A').
21 dnl
22 dnl 4. If any interfaces have been added, removed, or changed since the
23 dnl    last update, increment CURRENT, and set REVISION to 0.
24 dnl
25 dnl 5. If any interfaces have been added since the last public release,
26 dnl    then increment AGE.
27 dnl
28 dnl 6. If any interfaces have been removed since the last public release
29 dnl    then set AGE to 0.
30 dnl
31 dnl LIBRARY_VERSION_INFO for libxapian-1.3:
32 dnl 0:0:0 1.3.0 Reset as library renamed
33 dnl 1:0:0 1.3.0_svn16813 Default stemming strategy now STEM_SOME
34 dnl 2:0:1 1.3.1 Added TfIdfWeight, MSetIterator::at_end(), etc
35 dnl 3:0:0 1.3.2 Enquire::get_eset() overload -> default parameter
36 dnl 4:0:0 1.3.3 Database::allterms_begin() overload -> default parameter
37 LIBRARY_VERSION_INFO=4:0:0
38 AC_SUBST([LIBRARY_VERSION_INFO])
40 LIBRARY_VERSION_SUFFIX=-1.3
41 AC_SUBST([LIBRARY_VERSION_SUFFIX])
43 dnl Disabled for stable release series.
44 dnl Default to "-1.3"; for no suffix, specify: --program-suffix=
45 test x"$program_suffix" != xNONE || program_suffix=-1.3
47 dnl Where xapian.h, etc go.  In development release append "/xapian-1.3".
48 dnl incdir=$includedir
49 incdir=$includedir/xapian-1.3
50 AC_SUBST([incdir])
52 dnl Check the build directory doesn't contain a space, so we die early with
53 dnl a helpful error.
54 case `pwd` in
55 *' '*)
56    AC_MSG_ERROR([You can't build in a directory whose path contains a space])
57    ;;
58 esac
60 dnl Check the source directory doesn't contain a space, so we die early with
61 dnl a helpful error.  FIXME: Unfortunately, configure seems to choke before
62 dnl it gets to us so this code doesn't get a chance to fire.
63 case $0 in
64 *' '*)
65    dnl Note: for in-tree builds, the build directory test above will fire
66    dnl before this can.
67    AC_MSG_ERROR([You can't build with sources in a directory whose path contains a space])
68    ;;
69 esac
71 dnl Check the prefix to install in doesn't contain a space, so we die early with
72 dnl a helpful error.
73 case $prefix in
74 *' '*)
75    AC_MSG_ERROR([You can't install in a directory whose path contains a space])
76    ;;
77 esac
79 dnl Note if the user specified a particular C++ compiler so we can give a more
80 dnl appropriate error message if we can't link a simple C++ program.
81 original_CXX=
82 if test -n "$CXX" ; then
83   original_CXX="CXX=$CXX"
84 elif test -n "$CCC" ; then
85   original_CXX="CCC=$CCC"
88 dnl See HACKING document for details of the reasons for required versions.
89 AM_INIT_AUTOMAKE([1.11 -Wportability tar-ustar no-dist-gzip dist-xz std-options])
90 AC_CONFIG_SRCDIR([matcher/multiandpostlist.cc])
92 AC_CONFIG_HEADERS([config.h])
94 AC_CONFIG_MACRO_DIR([m4])
96 dnl Use libtool to manage our libraries.
97 LT_PREREQ([2.2.8])
98 LT_INIT
100 dnl -no-undefined causes problems on Solaris with Sun CC in C++11 mode, so only
101 dnl pass -no-undefined on platforms where it is required in order to link a
102 dnl shared library at all (Windows is the main one).
103 NO_UNDEFINED=
104 if test unsupported = "$allow_undefined_flag" ; then
105   NO_UNDEFINED=-no-undefined
107 AC_SUBST(NO_UNDEFINED)
109 AM_CXXFLAGS=
111 dnl A standard "gotcha" for mingw and cygwin users is to not set up their
112 dnl PATH correctly, so that MSDOS FIND.EXE is found before Unix find.  Help
113 dnl them out by checking for this condition, rather than letting libtool
114 dnl fail in obscure ways.  NB check the *BUILD* OS, not the host one!
115 case $build_os in
116   *mingw* | *cygwin* | pw32*)
117     find /dirunlikelytoexist >/dev/null 2>&1
118     if test $? = 2 ; then
119         dnl Unix find will return 1 if the directory didn't exist, or 0 if
120         dnl it did.
121         AC_MSG_ERROR([
122 *** You appear to have an MSDOS-like FIND.EXE in your PATH ahead of any
123 *** UNIX-like find.  This misconfiguration will confuse libtool - you'll need
124 *** to make sure you have a UNIX-like find installed and fix your PATH, then
125 *** rerun configure.  For more information, see:
127 ***   https://www.cygwin.com/faq/faq.html#faq.using.find
129     fi
130   ;;
131 esac
133 dnl Add parameters for aclocal
134 dnl (This must come after AM_INIT_AUTOMAKE, since it modifies ACLOCAL)
135 ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
137 dnl disable "maintainer only" rules by default
138 AM_MAINTAINER_MODE
140 dnl Checks for programs.
141 AC_PROG_CXX
143 AC_CANONICAL_HOST
145 # Checked: freebsd8.0 openbsd4.6 solaris2.9 solaris2.10
146 case $host_os in
147   linux* | k*bsd*-gnu | freebsd* | openbsd* | solaris*)
148     dnl Vanilla libtool sets this to "unknown" which it then handles as "yes".
149     link_all_deplibs_CXX=no
150     ;;
151 esac
153 case $host_os in
154   linux*)
155     dnl Extract search path from ldconfig which is more reliable than the way
156     dnl vanilla libtool extracts them from ld.so.conf.
157     d=`/sbin/ldconfig -N -X -v 2>&AS_MESSAGE_LOG_FD|$SED 's,^\(/.*\):\( (.*)\)\?$,\1,p;d'|tr '\n' ' '`
158     test -z "$d" || sys_lib_dlsearch_path_spec=$d
159     ;;
160 esac
162 case $host in
163   *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
164     dnl On these platforms, libtool emits a warning if -no-install is passed,
165     dnl and uses -no-fast-install instead - the least ugly way to avoid that
166     dnl warnings seems to be to duplicate the above list of platforms from
167     dnl libtool and use -no-fast-install on them directly.
168     NO_INSTALL=-no-fast-install ;;
169   *)
170     NO_INSTALL=-no-install ;;
171 esac
172 AC_SUBST([NO_INSTALL])
174 dnl For reasons which are beyond me, if autoconf can't find a C++ compiler
175 dnl it will set CXX to g++ (which obviously won't work) rather than actually
176 dnl telling the user that it couldn't find a C++ compiler and telling them
177 dnl to either install one or set CXX if there's one configure failed to find.
178 dnl It's probably worthwhile checking that the C++ compiler actually works
179 dnl anyway!
180 if test -n "$CXX" ; then
181   AC_LANG_CPLUSPLUS
182   AC_MSG_CHECKING([whether $CXX is a working C++ compiler])
183   AC_CACHE_VAL([xo_cv_cxx_works],
184     [
185     AC_TRY_RUN([int main() {}],
186                xo_cv_cxx_works=yes,
187                xo_cv_cxx_works=no,
188                AC_TRY_LINK([], [], xo_cv_cxx_works=yes, xo_cv_cxx_works=no))
189     ])
190   AC_MSG_RESULT([$xo_cv_cxx_works])
191 else
192   xo_cv_cxx_works=no
194 if test no = "$xo_cv_cxx_works" ; then
195   case $original_CXX in
196   CCC=*)
197     dnl CCC is handled in a slightly odd way - if its value isn't an
198     dnl executable (taking PATH into account) then it is ignored!
199     test "$original_CXX" = "CCC=$CXX" || original_CXX=
200     ;;
201   esac
202   if test -z "$original_CXX" ; then
203   AC_MSG_ERROR([
204 *** You need a working C++ compiler to compile Xapian, but configure failed to
205 *** find one.  If you have a working C++ compiler, you can tell configure where
206 *** to find it by invoking it like so:
208 ***   ./configure CXX=/opt/bin/c++
210   else
211   AC_MSG_ERROR([
212 *** You need a working C++ compiler to compile Xapian, but the compiler you
213 *** specified (with '$original_CXX') doesn't appear to be able to successfully
214 *** compile and link a simple program.
216   fi
219 dnl Probe for any options needed to enable C++11 support.
220 AX_CXX_COMPILE_STDCXX_11
222 dnl We don't use a C compiler to compile Xapian's code, but on some platforms
223 dnl (e.g. mingw) libtool uses $LTCC which defaults to $CC, and it's also use to
224 dnl build auxiliary tools like snowball and lemon.
225 AC_PROG_CC
227 dnl We want a non-cross-compiling C compiler for building lemon with.
228 if test -z "$CC_FOR_BUILD" ; then
229   if test yes = "$cross_compiling"; then
230     CC_FOR_BUILD=cc
231   else
232     CC_FOR_BUILD="$CC"
233   fi
235 AC_ARG_VAR([CC_FOR_BUILD], [C compiler command for native compilation (needed to compile build tools during cross-builds)])
237 dnl Run tests using the C++ compiler.
238 AC_LANG_CPLUSPLUS
240 XAPIAN_LDFLAGS=
241 XAPIAN_LIBS=
242 AC_SUBST([XAPIAN_LDFLAGS])
243 AC_SUBST([XAPIAN_LIBS])
245 AC_DEFUN([XAPIAN_TEST_LINKER_FLAG],
246   [
247   AC_MSG_CHECKING([for $CXX -Wl,$1])
248   AC_CACHE_VAL([xo_cv_$2],
249     [
250     flag=$1
251     dnl The option in $1 will start with a dash so needs protecting.  We can't
252     dnl use -e as Solaris /usr/bin/grep doesn't support that, so prepend an
253     dnl empty group instead.
254     if $CXX -Wl,$1 >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD|grep '\(\)'$1 >/dev/null 2>&1; then
255       dnl The error message contains the flag name - it must be a
256       dnl complaint that the option is unrecognized (doing it this
257       dnl way allows it to work regardless of the i18n in use):
258       dnl ld: unrecognized option '--enable-runtime-pseudo-reloc'
259       xo_cv_$2=no
260       $4
261     else
262       xo_cv_$2=yes
263       $3
264     fi
265     ])
266   AC_MSG_RESULT([$xo_cv_$2])
267   ])
269 dnl Test if the compiler works with $1 added to CXXFLAGS; if it does, add $1 to
270 dnl variable $2.  If the test passes, also do $3; if it fails, also do $4.
271 AC_DEFUN([XAPIAN_TEST_CXXFLAGS],
272   [
273   XTC_save_CXXFLAGS=$CXXFLAGS
274   CXXFLAGS="$CXXFLAGS $1"
275   AC_TRY_COMPILE([], [],
276                  [$2="${$2} $1"
277                   CXXFLAGS=$XTC_save_CXXFLAGS
278                   $3],
279                  [CXXFLAGS=$XTC_save_CXXFLAGS
280                   $4])
281   ])
283 ldflags=
284 if test yesyes = "$GXX$enable_shared" ; then
285   case $host_os in
286     *mingw* | *cygwin*)
287       XAPIAN_TEST_LINKER_FLAG([--enable-runtime-pseudo-reloc], [enable_runtime_pseudo_reloc],
288         [ldflags="-Wl,$flag"],
289         [
290         dnl Can't use AC_DISABLE_SHARED after AC_PROG_LIBTOOL, but
291         dnl this test needs to be after AC_PROG_LIBTOOL, so we can't
292         dnl just disable the shared build automatically...
293         AC_MSG_ERROR([ld version too old to support a shared build - configure with --disable-shared, or install binutils 2.13.90-20030111-1 or later])
294         ])
295     ;;
296   esac
298 dnl Only works for ldflags which can be specified anywhere on the link line.
299 AC_SUBST([ldflags])
301 dnl Preserve the default CXXFLAGS.
302 save_CXXFLAGS=$CXXFLAGS
304 dnl x86 has excess precision issues with 387 FP instructions, which are
305 dnl avoided by using SSE instructions instead.  This is also faster (~6% in
306 dnl a CPU bound testcase).
307 AC_ARG_ENABLE([sse],
308 [AS_HELP_STRING([--disable-sse],
309                 [disable use of SSE FP instructions on x86])]
310 [AS_HELP_STRING([[--enable-sse[=sse|sse2]]],
311                 [set which SSE FP instructions to use on x86 (default: sse2)])],
312   [case ${enableval} in
313     sse|sse2|yes|no) ;;
314     *) AC_MSG_ERROR([bad value ${enableval} for --enable-sse or --disable-sse]) ;;
315   esac],
316   [enable_sse=yes])
318 dnl Some versions of Sun's C++ compiler reportedly need an explicit -lm.
319 dnl The maths functions we use include: exp log ceil fabs sqrt
320 AC_MSG_CHECKING([if -lm is required for maths functions])
321 dnl Don't use constant arguments as the compiler might simply evaluate the
322 dnl whole expression at compile time, and it might inline certain functions
323 dnl so test several functions.  Also write results using printf() so that
324 dnl the compiler can't optimise away the computations.
325 AC_TRY_LINK([#ifdef __SUNPRO_CC
326 #error Need -lm for Sun C++ 5.9 under libtool 2.2.10
327 #endif
328 #include <cmath>
329 #include <cstdio>
330 #include <ctime>
331 using namespace std;], [
332   double a = log(ceil(time(NULL)/7.0));
333   printf("%f %f %f\n", a, sqrt(a), exp(fabs(a - 12345.6)));
334   ], [AC_MSG_RESULT([no])], [
335     LIBS="-lm $LIBS"
336     AC_TRY_LINK([#include <cmath>
337 #include <cstdio>
338 #include <ctime>
339 using namespace std;], [
340   double a = log(ceil(time(NULL)/7.0));
341   printf("%f %f %f\n", a, sqrt(a), exp(fabs(a - 12345.6)));],
342         [AC_MSG_RESULT([yes])],
343         [AC_MSG_ERROR([Failed to link a C++ program using <cmath>])
344     ])
347 dnl C++11 should have log2(), but keep this check for now to allow for
348 dnl compilers with incomplete library support for C++11.
349 AC_CHECK_DECLS([log2], [], [], [#include <cmath>])
351 dnl See if <typeinfo> can be used in the testsuite - at least for GCC and xlC,
352 dnl compilation of the test code below fails if RTTI isn't being generated
353 dnl (g++ -fno-rtti, or by default with xlC).
354 AC_MSG_CHECKING([if RTTI is supported])
355 save_CXXFLAGS=$CXXFLAGS
356 dnl xlC issues a warning for typeid() being used without RTTI being enabled,
357 dnl so for this test we pass the xlC option to make that warning into an error.
358 XAPIAN_TEST_CXXFLAGS([-qhaltonmsg=1540-2412], [CXXFLAGS])
359 AC_TRY_COMPILE([
360 #include <exception>
361 #include <typeinfo>],
362         [
363         int f();
364         try {
365             return f();
366         } catch (std::exception & e) {
367             return typeid(e).name()[0];
368         }],
369     AC_MSG_RESULT([yes])
370     AC_DEFINE([USE_RTTI], [1], [Define if the testsuite can use RTTI]),
371     AC_MSG_RESULT([no]))
372 CXXFLAGS=$save_CXXFLAGS
374 dnl Check for time functions.
375 AC_CHECK_FUNCS([clock_gettime sleep nanosleep gettimeofday ftime])
377 case $host_os in
378   *mingw*)
379     dnl For _ftime64() on mingw we need to tell it we're happy to require
380     dnl MSVCRT 6.10 or higher, which isn't too onerous a requirement it seems.
381     AC_DEFINE([__MSVCRT_VERSION__], [0x0601], [Define on mingw to the minimum msvcrt version to assume])
382     AC_DEFINE([MINGW_HAS_SECURE_API], [1], [Define on mingw to get _s suffixed "secure" functions declared in headers])
383     ;;
384 esac
386 dnl We use timer_create() if available to implement a search time limit.
387 SAVE_LIBS=$LIBS
388 AC_SEARCH_LIBS([timer_create], [rt],
389     [XAPIAN_LIBS="$LIBS $XAPIAN_LIBS"
390     AC_DEFINE([HAVE_TIMER_CREATE], [1], [Define to 1 if you have the 'timer_create' function.])])
391 LIBS=$SAVE_LIBS
393 dnl Used by tests/soaktest/soaktest.cc
394 AC_CHECK_FUNCS([srandom random])
396 dnl Used by tests/harness/testsuite.cc
397 AC_CHECK_FUNCS([sigaction])
398 AC_MSG_CHECKING([for sigsetjmp and siglongjmp])
399 AC_TRY_COMPILE([#include <setjmp.h>],
400   [sigjmp_buf jb; if (sigsetjmp(jb, 1)) { siglongjmp(jb, 1);  }],
401   AC_DEFINE([HAVE_SIGSETJMP], [1], [Define to 1 if you have the 'sigsetjmp' function])
402   AC_MSG_RESULT([yes]),
403   AC_MSG_RESULT([no]))
405 dnl Used by tests/harness/cputimer.cc:
406 AC_CHECK_FUNCS([getrusage times sysconf])
408 dnl Used by tests/api_replicate.cc, tests/queryparsertest.cc and
409 dnl tests/termgentest.cc.
411 dnl Solaris < 10 only has putenv().
413 dnl Microsoft have marked putenv() as deprecated, so we use _putenv_s() under
414 dnl MSVC to avoid deprecation warnings.  We probe here since mingw doesn't
415 dnl currently (v3.20) provide _putenv_s(), so we can't just use it conditional
416 dnl on __WIN32__ being defined.
417 AC_CHECK_FUNCS([setenv _putenv_s])
419 dnl Check for a more efficient way of closing fds during daemonisation.
420 dnl Apparently closefrom() is available on at least "Solaris 9 or later, NetBSD
421 dnl 3.0 or later, OpenBSD 3.5 or later".  If we don't have closefrom(), then
422 dnl dirfd() and getrlimit are useful for an efficient implementation on some
423 dnl platforms.
424 AC_CHECK_FUNCS([closefrom dirfd getrlimit])
426 dnl See if ftime returns void (as it does on mingw)
427 AC_MSG_CHECKING([return type of ftime])
428 if test $ac_cv_func_ftime = yes ; then
429   AC_TRY_COMPILE([#include <sys/timeb.h>],
430     [struct timeb tp; int i = ftime(&tp);],
431     AC_MSG_RESULT([int]),
432     AC_MSG_RESULT([void])
433     AC_DEFINE([FTIME_RETURNS_VOID], [1], [Define if ftime returns void]))
436 dnl Check how to find the hostname: uname() in sys/utsname.h, or gethostname()
437 dnl Don't use default includes as inttypes.h is found by Compaq C but not C++
438 dnl so it causes all header probes to fail.
439 AC_CHECK_HEADERS([sys/utsname.h], [], [], [ ])
440 AC_CHECK_FUNCS([gethostname])
442 dnl mingw (for instance) lacks ssize_t
443 AC_TYPE_SSIZE_T
445 AC_TYPE_PID_T
447 AC_TYPE_MODE_T
449 AC_CHECK_SIZEOF([short])
450 AC_CHECK_SIZEOF([int])
451 AC_CHECK_SIZEOF([long])
452 AC_CHECK_SIZEOF([long long])
454 AC_MSG_CHECKING([for 32 bit integer type])
455 case $ac_cv_sizeof_short:$ac_cv_sizeof_int:$ac_cv_sizeof_long in
456     *:4:*) INT32_T=int ;;
457     *:*:4) INT32_T=long ;;
458     4:*)   INT32_T=short ;;
459     *)
460       AC_MSG_RESULT([none found])
461       AC_MSG_ERROR([No 32 bit integer type found])
462 esac
463 AC_MSG_RESULT([$INT32_T])
465 AC_MSG_CHECKING([for 64 bit integer type])
466 case $ac_cv_sizeof_int:$ac_cv_sizeof_long:$ac_cv_sizeof_long_long in
467     8:*)   INT64_T=int ;;
468     *:8:*) INT64_T=long ;;
469     *:*:8) INT64_T='long long' ;;
470     *)
471       AC_MSG_RESULT([none found])
472       AC_MSG_ERROR([No 64 bit integer type found])
473 esac
474 AC_MSG_RESULT([$INT64_T])
476 dnl Check for perl (needed to generate some sources and documentation).
477 AC_PATH_PROG([PERL], [perl], [])
478 if test x$USE_MAINTAINER_MODE = xyes; then
479   test -z "$PERL" && AC_MSG_ERROR([perl is required in maintainer mode])
482 AC_ARG_ENABLE([64bit_docid],
483   [AS_HELP_STRING([--enable-64bit-docid], [enable 64bit docid [default=no]])],
484   [case ${enableval} in
485     yes|no) ;;
486   *) AC_MSG_ERROR([bad value ${enableval} for --enable-64bit-docid]) ;;
487   esac],
488   [enable_64bit_docid=no])
490 AC_ARG_ENABLE([64bit_termcount],
491   [AS_HELP_STRING([--enable-64bit-termcount], [enable 64bit termcount [default=no]])],
492   [case ${enableval} in
493     yes|no) ;;
494   *) AC_MSG_ERROR([bad value ${enableval} for --enable-64bit-termcount]) ;;
495   esac],
496   [enable_64bit_termcount=no])
498 AC_ARG_ENABLE([documentation],
499   [AS_HELP_STRING([--enable-documentation], [enable make rules to rebuild documentation [default=maintainer-mode]])],
500   [case ${enableval} in
501     yes|no) ;;
502     *) AC_MSG_ERROR([bad value ${enableval} for --enable-documentation]) ;;
503   esac],
504   [enable_documentation=$USE_MAINTAINER_MODE])
505 AM_CONDITIONAL([DOCUMENTATION_RULES], [test x"$enable_documentation" = xyes])
506 AM_CONDITIONAL([MAINTAINER_NO_DOCS], [test x"$USE_MAINTAINER_MODE$enable_documentation" = xyesno])
508 if test x"$enable_documentation" = xyes ; then
509   dnl Checks for dot.  (Diagrams in the documentation)
510   AC_PATH_PROG([DOT], [dot])
511   test -z "$DOT" && AC_MSG_ERROR([dot (part of the graphviz package) is required to build documentation])
512   DOXYGEN_DOT_PATH=`echo "$DOT" | sed 's!/dot$!!'`
513   AC_SUBST([DOXYGEN_DOT_PATH])
515   dnl Check for doxygen. (Needed to make some more of the documentation)
516   AC_PATH_PROG([DOXYGEN], [doxygen], [])
517   test -z "$DOXYGEN" && AC_MSG_ERROR([doxygen is required to build documentation])
519   dnl Check for help2man. (Needed to make man pages from "--help" output).
520   AC_PATH_PROG([HELP2MAN], [help2man], [])
521   test -z "$HELP2MAN" && AC_MSG_ERROR([help2man is required to build documentation])
523   dnl Check for rst2html. (Needed to make HTML from reStructuredText format)
524   dnl Also look for rst2html.py, which archlinux reportedly installs it as.
525   AC_PATH_PROGS([RST2HTML], [rst2html rst2html.py], [])
526   test -z "$RST2HTML" && AC_MSG_ERROR([rst2html is required to build documentation (try package python-docutils)])
528   dnl Check for pngcrush, which we optionally use to reduce the size of the
529   dnl PNG files which doxygen generates.  We can get by without it, so don't
530   dnl fail here if it's not found.
531   AC_PATH_PROG([PNGCRUSH], [pngcrush], [])
534 dnl Check whether we need -ldl for dlsym() etc.
535 dnl No longer used...
536 dnl AC_TRY_LINK_FUNC([dlsym], ,
537 dnl     [AC_CHECK_LIB([dl], [dlsym], [DL_LIBS="-ldl"])])
538 dnl AC_SUBST([DL_LIBS])
540 dnl Checks for header files.
541 AC_CHECK_HEADERS([fcntl.h limits.h sys/errno.h sys/select.h], [], [], [ ])
542 AC_CHECK_HEADERS([sys/resource.h],
543                  [], [], [#include <sys/types.h>])
545 dnl If valgrind is installed and new enough, we use it for leak checking in the
546 dnl testsuite.  If VALGRIND is set to an empty value, then skip the check and
547 dnl don't use valgrind.
548 if test -n "${VALGRIND-unset}" ; then
549   AC_PATH_PROG([VALGRIND], [valgrind], [])
550   if test -n "$VALGRIND" ; then
551     dnl Check that the installed valgrind version works, and supports the
552     dnl options we use.  This means we won't try to use valgrind < 3.3.0
553     dnl (released 7/12/2007) since before that --log-file didn't expand
554     dnl %p (and appended the process id).
555     dnl
556     dnl No need to check for VALGRIND_COUNT_LEAKS now - that was added before
557     dnl 2.0.0.
558     AC_MSG_CHECKING([if valgrind supports --log-file with %p])
559     vglog=config.vglog.%p.tmp
560     vglogwild="config.vglog.*.tmp*"
561     rm -f $vglogwild
562     if $VALGRIND --log-file="$vglog" -q true 2>&AS_MESSAGE_LOG_FD ; then
563       for f in $vglogwild ; do
564         case $f in
565         $vglog*) VALGRIND= ;;
566         esac
567       done
568       if test x"$VALGRIND" = x ; then
569         AC_MSG_RESULT([no])
570       else
571         AC_MSG_RESULT([yes])
572         AC_CHECK_HEADERS([valgrind/memcheck.h], [], [VALGRIND=], [ ])
573       fi        
574     else
575       dnl The valgrind detected doesn't seem to work!  Perhaps this is an
576       dnl x86_64 box with a 32 bit valgrind.
577       AC_MSG_RESULT([$VALGRIND doesn't work])
578       VALGRIND=
579     fi
580     rm -f $vglogwild
581   fi
584 if test -n "$VALGRIND" ; then
585   AC_DEFINE([HAVE_VALGRIND], [1], [Define if a suitable valgrind is installed])
588 dnl If eatmydata is installed, we run the testsuite under it to speed it up.
589 dnl If EATMYDATA is set to an empty value, then skip this check and don't use
590 dnl eatmydata.
591 if test -n "${EATMYDATA-unset}" ; then
592   AC_PATH_PROG([EATMYDATA], [eatmydata], [])
595 dnl Checks for library functions.
596 AC_FUNC_MEMCMP
597 AC_FUNC_STRERROR_R
598 AC_CHECK_DECLS([sys_errlist, _sys_errlist, sys_nerr, _sys_nerr])
600 dnl Check that snprintf actually works as it's meant to.
602 dnl Linux 'man snprintf' warns:
603 dnl  Linux libc4.[45] does not have a snprintf, but provides a libbsd that
604 dnl  contains an snprintf equivalent to sprintf, i.e., one that ignores the
605 dnl  size argument.  Thus, the use of snprintf with early libc4 leads to
606 dnl  serious security problems.
608 dnl It also warns that glibc < 2.0.6 (and presumably other pre-C90
609 dnl implementations) return -1 when truncating so check that we get the
610 dnl ISO C90 semantics for the returned length when truncating.  If we
611 dnl have a working snprintf but with non-ISO return semantics, handle
612 dnl that case separately as it may still be useful in many cases.
614 dnl mingw has _snprintf so check for that too.
615 AC_MSG_CHECKING([for working ISO C90 conforming snprintf])
616 ac_cv_func_snprintf_noniso=no
617 for func in snprintf _snprintf ; do
618   AC_RUN_IFELSE([
619     AC_LANG_PROGRAM(
620       [[
621 #include <cstdio>
622 #include <cstring>
623 using namespace std;
624       ]],
625       dnl Return different exit status for each error so we can see which
626       dnl check failed by consulting config.log.
627       [[
628         char buffer[4] = "abc";
629         int res1 = $func(buffer, 2, "%s", "XYZ");
630         if (memcmp(buffer, "X\0c", 4) != 0) return 2;
631         int res2 = $func(buffer, 2, "%x", 0x12);
632         if (memcmp(buffer, "1\0c", 4) != 0) return 3;
633         if (res1 == -1 && res2 == -1) return 15; /* Pre-ISO semantics. */
634         if (res1 != 3) return 4;
635         if (res2 != 2) return 5;
636       ]]
637     )],
638     [ac_cv_func_snprintf=$func;break],
639     [
640     if test 15no = "$?$ac_cv_func_snprintf_noniso" ; then
641       ac_cv_func_snprintf_noniso=$func
642     fi
643     ac_cv_func_snprintf=no
644     ],
645     [ac_cv_func_snprintf=unknown;break]
646   )
647 done
648 AC_MSG_RESULT([$ac_cv_func_snprintf])
649 case $ac_cv_func_snprintf in
650   no)
651     AC_MSG_CHECKING([for working non-ISO C90 conforming snprintf])
652     AC_MSG_RESULT([$ac_cv_func_snprintf_noniso])
653     if test no != "$ac_cv_func_snprintf_noniso" ; then
654       AC_DEFINE_UNQUOTED([SNPRINTF], [$ac_cv_func_snprintf_noniso],
655         [Define to the name of a function implementing snprintf but not caring about ISO C99 return value semantics (if one exists)])
656     fi
657     ;;
658   unknown)
659     dnl be conservative when crosscompiling
660     ;;
661   *)
662     AC_DEFINE_UNQUOTED([SNPRINTF_ISO], [$ac_cv_func_snprintf],
663        [Define to the name of a function implementing snprintf with ISO C99 semantics (if one exists)])
664     AC_DEFINE_UNQUOTED([SNPRINTF], [$ac_cv_func_snprintf],
665        [Define to the name of a function implementing snprintf but not caring about ISO C99 return value semantics (if one exists)])
666     ;;
667 esac
669 dnl ***************************
670 dnl * Select modules to build *
671 dnl ***************************
673 dnl Check which database backends should be built.
675 AC_DEFUN([XAPIAN_BACKEND_ENABLE],
676   [AC_ARG_ENABLE([backend_$1],
677     [AS_HELP_STRING([--enable-backend-$1], [build the $1 database backend [default=yes]])],
678     [case $enableval in
679       yes|no) ;;
680       *) AC_MSG_ERROR([Invalid option: '--enable-backend-$1=$enableval']) ;;
681     esac], [enable_backend_$1=yes])
682   ])
684 dnl When adding a new backend, update INSTALL too.
685 XAPIAN_BACKEND_ENABLE([chert])
686 XAPIAN_BACKEND_ENABLE([glass])
687 XAPIAN_BACKEND_ENABLE([inmemory])
688 XAPIAN_BACKEND_ENABLE([remote])
690 use_win32_uuid_api=0
691 case $enable_backend_chert$enable_backend_glass in
692 *yes*)
693   dnl We use zlib for compressing tags in chert/glass.  We could
694   dnl automatically disable support if zlib isn't found, but overall that
695   dnl probably does more harm than good - it's most likely that someone just
696   dnl forgot to install the -dev package for zlib.
697   dnl
698   dnl Similarly for uuid support.
700   dnl Check for zlib.h.
701   AC_CHECK_HEADERS([zlib.h], [], [
702     AC_MSG_ERROR([zlib.h not found - required for chert and glass (you may need to install the zlib1g-dev or zlib-devel package)])
703     ], [ ])
705   dnl Check for zlibVersion in -lz.
706   SAVE_LIBS=$LIBS
707   dnl mingw build needs -lzlib or -lzdll.
708   AC_SEARCH_LIBS([zlibVersion], [z zlib zdll], [], [
709     AC_MSG_ERROR([zlibVersion() not found in -lz, -lzlib, or -lzdll - required for chert and glass (you may need to install the zlib1g-dev or zlib-devel package)])
710     ])
711   if test x != x"$LIBS" ; then
712     XAPIAN_LIBS="$XAPIAN_LIBS $LIBS"
713   fi
714   LIBS=$SAVE_LIBS
716   dnl Find the UUID library (from e2fsprogs/util-linux-ng, not the OSSP one).
718   case $host_os in
719     *mingw* | *cygwin*) dnl Use built-in API.
720       use_win32_uuid_api=1
721       ;;
722     *)
723       dnl Check for uuid/uuid.h (e2fsprogs/util-linux-ng) or uuid.h
724       dnl (FreeBSD/NetBSD).
725       AC_CHECK_HEADERS([uuid/uuid.h], [
726         dnl util-linux-ng's uuid/uuid.h found - check for uuid_generate in
727         dnl -luuid.
728         SAVE_LIBS=$LIBS
729         AC_SEARCH_LIBS([uuid_generate], [uuid], [], [
730           AC_MSG_ERROR([uuid_generate() not found in -luuid - required for chert and glass (you may need to install the uuid-dev, libuuid-devel or e2fsprogs-devel package)])
731           ])
732         if test x != x"$LIBS" ; then
733           XAPIAN_LIBS="$XAPIAN_LIBS $LIBS"
734         fi
735       ], [
736         dnl Try uuid.h as found on FreeBSD/NetBSD, with associated code in libc.
737         AC_CHECK_HEADERS([uuid.h], [
738           dnl Check for uuid_create with no extra libraries required.
739           AC_CHECK_FUNC([uuid_create], [], [
740             AC_MSG_ERROR([uuid.h found, but uuid_create() not found.  You probably wants to install libuuid from util-linux-ng or e2fsprogs (you may need to install the uuid-dev, libuuid-devel or e2fsprogs-devel package)])
741           ])
742         ], [
743           AC_MSG_ERROR([Neither uuid/uuid.h nor uuid.h found - required for chert and glass (you may need to install the uuid-dev, libuuid-devel or e2fsprogs-devel package)])
744         ], [ ])
745       ], [ ])
746       ;;
747   esac
749   dnl Older versions of libuuid (such as that on CentOS 4.7) don't have
750   dnl uuid_unparse_lower(), only uuid_unparse().
751   AC_LINK_IFELSE([AC_LANG_CALL([], [uuid_unparse_lower])],
752     [
753     AC_DEFINE([HAVE_UUID_UNPARSE_LOWER], [1],
754               [Define to 1 if you have the 'uuid_unparse_lower' function.])
755     ])
756   LIBS=$SAVE_LIBS
757   ;;
758 esac
759 AM_CONDITIONAL([USE_WIN32_UUID_API], [test "$use_win32_uuid_api" = 1])
761 REMOTE_LIBS=
762 if test "$enable_backend_remote" = yes ; then
763   AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
764 #ifdef __WIN32__
765 #error WIN32
766 #endif
767   ]])], [win32=no], [win32=yes])
769   case $host_os-$win32 in
770     *-yes )
771       dnl For mingw and msvc we have an alternative implementation which
772       dnl doesn't need fork() or socketpair().
773       dnl
774       dnl We need -lws2_32 for getaddrinfo(), etc.
775       REMOTE_LIBS=-lws2_32
776       dnl Vista is needed for the AI_ADDRCONFIG flag to getaddrinfo().
777       AC_DEFINE([WINVER], [0x600],
778                 [Version of Windows to assume (0x600 => Vista).])
779       AC_DEFINE([_WIN32_WINNT], [WINVER],
780                 [Version of Windows to assume.])
781       ;;
782     *djgpp* | *msdos* )
783       dnl DJGPP has a dummy implementation of fork which always fails.
784       dnl
785       dnl For disk-based backend, use flock() for locking, which doesn't need
786       dnl fork() or socketpair().
787       AC_DEFINE([FLINTLOCK_USE_FLOCK], 1, [Define to use flock() for flint-compatible locking])
788       dnl If someone actually wanted remote backend support, then DJGPP has a
789       dnl pthreads port, so using threads like we do on Windows would make more
790       dnl sense.
791       enable_backend_remote=no
792       ;;
793     *)
794       dnl On Unix, we need fork and socketpair for the remotebackend.
795       SAVE_LIBS=$LIBS
796       AC_CHECK_FUNCS([fork], [], [
797         AC_MSG_ERROR([fork() required for the remote backend - if an extra library is needed, pass LIBS=-lfoo to configure.  Or --disable-backend-remote to disable it.)])
798       ])
799       dnl Check if -lsocket is required for socketpair (Solaris needs it).
800       dnl And on Haiku it's in -lnetwork.
801       AC_SEARCH_LIBS([socketpair], [socket network], [], [
802         AC_MSG_ERROR([socketpair() required for the remote backend - if an extra library is needed, pass LIBS=-lfoo to configure.  Or --disable-backend-remote to disable it.)])
803       ])
804       AC_DEFINE([HAVE_SOCKETPAIR], [1],
805                 [Define to 1 if you have the 'socketpair' function.])
806       dnl Check if extra libraries are needed for getaddrinfo or inet_ntop()
807       dnl (e.g. on Solaris).
808       dnl
809       dnl We're currently assuming that any system that is worth trying to
810       dnl support has getaddrinfo() and inet_ntop(), since these are the
811       dnl standard route for supporting IPv6, and that's pretty much essential
812       dnl for platforms to support now.
813       AC_SEARCH_LIBS([getaddrinfo], [nsl socket], [], [
814         AC_MSG_ERROR([getaddrinfo() required for the remote backend - if an extra library is needed, pass LIBS=-lfoo to configure.  Or --disable-backend-remote to disable it.)])
815       ])
816       AC_SEARCH_LIBS([inet_ntop], [nsl socket], [], [
817         AC_MSG_ERROR([inet_ntop() required for the remote backend - if an extra library is needed, pass LIBS=-lfoo to configure.  Or --disable-backend-remote to disable it.)])
818       ])
819       REMOTE_LIBS=$LIBS
820       LIBS=$SAVE_LIBS
821       ;;
822   esac
824   if test "$enable_backend_remote" = yes ; then
825     TYPE_SOCKLEN_T
826     XAPIAN_LIBS="$XAPIAN_LIBS $REMOTE_LIBS"
827   fi
830 AC_ARG_ENABLE([visibility],
831   [AS_HELP_STRING([--disable-visibility], [disable use of GCC visibility])],
832   [case ${enableval} in
833     yes|no) ;;
834     *) AC_MSG_ERROR([bad value ${enableval} for --disable-visibility]) ;;
835   esac])
837 vpath_build=no
838 if test "`pwd`" != "`cd $srcdir;pwd`" ; then
839   vpath_build=yes
841 AM_CONDITIONAL([VPATH_BUILD], [test yes = "$vpath_build"])
843 dnl Turn off compilation of anything that we don't have the requirements for
845 dnl Set conditionals to specify what we compile
847 AM_CONDITIONAL([BUILD_BACKEND_CHERT], [test yes = "$enable_backend_chert"])
848 AM_CONDITIONAL([BUILD_BACKEND_GLASS], [test yes = "$enable_backend_glass"])
849 AM_CONDITIONAL([BUILD_BACKEND_INMEMORY], [test yes = "$enable_backend_inmemory"])
850 AM_CONDITIONAL([BUILD_BACKEND_REMOTE], [test yes = "$enable_backend_remote"])
851 AM_CONDITIONAL([BUILD_BACKEND_CHERT_OR_GLASS],
852   [test nono != "$enable_backend_chert$enable_backend_glass"])
854 dnl Used to decide if we should use the zlib-vg.so LD_PRELOAD hack.
855 use_zlib_vg=no
856 if test -n "$VALGRIND" ; then
857   case $host_os in
858     linux*) use_zlib_vg=yes ;;
859   esac
861 AM_CONDITIONAL([USE_ZLIB_VG], [test yes = "$use_zlib_vg"])
863 dnl See if we have fdatasync, and what libraries are needed for it.
864 dnl We need to actually check for a declaration as OS X has a dummy
865 dnl implementation in the library which is not prototyped in any header.
866 AC_CHECK_DECL([fdatasync(int)], [
867   SAVE_LIBS=$LIBS
868   AC_SEARCH_LIBS([fdatasync], [rt], [XAPIAN_LIBS="$LIBS $XAPIAN_LIBS"])
869   LIBS=$SAVE_LIBS
870   AC_CHECK_FUNCS([fdatasync])
871   ],
872   [ac_cv_func_fdatasync=no],
873   [#include <unistd.h>]
876 AC_CHECK_FUNCS([fsync])
877 AC_CHECK_FUNCS([posix_fadvise])
879 dnl HP-UX has pread and pwrite, but they don't work!  Apparently this problem
880 dnl manifests when largefile support is enabled, and we definitely want that
881 dnl so don't use pread or pwrite on HP-UX.
882 case $host_os in
883   hpux*)
884     AC_MSG_CHECKING([for pread])
885     AC_MSG_RESULT([present but broken on $host_os])
886     AC_MSG_CHECKING([for pwrite])
887     AC_MSG_RESULT([present but broken on $host_os])
888     ;;
889   *)
890     AC_CHECK_FUNC([pread],
891        [AC_DEFINE([HAVE_PREAD], [1],
892             [Define if pread is available on this system])
893         AC_MSG_CHECKING([for any prototype needed for pread])
894         AC_CACHE_VAL([xo_cv_pread_prototype],
895           [
896             for p in ' ' \
897               'extern "C" ssize_t pread(int, void *, size_t, off_t) throw ();' \
898               'extern "C" ssize_t pread(int, void *, size_t, off_t);' ; do
899               AC_TRY_COMPILE([
900 #include <sys/types.h>
901 #include <unistd.h>
903               ],[
904                 char b[256];
905                 pread(1, b, 256, 20);
906               ],[
907                 xo_cv_pread_prototype="$p"
908                 break
909               ])
910             done
911             if test -z "$xo_cv_pread_prototype"; then
912               AC_MSG_RESULT([not found])
913               AC_MSG_ERROR([Failed to find working prototype for pread])
914             fi
915           ])
916           if test " " = "$xo_cv_pread_prototype" ; then
917             AC_MSG_RESULT([none required])
918           else
919             AC_MSG_RESULT([$xo_cv_pread_prototype])
920             AC_DEFINE_UNQUOTED([PREAD_PROTOTYPE], [$xo_cv_pread_prototype],
921                                [explicit prototype needed for pread (if any)])
922           fi
923         ])
924     AC_CHECK_FUNC([pwrite],
925        [AC_DEFINE([HAVE_PWRITE], [1],
926             [Define if pwrite is available on this system])
927         AC_MSG_CHECKING([for any prototype needed for pwrite])
928         AC_CACHE_VAL([xo_cv_pwrite_prototype],
929           [
930             for p in ' ' \
931               'extern "C" ssize_t pwrite(int, const void *, size_t, off_t) throw ();' \
932               'extern "C" ssize_t pwrite(int, const void *, size_t, off_t);' ; do
933               AC_TRY_COMPILE([
934 #include <sys/types.h>
935 #include <unistd.h>
937               ],[
938                 const char *p = "hello";
939                 pwrite(1, p, 5, 20);
940               ],[
941                 xo_cv_pwrite_prototype="$p"
942                 break
943               ])
944             done
945             if test -z "$xo_cv_pwrite_prototype"; then
946               AC_MSG_RESULT([not found])
947               AC_MSG_ERROR([Failed to find working prototype for pwrite])
948             fi
949           ])
950           if test " " = "$xo_cv_pwrite_prototype" ; then
951             AC_MSG_RESULT([none required])
952           else
953             AC_MSG_RESULT([$xo_cv_pwrite_prototype])
954             AC_DEFINE_UNQUOTED([PWRITE_PROTOTYPE], [$xo_cv_pwrite_prototype],
955                                [explicit prototype needed for pwrite (if any)])
956           fi
957         ])
958     ;;
959 esac
961 AC_CHECK_FUNCS([link])
963 dnl *************************
964 dnl * Set debugging options *
965 dnl *************************
967 dnl Which assertion types to enable in the code.
969 AC_ARG_ENABLE([assertions],
970   [AS_HELP_STRING([--enable-assertions], [enable debug assertions (no|partial|yes) [default=no]])],
971   [case $enableval in
972     yes|partial|no) ;;
973     *)
974       AC_MSG_ERROR([Invalid option: '--enable-assertions=$enableval']) ;;
975   esac])
977 AC_ARG_ENABLE([log],
978   [AS_HELP_STRING([--enable-log], [generate a log of methods called, etc (no|yes|profile) [default=no]])],
979   [case $enableval in
980     yes|no) ;;
981     profile)
982       AC_MSG_ERROR(['--enable-log=profile' is no longer supported - see http://trac.xapian.org/wiki/ProfilingXapian for alternatives.]) ;;
983     *)
984       AC_MSG_ERROR([Invalid option: '--enable-log=$enableval']) ;;
985   esac])
987 dnl Set defines according to the --enable-assertions and --enable-log options
988 dnl given.
990 if test yes = "$enable_assertions" || test partial = "$enable_assertions" ; then
991   AC_DEFINE([XAPIAN_ASSERTIONS],,
992     [Define if you want assertions (causes some slow-down)])
995 if test yes = "$enable_assertions"; then
996   AC_DEFINE([XAPIAN_ASSERTIONS_PARANOID],,
997     [Define if you want paranoid assertions (causes significant slow-down)])
1000 if test yes = "$enable_log"; then
1001   AC_DEFINE([XAPIAN_DEBUG_LOG],,
1002     [Define if you want a log of methods called and other debug messages])
1005 dnl ******************************
1006 dnl * Set special compiler flags *
1007 dnl ******************************
1009 dnl Set flags to control warnings (enable more, or disable annoying ones).
1010 dash_d_visibility=
1011 if test yes = "$GXX"; then
1012   dnl Intel's C++ compiler and clang both lie and define __GNUC__, so check which
1013   dnl we actually have, as neither is really 100% compatible.
1014   case `echo __INTEL_COMPILER __clang__|$CXX -E - 2>&AS_MESSAGE_LOG_FD|grep -v '^#'` in
1015     *__INTEL_COMPILER*__clang__*)
1016       dnl GCC (since neither substituted):
1017       dnl
1018       dnl -Wundef was supported by g++ 3.0 and -fshow-column by g++ 3.1.
1019       dnl
1020       dnl -Wlogical-op and -Wmissing-declarations (for C++) were added in
1021       dnl GCC 4.3.
1022       dnl
1023       dnl All the other options were supported by g++ 2.95.
1024       AM_CXXFLAGS="$AM_CXXFLAGS -fshow-column -Wall -W -Wredundant-decls -Wpointer-arith -Wcast-qual -Wcast-align -Wno-long-long -Wformat-security -fno-gnu-keywords -Wundef -Woverloaded-virtual -Wstrict-null-sentinel -Wshadow -Wstrict-overflow=1 -Wlogical-op -Wmissing-declarations"
1026       dnl The exact format of g++ --version seems to change with almost every
1027       dnl minor release so use the preprocessor macros which should be more
1028       dnl robust.
1029       AC_MSG_CHECKING([for version of $CXX])
1030       gxx_version=`echo __GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__|$CXX -E -|sed '/^#/d;s/ //g'`
1031       AC_MSG_RESULT([GCC $gxx_version])
1033       case $gxx_version in
1034       [[0123]].*|4.[[0123]].*)
1035         AC_MSG_ERROR([Xapian requires GCC 4.4 or later])
1036         ;;
1037       4.[[45]].*) ;;
1038       *) dnl GCC >= 4.6
1039         dnl -Wdouble-promotion was added in GCC 4.6.
1040         dnl
1041         dnl -Winit-self was added in GCC 3.4, but for GCC < 4.7 g++ always
1042         dnl warns for this case with -Wuninitialized (implied by -W).  We
1043         dnl don't intend to use this idiom, so any instances are bugs we'd
1044         dnl like to know about.
1045         AM_CXXFLAGS="$AM_CXXFLAGS -Wdouble-promotion -Winit-self" ;;
1046       esac
1048       dnl FIXME:
1049       dnl -Wconversion in older GCC versions is intended to help migration
1050       dnl from K&R to ISO C, and isn't useful for us.  In 4.3 it was renamed
1051       dnl to -Wtraditional-conversion and a new -Wconversion added which
1052       dnl sounds useful but is a bit buggy currently.  So we should consider
1053       dnl enabling -Wconversion once it is stabilised (GCC 4.4 or ...)
1054       dnl
1055       dnl -Wold-style-cast is interesting, but triggers for macros from
1056       dnl system headers (e.g. FD_SET) (tested with GCC 4.4).
1058       dnl Automatically add -Werror if maintainer mode is enabled.
1059       if test x$USE_MAINTAINER_MODE = xyes; then
1060         AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
1061       fi
1062       ;;
1063     *__clang__*)
1064       dnl Intel's compiler (since __clang__ not substituted):
1065       dnl
1066       dnl -w1 stops the avalanche of uninteresting "remark" messages.
1067       dnl -wd... disables warnings which don't have good code workarounds.
1068       AM_CXXFLAGS="$AM_CXXFLAGS -Wall -w1 -wd177,1572"
1070       dnl Automatically add -Werror if maintainer mode is enabled.
1071       if test x$USE_MAINTAINER_MODE = xyes; then
1072         AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
1073       fi
1074       ;;
1075     *__INTEL_COMPILER*)
1076       dnl clang (since __INTEL_COMPILER not substituted):
1077       AM_CXXFLAGS="$AM_CXXFLAGS -Wall -W -Wredundant-decls -Wpointer-arith -Wcast-qual -Wcast-align -Wno-long-long -Wformat-security -fno-gnu-keywords -Wundef -Woverloaded-virtual"
1078       AM_CXXFLAGS="$AM_CXXFLAGS -Wshadow -Wstrict-overflow=1 -Winit-self -Wmissing-declarations"
1080       dnl Automatically add -Werror if maintainer mode is enabled.
1081       if test x$USE_MAINTAINER_MODE = xyes; then
1082         AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
1083       fi
1084       ;;
1085   esac
1087   if test no != "$enable_visibility"; then
1088     dnl GCC doesn't support symbol visibility on all platforms (e.g. it isn't
1089     dnl on mingw).
1090     AC_MSG_CHECKING([if $CXX -fvisibility=hidden works])
1091     if echo 'int bar() __attribute__((visibility("default"))); int foo() {return 42;}'|$CXX -Werror -fvisibility=hidden -c -oconftest.o -xc++ - >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ; then
1092       AC_MSG_RESULT([yes])
1093       AM_CXXFLAGS="$AM_CXXFLAGS -fvisibility=hidden"
1094       dash_d_visibility=-DXAPIAN_ENABLE_VISIBILITY
1095     else
1096       AC_MSG_RESULT([no])
1097     fi
1098   fi
1099 else
1100   dnl Not GCC, nor a compiler masquerading as GCC.
1101   case /$CXX in
1102   */aCC)
1103     dnl +w turns on more warnings.
1104     dnl +wlint turns on "lint-like" warnings.
1105     dnl +W<n1>,<n2>,... suppresses warnings n1, n2, ...
1106     dnl 2340 (remark) "value copied to temporary, reference to temporary
1107     dnl use", in: throw Xapian::UnimplementedError("...");
1108     dnl 2401 "destructor for base class ... is non-virtual" (we don't need a
1109     dnl virtual destructor for intrusive_base, since we never delete
1110     dnl       its subclasses by a intrusive_base *).
1111     dnl 3348 "declaration hides constant ..." which seems to misfire!
1112     dnl 4255 (remark) "padding size of struct "..." with ... bytes to
1113     dnl alignment boundary".
1114     dnl 4273 "floating-point equality and inequality comparisons may be
1115     dnl inappropriate due to roundoff common in floating-point computation"
1116     dnl No obvious workaround for when you really do want == or !=.
1117     dnl 4285 "operator= does not have a check for the source and destination
1118     dnl addresses being non-identical" - fires for AutoPtr which
1119     dnl includes such a check indirectly (internaltest's autoptr1 check this).
1120     dnl 20201 "Memory leak is detected" which triggers for "return new Foo;"!
1121     AM_CXXFLAGS="$AM_CXXFLAGS +w +wlint +W2340,2401,3348,4255,4273,4285,20201" ;;
1122   */sunCC|*/CC)
1123     dnl Sun's C++ compiler warns about functions failing to return a value even
1124     dnl when the function ends with a "throw" statement.  That's just unhelpful
1125     dnl noise, and adding a dummy "return" after "throw" seems a worse solution
1126     dnl than simply disabling this warning - any genuinely missing return
1127     dnl statements will get reported by compilers with superior warning
1128     dnl machinery.
1129     XAPIAN_TEST_CXXFLAGS([-erroff=voidretw], [AM_CXXFLAGS])
1130     ;;
1131   esac
1134 XAPIAN_TEST_LINKER_FLAG([-Bsymbolic-functions], [symbolic_functions],
1135   [XAPIAN_LDFLAGS="$XAPIAN_LDFLAGS $flag"])
1137 FP_EXCESS_PRECISION=no
1138 AC_MSG_CHECKING([whether to use SSE instructions on x86])
1139 case $host_cpu in
1140   i*86)
1141     if test "$enable_sse" = no ; then
1142       AC_MSG_RESULT([no])
1143       FP_EXCESS_PRECISION=yes
1144     else
1145       dnl Default to sse2.
1146       test "$enable_sse" != yes || enable_sse=sse2
1147       if test yes = "$GXX"; then
1148         AC_MSG_RESULT([yes (configure with --disable-sse to disable)])
1149         dnl We can unconditionally use -mtune=generic as it was added in GCC
1150         dnl 4.2, and supported at least as far back as clang 3.0.
1151         AM_CXXFLAGS="$AM_CXXFLAGS -mfpmath=sse -m$enable_sse -mtune=generic"
1152       else
1153         AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
1154 [[#ifndef __SUNPRO_CC
1155 #error Not Sun compiler
1156 #endif]])],
1157           [AC_MSG_RESULT([yes (configure with --disable-sse to disable)])
1158           AM_CXXFLAGS="$AM_CXXFLAGS -xarch=$enable_sse"]
1159           ,
1160           [AC_MSG_RESULT([don't know how to for compiler $CXX])]
1161         )
1162       fi
1163     fi
1164     ;;
1165   *)
1166     AC_MSG_RESULT([non-x86 arch ($host_cpu)]) ;;
1167 esac
1168 AC_SUBST([FP_EXCESS_PRECISION])
1170 AH_BOTTOM(
1171 [/* Disable stupid MSVC "performance" warning for converting int to bool. */
1172 #ifdef _MSC_VER
1173 # pragma warning(disable:4800)
1174 #endif
1176 /* _FORTIFY_SOURCE is only supported by GCC >= 4.1 and glibc >= 2.3.4, but it
1177  * shouldn't cause a problem to define it where it's not supported and some
1178  * distros may have backported support, so hardcoding version checks is
1179  * counter-productive.
1181  * Check if _FORTIFY_SOURCE is already defined to allow the user to override
1182  * our choice with "./configure CPPFLAGS=-D_FORTIFY_SOURCE=0" or "...=1".
1183  */
1184 #if defined __GNUC__ && !defined _FORTIFY_SOURCE
1185 # define _FORTIFY_SOURCE 2
1186 #endif
1188 /* For GCC >= 3.0 (and Intel's C++ compiler, which also defines __GNUC__),
1189  * we can use __builtin_expect to give the compiler hints about branch
1190  * prediction.  See HACKING for how to use these.
1191  */
1192 #if defined __GNUC__
1193 /* The arguments of __builtin_expect() are both long, so use !! to ensure that
1194  * the first argument is always an integer expression, and always 0 or 1, but
1195  * still has the same truth value for the if or while it is used in.
1196  */
1197 # define rare(COND) __builtin_expect(!!(COND), 0)
1198 # define usual(COND) __builtin_expect(!!(COND), 1)
1199 #else
1200 # define rare(COND) (COND)
1201 # define usual(COND) (COND)
1202 #endif
1204 /* Signal we're building the library so it's OK to include headers such as
1205  * xapian/query.h directly.
1206  */
1207 #define XAPIAN_LIB_BUILD 1
1209 /* With Sun CC 5.13 (Studio 12.4) on Solaris 11.2, <math.h> seems to get
1210  * implicitly included somehow before <cmath>, and compilation fails due
1211  * to 'std::exception' colliding with 'struct exception'.  It's not clear
1212  * how to avoid this, so just define the making macro which <cmath> does
1213  * before it includes <math.h>.
1214  */
1215 #ifdef __SUNPRO_CC
1216 # define __MATHERR_RENAME_EXCEPTION
1217 #endif
1220 AC_SUBST([AM_CXXFLAGS])
1222 dnl Restore CXXFLAGS to those the user specified or autoconf defaulted to.
1223 CXXFLAGS=$save_CXXFLAGS
1225 dnl Enable large file support if possible.
1226 AC_SYS_LARGEFILE
1227 dnl With xlC on AIX, -D_LARGE_FILES changes the ABI of std::string, so it
1228 dnl also needs to be used when compiling user code.
1229 abi_affecting_cxxflags=
1230 if $GREP '^#define _LARGE_FILES 1$' confdefs.h > /dev/null 2>&1 ; then
1231   abi_affecting_cxxflags=-D_LARGE_FILES
1233 AC_SUBST([abi_affecting_cxxflags])
1235 dnl Required for auto regeneration to work in a combined maintainer-mode tree.
1236 : ${AUTOM4TE=autom4te}
1237 AC_SUBST([AUTOM4TE])
1239 dnl Libtool sets this (to yes|no|unknown) and we use it in xapian-config.
1240 AC_SUBST([link_all_deplibs_CXX])
1242 dnl Shared library extension.
1243 module=no
1244 eval "SHLIBEXT=$shrext_cmds"
1245 AC_SUBST([SHLIBEXT])
1247 dnl We want to be able to use GNU make % pattern rules in maintainer targets
1248 dnl but automake warns these aren't portable, so we substitute the % to avoid
1249 dnl this warning.
1250 PERCENT='%'
1251 AC_SUBST([PERCENT])
1253 dnl Split up the version number into "MAJOR.MINOR.REVISION".
1254 MAJOR_VERSION=`echo "$VERSION"|sed 's/\..*//'`
1255 [MINOR_VERSION=`echo "$VERSION"|sed 's/[^.]*\.//;s/\..*//'`]
1256 [REVISION=`echo "$VERSION"|sed 's/.*\.//;s/_.*$//'`]
1258 dnl **************************
1259 dnl * Build the output files *
1260 dnl **************************
1262 AC_CONFIG_FILES([
1263  Makefile
1264  tests/Makefile
1265  docs/Makefile
1266  docs/doxygen_api.conf
1267  docs/doxygen_source.conf
1268  xapian-core.spec
1269  cmake/xapian-config.cmake
1270  cmake/xapian-config-version.cmake
1271  pkgconfig/xapian-core"$LIBRARY_VERSION_SUFFIX".pc:pkgconfig/xapian-core.pc.in
1272  ])
1273 AC_CONFIG_FILES([tests/runtest], [chmod +x tests/runtest])
1274 AC_CONFIG_FILES([tests/runsrv], [chmod +x tests/runsrv])
1275 AC_CONFIG_FILES([tests/submitperftest], [chmod +x tests/submitperftest])
1276 AC_CONFIG_FILES([tests/perftest/get_machine_info], [chmod +x tests/perftest/get_machine_info])
1277 AC_CONFIG_FILES([xapian-config], [chmod +x xapian-config])
1278 AC_CONFIG_FILES([makemanpage], [chmod +x makemanpage])
1279 AC_OUTPUT
1281 dnl There are no files generated by AC_OUTPUT in the following directories
1282 dnl and we need to ensure they exist so that the rest of configure or make
1283 dnl won't fail because they don't exist when srcdir != builddir.
1284 if test yes = "$vpath_build" ; then
1285   for dir in include/xapian languages queryparser ; do
1286     AS_MKDIR_P(["$dir"])
1287   done
1290 dnl Generate include/xapian/version.h:
1292 dnl MAIN_VERSION is VERSION without any _git123 suffix.
1293 MAIN_VERSION="$MAJOR_VERSION.$MINOR_VERSION.$REVISION"
1294 cxxcpp_flags=-I.
1295 for backend in CHERT GLASS INMEMORY REMOTE ; do
1296   val=`eval echo "\\\$BUILD_BACKEND_${backend}_TRUE"`
1297   if test -z "$val" ; then
1298     cxxcpp_flags="$cxxcpp_flags -DXAPIAN_HAS_${backend}_BACKEND"
1299   fi
1300 done
1302 if test yes = "$enable_64bit_docid" ; then
1303   cxxcpp_flags="$cxxcpp_flags -DXAPIAN_DOCID_BASE_TYPE=\"$INT64_T\""
1304 else
1305   cxxcpp_flags="$cxxcpp_flags -DXAPIAN_DOCID_BASE_TYPE=\"$INT32_T\""
1308 if test yes = "$enable_64bit_termcount" ; then
1309   cxxcpp_flags="$cxxcpp_flags -DXAPIAN_TERMCOUNT_BASE_TYPE=\"$INT64_T\""
1310 else
1311   cxxcpp_flags="$cxxcpp_flags -DXAPIAN_TERMCOUNT_BASE_TYPE=\"$INT32_T\""
1314 dnl For GCC (and compilers which pretend to be GCC) and MSVC, we create some
1315 dnl ABI checks in the generated version.h, and $CXXFLAGS may contain options
1316 dnl which affect the ABI (e.g. -fabi-version for GCC) so we want to use these
1317 dnl options when generating version.h.  For these compilers, CXXCPP="$CXX -E"
1318 dnl so it should understand all compiler options.
1320 dnl For other compilers, we only pass $CPPFLAGS to $CXXCPP in case it's an
1321 dnl external cpp which doesn't understand flags which might be in $CXXFLAGS.
1322 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[#ifndef __GNUC__
1323 #ifndef _MSC_VER
1324        choke me
1325 #endif
1326 #endif
1327 ]])],
1328         [cxxcpp_flags="$cxxcpp_flags $CPPFLAGS $CXXFLAGS"],
1329         [cxxcpp_flags="$cxxcpp_flags $CPPFLAGS"])
1330 rm -f include/xapian/version.h.tmp
1331 dnl "\r" in sed is a GNUism, but we only need to remove it on MS Windows
1332 dnl where we'll always have GNU sed, and other sed's will just interpret
1333 dnl it as "r" (Solaris sed) or maybe literal "\r" which won't match.
1335 dnl Use @@ around $MAIN_VERSION so we get " in the final output.
1336 $CXXCPP $cxxcpp_flags\
1337         -DSTRING_VERSION="\"@@$MAIN_VERSION@@\""\
1338         -DMAJOR_VERSION="\"$MAJOR_VERSION\""\
1339         -DMINOR_VERSION="\"$MINOR_VERSION\""\
1340         -DREVISION="\"$REVISION\""\
1341         $dash_d_visibility\
1342         $srcdir/include/xapian/version_h.cc|\
1343         ${SED-sed} '/"/!d;s/^ *//;/^#/d;s/ *$//;s/" *,//;s/"//g;s/@@/"/g;s/  */ /g;s/ *,\r$//;s/ *,$//'\
1344         > include/xapian/version.h.tmp
1345 dnl Only update the file if it has changed, so we don't alter the timestamp
1346 dnl and cause lots of rebuilding needlessly.  However, the build system
1347 dnl needs a timestamp to know when to regenerate version.h because version_h.cc
1348 dnl has changed so we use a separate timestamp file.
1349 touch include/xapian/version.h.timestamp
1350 if cmp include/xapian/version.h.tmp include/xapian/version.h >/dev/null 2>&1
1351 then
1352   rm include/xapian/version.h.tmp
1353 else
1354   mv include/xapian/version.h.tmp include/xapian/version.h