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
5 AC_INIT([xapian-core], [1.3.4], [http://xapian.org/bugs])
6 dnl See HACKING document for details of the reasons for required versions.
8 dnl Extract from the libtool info manual:
10 dnl Here are a set of rules to help you update your library version information:
12 dnl 1. Start with version information of '0:0:0' for each libtool library.
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
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').
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.
25 dnl 5. If any interfaces have been added since the last public release,
26 dnl then increment AGE.
28 dnl 6. If any interfaces have been removed since the last public release
29 dnl then set AGE to 0.
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 dnl 5:0:0 1.3.4 DB compaction and checking changes, etc
38 LIBRARY_VERSION_INFO=5:0:0
39 AC_SUBST([LIBRARY_VERSION_INFO])
41 LIBRARY_VERSION_SUFFIX=-1.3
42 AC_SUBST([LIBRARY_VERSION_SUFFIX])
44 dnl Disabled for stable release series.
45 dnl Default to "-1.3"; for no suffix, specify: --program-suffix=
46 test x"$program_suffix" != xNONE || program_suffix=-1.3
48 dnl Where xapian.h, etc go. In development release append "/xapian-1.3".
49 dnl incdir=$includedir
50 incdir=$includedir/xapian-1.3
53 dnl Check the build directory doesn't contain a space, so we die early with
57 AC_MSG_ERROR([You can't build in a directory whose path contains a space])
61 dnl Check the source directory doesn't contain a space, so we die early with
62 dnl a helpful error. FIXME: Unfortunately, configure seems to choke before
63 dnl it gets to us so this code doesn't get a chance to fire.
66 dnl Note: for in-tree builds, the build directory test above will fire
68 AC_MSG_ERROR([You can't build with sources in a directory whose path contains a space])
72 dnl Check the prefix to install in doesn't contain a space, so we die early with
76 AC_MSG_ERROR([You can't install in a directory whose path contains a space])
80 dnl Note if the user specified a particular C++ compiler so we can give a more
81 dnl appropriate error message if we can't link a simple C++ program.
83 if test -n "$CXX" ; then
84 original_CXX="CXX=$CXX"
85 elif test -n "$CCC" ; then
86 original_CXX="CCC=$CCC"
89 dnl See HACKING document for details of the reasons for required versions.
90 AM_INIT_AUTOMAKE([1.11 -Wportability tar-ustar no-dist-gzip dist-xz std-options])
91 AC_CONFIG_SRCDIR([matcher/multiandpostlist.cc])
93 AC_CONFIG_HEADERS([config.h])
95 AC_CONFIG_MACRO_DIR([m4])
97 dnl Use libtool to manage our libraries.
101 dnl -no-undefined causes problems on Solaris with Sun CC in C++11 mode, so only
102 dnl pass -no-undefined on platforms where it is required in order to link a
103 dnl shared library at all (Windows is the main one).
105 if test unsupported = "$allow_undefined_flag" ; then
106 NO_UNDEFINED=-no-undefined
108 AC_SUBST(NO_UNDEFINED)
112 dnl A standard "gotcha" for mingw and cygwin users is to not set up their
113 dnl PATH correctly, so that MSDOS FIND.EXE is found before Unix find. Help
114 dnl them out by checking for this condition, rather than letting libtool
115 dnl fail in obscure ways. NB check the *BUILD* OS, not the host one!
117 *mingw* | *cygwin* | pw32*)
118 find /dirunlikelytoexist >/dev/null 2>&1
119 if test $? = 2 ; then
120 dnl Unix find will return 1 if the directory didn't exist, or 0 if
123 *** You appear to have an MSDOS-like FIND.EXE in your PATH ahead of any
124 *** UNIX-like find. This misconfiguration will confuse libtool - you'll need
125 *** to make sure you have a UNIX-like find installed and fix your PATH, then
126 *** rerun configure. For more information, see:
128 *** https://www.cygwin.com/faq/faq.html#faq.using.find
134 dnl Add parameters for aclocal
135 dnl (This must come after AM_INIT_AUTOMAKE, since it modifies ACLOCAL)
136 ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
138 dnl disable "maintainer only" rules by default
141 dnl Checks for programs.
146 # Checked: freebsd8.0 openbsd4.6 solaris2.9 solaris2.10
148 linux* | k*bsd*-gnu | freebsd* | openbsd* | solaris*)
149 dnl Vanilla libtool sets this to "unknown" which it then handles as "yes".
150 link_all_deplibs_CXX=no
156 dnl Extract search path from ldconfig which is more reliable than the way
157 dnl vanilla libtool extracts them from ld.so.conf.
158 d=`/sbin/ldconfig -N -X -v 2>&AS_MESSAGE_LOG_FD|$SED 's,^\(/.*\):\( (.*)\)\?$,\1,p;d'|tr '\n' ' '`
159 test -z "$d" || sys_lib_dlsearch_path_spec=$d
164 *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
165 dnl On these platforms, libtool emits a warning if -no-install is passed,
166 dnl and uses -no-fast-install instead - the least ugly way to avoid that
167 dnl warnings seems to be to duplicate the above list of platforms from
168 dnl libtool and use -no-fast-install on them directly.
169 NO_INSTALL=-no-fast-install ;;
171 NO_INSTALL=-no-install ;;
173 AC_SUBST([NO_INSTALL])
175 dnl For reasons which are beyond me, if autoconf can't find a C++ compiler
176 dnl it will set CXX to g++ (which obviously won't work) rather than actually
177 dnl telling the user that it couldn't find a C++ compiler and telling them
178 dnl to either install one or set CXX if there's one configure failed to find.
179 dnl It's probably worthwhile checking that the C++ compiler actually works
181 if test -n "$CXX" ; then
183 AC_MSG_CHECKING([whether $CXX is a working C++ compiler])
184 AC_CACHE_VAL([xo_cv_cxx_works],
186 AC_TRY_RUN([int main() {}],
189 AC_TRY_LINK([], [], xo_cv_cxx_works=yes, xo_cv_cxx_works=no))
191 AC_MSG_RESULT([$xo_cv_cxx_works])
195 if test no = "$xo_cv_cxx_works" ; then
196 case $original_CXX in
198 dnl CCC is handled in a slightly odd way - if its value isn't an
199 dnl executable (taking PATH into account) then it is ignored!
200 test "$original_CXX" = "CCC=$CXX" || original_CXX=
203 if test -z "$original_CXX" ; then
205 *** You need a working C++ compiler to compile Xapian, but configure failed to
206 *** find one. If you have a working C++ compiler, you can tell configure where
207 *** to find it by invoking it like so:
209 *** ./configure CXX=/opt/bin/c++
213 *** You need a working C++ compiler to compile Xapian, but the compiler you
214 *** specified (with '$original_CXX') doesn't appear to be able to successfully
215 *** compile and link a simple program.
220 dnl Probe for any options needed to enable C++11 support.
221 AX_CXX_COMPILE_STDCXX_11
223 dnl We don't use a C compiler to compile Xapian's code, but on some platforms
224 dnl (e.g. mingw) libtool uses $LTCC which defaults to $CC, and it's also use to
225 dnl build auxiliary tools like snowball and lemon.
228 dnl We want a non-cross-compiling C compiler for building lemon with.
229 if test -z "$CC_FOR_BUILD" ; then
230 if test yes = "$cross_compiling"; then
236 AC_ARG_VAR([CC_FOR_BUILD], [C compiler command for native compilation (needed to compile build tools during cross-builds)])
238 dnl Run tests using the C++ compiler.
241 dnl Enable large file support if possible.
243 dnl With xlC on AIX, -D_LARGE_FILES changes the ABI of std::string, so it
244 dnl also needs to be used when compiling user code.
245 abi_affecting_cxxflags=
246 if $GREP '^#define _LARGE_FILES 1$' confdefs.h > /dev/null 2>&1 ; then
247 abi_affecting_cxxflags=-D_LARGE_FILES
249 AC_SUBST([abi_affecting_cxxflags])
253 AC_SUBST([XAPIAN_LDFLAGS])
254 AC_SUBST([XAPIAN_LIBS])
256 AC_DEFUN([XAPIAN_TEST_LINKER_FLAG],
258 AC_MSG_CHECKING([for $CXX -Wl,$1])
259 AC_CACHE_VAL([xo_cv_$2],
262 dnl The option in $1 will start with a dash so needs protecting. We can't
263 dnl use -e as Solaris /usr/bin/grep doesn't support that, so prepend an
264 dnl empty group instead.
265 if $CXX -Wl,$1 >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD|grep '\(\)'$1 >/dev/null 2>&1; then
266 dnl The error message contains the flag name - it must be a
267 dnl complaint that the option is unrecognized (doing it this
268 dnl way allows it to work regardless of the i18n in use):
269 dnl ld: unrecognized option '--enable-runtime-pseudo-reloc'
277 AC_MSG_RESULT([$xo_cv_$2])
280 dnl Test if the compiler works with $1 added to CXXFLAGS; if it does, add $1 to
281 dnl variable $2. If the test passes, also do $3; if it fails, also do $4.
282 AC_DEFUN([XAPIAN_TEST_CXXFLAGS],
284 XTC_save_CXXFLAGS=$CXXFLAGS
285 CXXFLAGS="$CXXFLAGS $1"
286 AC_TRY_COMPILE([], [],
288 CXXFLAGS=$XTC_save_CXXFLAGS
290 [CXXFLAGS=$XTC_save_CXXFLAGS
295 if test yesyes = "$GXX$enable_shared" ; then
298 XAPIAN_TEST_LINKER_FLAG([--enable-runtime-pseudo-reloc], [enable_runtime_pseudo_reloc],
299 [ldflags="-Wl,$flag"],
301 dnl Can't use AC_DISABLE_SHARED after AC_PROG_LIBTOOL, but
302 dnl this test needs to be after AC_PROG_LIBTOOL, so we can't
303 dnl just disable the shared build automatically...
304 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])
309 dnl Only works for ldflags which can be specified anywhere on the link line.
312 dnl Preserve the default CXXFLAGS.
313 save_CXXFLAGS=$CXXFLAGS
315 dnl x86 has excess precision issues with 387 FP instructions, which are
316 dnl avoided by using SSE instructions instead. This is also faster (~6% in
317 dnl a CPU bound testcase).
319 [AS_HELP_STRING([--disable-sse],
320 [disable use of SSE FP instructions on x86])]
321 [AS_HELP_STRING([[--enable-sse[=sse|sse2]]],
322 [set which SSE FP instructions to use on x86 (default: sse2)])],
323 [case ${enableval} in
325 *) AC_MSG_ERROR([bad value ${enableval} for --enable-sse or --disable-sse]) ;;
329 dnl Some versions of Sun's C++ compiler reportedly need an explicit -lm.
330 dnl The maths functions we use include: exp log ceil fabs sqrt
331 AC_MSG_CHECKING([if -lm is required for maths functions])
332 dnl Don't use constant arguments as the compiler might simply evaluate the
333 dnl whole expression at compile time, and it might inline certain functions
334 dnl so test several functions. Also write results using printf() so that
335 dnl the compiler can't optimise away the computations.
336 AC_TRY_LINK([#ifdef __SUNPRO_CC
337 #error Need -lm for Sun C++ 5.9 under libtool 2.2.10
342 using namespace std;], [
343 double a = log(ceil(time(NULL)/7.0));
344 printf("%f %f %f\n", a, sqrt(a), exp(fabs(a - 12345.6)));
345 ], [AC_MSG_RESULT([no])], [
347 AC_TRY_LINK([#include <cmath>
350 using namespace std;], [
351 double a = log(ceil(time(NULL)/7.0));
352 printf("%f %f %f\n", a, sqrt(a), exp(fabs(a - 12345.6)));],
353 [AC_MSG_RESULT([yes])],
354 [AC_MSG_ERROR([Failed to link a C++ program using <cmath>])
358 dnl C++11 should have log2(), but keep this check for now to allow for
359 dnl compilers with incomplete library support for C++11.
360 AC_CHECK_DECLS([log2], [], [], [#include <cmath>])
362 dnl See if <typeinfo> can be used in the testsuite - at least for GCC and xlC,
363 dnl compilation of the test code below fails if RTTI isn't being generated
364 dnl (g++ -fno-rtti, or by default with xlC).
365 AC_MSG_CHECKING([if RTTI is supported])
366 save_CXXFLAGS=$CXXFLAGS
367 dnl xlC issues a warning for typeid() being used without RTTI being enabled,
368 dnl so for this test we pass the xlC option to make that warning into an error.
369 XAPIAN_TEST_CXXFLAGS([-qhaltonmsg=1540-2412], [CXXFLAGS])
372 #include <typeinfo>],
377 } catch (std::exception & e) {
378 return typeid(e).name()[0];
381 AC_DEFINE([USE_RTTI], [1], [Define if the testsuite can use RTTI]),
383 CXXFLAGS=$save_CXXFLAGS
385 dnl Check for time functions.
386 AC_CHECK_FUNCS([clock_gettime sleep nanosleep gettimeofday ftime])
390 dnl For _ftime64() on mingw we need to tell it we're happy to require
391 dnl MSVCRT 6.10 or higher, which isn't too onerous a requirement it seems.
392 AC_DEFINE([__MSVCRT_VERSION__], [0x0601], [Define on mingw to the minimum msvcrt version to assume])
393 AC_DEFINE([MINGW_HAS_SECURE_API], [1], [Define on mingw to get _s suffixed "secure" functions declared in headers])
397 dnl We use timer_create() if available to implement a search time limit.
399 AC_SEARCH_LIBS([timer_create], [rt],
400 [XAPIAN_LIBS="$LIBS $XAPIAN_LIBS"
401 AC_DEFINE([HAVE_TIMER_CREATE], [1], [Define to 1 if you have the 'timer_create' function.])])
404 dnl Used by tests/soaktest/soaktest.cc
405 AC_CHECK_FUNCS([srandom random])
407 dnl Used by tests/harness/testsuite.cc
408 AC_CHECK_FUNCS([sigaction])
409 AC_MSG_CHECKING([for sigsetjmp and siglongjmp])
410 AC_TRY_COMPILE([#include <setjmp.h>],
411 [sigjmp_buf jb; if (sigsetjmp(jb, 1)) { siglongjmp(jb, 1); }],
412 AC_DEFINE([HAVE_SIGSETJMP], [1], [Define to 1 if you have the 'sigsetjmp' function])
413 AC_MSG_RESULT([yes]),
416 dnl Used by tests/harness/cputimer.cc:
417 AC_CHECK_FUNCS([getrusage times sysconf])
419 dnl Used by tests/api_replicate.cc, tests/queryparsertest.cc and
420 dnl tests/termgentest.cc.
422 dnl Solaris < 10 only has putenv().
424 dnl Microsoft have marked putenv() as deprecated, so we use _putenv_s() under
425 dnl MSVC to avoid deprecation warnings. We probe here since mingw doesn't
426 dnl currently (v3.20) provide _putenv_s(), so we can't just use it conditional
427 dnl on __WIN32__ being defined.
428 AC_CHECK_FUNCS([setenv _putenv_s])
430 dnl Check for a more efficient way of closing fds during daemonisation.
431 dnl Apparently closefrom() is available on at least "Solaris 9 or later, NetBSD
432 dnl 3.0 or later, OpenBSD 3.5 or later". If we don't have closefrom(), then
433 dnl dirfd() and getrlimit are useful for an efficient implementation on some
435 AC_CHECK_FUNCS([closefrom dirfd getrlimit])
437 dnl See if ftime returns void (as it does on mingw)
438 AC_MSG_CHECKING([return type of ftime])
439 if test $ac_cv_func_ftime = yes ; then
440 AC_TRY_COMPILE([#include <sys/timeb.h>],
441 [struct timeb tp; int i = ftime(&tp);],
442 AC_MSG_RESULT([int]),
443 AC_MSG_RESULT([void])
444 AC_DEFINE([FTIME_RETURNS_VOID], [1], [Define if ftime returns void]))
447 dnl Check how to find the hostname: uname() in sys/utsname.h, or gethostname()
448 dnl Don't use default includes as inttypes.h is found by Compaq C but not C++
449 dnl so it causes all header probes to fail.
450 AC_CHECK_HEADERS([sys/utsname.h], [], [], [ ])
451 AC_CHECK_FUNCS([gethostname])
453 dnl mingw (for instance) lacks ssize_t
460 AC_CHECK_SIZEOF([short])
461 AC_CHECK_SIZEOF([int])
462 AC_CHECK_SIZEOF([long])
463 AC_CHECK_SIZEOF([long long])
465 AC_CHECK_HEADERS([sys/types.h])
466 AC_CHECK_SIZEOF([off_t])
468 AC_MSG_CHECKING([for 32 bit integer type])
470 "$ac_cv_sizeof_int") INT32_T=int ;;
471 "$ac_cv_sizeof_long") INT32_T=long ;;
472 "$ac_cv_sizeof_short") INT32_T=short ;;
474 AC_MSG_RESULT([none found])
475 AC_MSG_ERROR([No 32 bit integer type found])
477 AC_MSG_RESULT([$INT32_T])
479 AC_MSG_CHECKING([for 64 bit integer type])
481 "$ac_cv_sizeof_int") INT64_T=int ;;
482 "$ac_cv_sizeof_long") INT64_T=long ;;
483 "$ac_cv_sizeof_long_long") INT64_T='long long' ;;
485 AC_MSG_RESULT([none found])
486 AC_MSG_ERROR([No 64 bit integer type found])
488 AC_MSG_RESULT([$INT64_T])
490 dnl Used to avoid undefined behaviour left shifting file sizes.
491 AC_MSG_CHECKING([for unsigned equivalent of off_t])
492 case $ac_cv_sizeof_off_t in
493 "$ac_cv_sizeof_int") UNSIGNED_OFF_T=unsigned ;;
494 "$ac_cv_sizeof_long") UNSIGNED_OFF_T='unsigned long' ;;
495 "$ac_cv_sizeof_long_long") UNSIGNED_OFF_T='unsigned long long' ;;
497 AC_MSG_RESULT([none found])
498 AC_MSG_ERROR([No unsigned type equivalent to off_t found])
500 AC_DEFINE_UNQUOTED([UNSIGNED_OFF_T], [$UNSIGNED_OFF_T], [Define to an unsigned type equivalent to off_t])
501 AC_MSG_RESULT([$UNSIGNED_OFF_T])
503 dnl Check for perl (needed to generate some sources and documentation).
504 AC_PATH_PROG([PERL], [perl], [])
505 if test x$USE_MAINTAINER_MODE = xyes; then
506 test -z "$PERL" && AC_MSG_ERROR([perl is required in maintainer mode])
509 AC_ARG_ENABLE([64bit_docid],
510 [AS_HELP_STRING([--enable-64bit-docid], [enable 64bit docid [default=no]])],
511 [case ${enableval} in
513 *) AC_MSG_ERROR([bad value ${enableval} for --enable-64bit-docid]) ;;
515 [enable_64bit_docid=no])
517 AC_ARG_ENABLE([64bit_termcount],
518 [AS_HELP_STRING([--enable-64bit-termcount], [enable 64bit termcount [default=no]])],
519 [case ${enableval} in
521 *) AC_MSG_ERROR([bad value ${enableval} for --enable-64bit-termcount]) ;;
523 [enable_64bit_termcount=no])
525 AC_ARG_ENABLE([documentation],
526 [AS_HELP_STRING([--enable-documentation], [enable make rules to rebuild documentation [default=maintainer-mode]])],
527 [case ${enableval} in
529 *) AC_MSG_ERROR([bad value ${enableval} for --enable-documentation]) ;;
531 [enable_documentation=$USE_MAINTAINER_MODE])
532 AM_CONDITIONAL([DOCUMENTATION_RULES], [test x"$enable_documentation" = xyes])
533 AM_CONDITIONAL([MAINTAINER_NO_DOCS], [test x"$USE_MAINTAINER_MODE$enable_documentation" = xyesno])
535 if test x"$enable_documentation" = xyes ; then
536 dnl Checks for dot. (Diagrams in the documentation)
537 AC_PATH_PROG([DOT], [dot])
538 test -z "$DOT" && AC_MSG_ERROR([dot (part of the graphviz package) is required to build documentation])
539 DOXYGEN_DOT_PATH=`echo "$DOT" | sed 's!/dot$!!'`
540 AC_SUBST([DOXYGEN_DOT_PATH])
542 dnl Check for doxygen. (Needed to make some more of the documentation)
543 AC_PATH_PROG([DOXYGEN], [doxygen], [])
544 test -z "$DOXYGEN" && AC_MSG_ERROR([doxygen is required to build documentation])
546 dnl Check for help2man. (Needed to make man pages from "--help" output).
547 AC_PATH_PROG([HELP2MAN], [help2man], [])
548 test -z "$HELP2MAN" && AC_MSG_ERROR([help2man is required to build documentation])
550 dnl Check for rst2html. (Needed to make HTML from reStructuredText format)
551 dnl Also look for rst2html.py, which archlinux reportedly installs it as.
552 AC_PATH_PROGS([RST2HTML], [rst2html rst2html.py], [])
553 test -z "$RST2HTML" && AC_MSG_ERROR([rst2html is required to build documentation (try package python-docutils)])
555 dnl Check for pngcrush, which we optionally use to reduce the size of the
556 dnl PNG files which doxygen generates. We can get by without it, so don't
557 dnl fail here if it's not found.
558 AC_PATH_PROG([PNGCRUSH], [pngcrush], [])
561 dnl Check whether we need -ldl for dlsym() etc.
562 dnl No longer used...
563 dnl AC_TRY_LINK_FUNC([dlsym], ,
564 dnl [AC_CHECK_LIB([dl], [dlsym], [DL_LIBS="-ldl"])])
565 dnl AC_SUBST([DL_LIBS])
567 dnl Checks for header files.
568 AC_CHECK_HEADERS([fcntl.h limits.h sys/errno.h sys/select.h], [], [], [ ])
569 AC_CHECK_HEADERS([sys/resource.h],
570 [], [], [#include <sys/types.h>])
572 dnl If valgrind is installed and new enough, we use it for leak checking in the
573 dnl testsuite. If VALGRIND is set to an empty value, then skip the check and
574 dnl don't use valgrind.
575 if test -n "${VALGRIND-unset}" ; then
576 AC_PATH_PROG([VALGRIND], [valgrind], [])
577 if test -n "$VALGRIND" ; then
578 dnl Check that the installed valgrind version works, and supports the
579 dnl options we use. This means we won't try to use valgrind < 3.3.0
580 dnl (released 7/12/2007) since before that --log-file didn't expand
581 dnl %p (and appended the process id).
583 dnl No need to check for VALGRIND_COUNT_LEAKS now - that was added before
585 AC_MSG_CHECKING([if valgrind supports --log-file with %p])
586 vglog=config.vglog.%p.tmp
587 vglogwild="config.vglog.*.tmp*"
589 if $VALGRIND --log-file="$vglog" -q true 2>&AS_MESSAGE_LOG_FD ; then
590 for f in $vglogwild ; do
592 $vglog*) VALGRIND= ;;
595 if test x"$VALGRIND" = x ; then
599 AC_CHECK_HEADERS([valgrind/memcheck.h], [], [VALGRIND=], [ ])
602 dnl The valgrind detected doesn't seem to work! Perhaps this is an
603 dnl x86_64 box with a 32 bit valgrind.
604 AC_MSG_RESULT([$VALGRIND doesn't work])
611 if test -n "$VALGRIND" ; then
612 AC_DEFINE([HAVE_VALGRIND], [1], [Define if a suitable valgrind is installed])
615 dnl If eatmydata is installed, we run the testsuite under it to speed it up.
616 dnl If EATMYDATA is set to an empty value, then skip this check and don't use
618 if test -n "${EATMYDATA-unset}" ; then
619 AC_PATH_PROG([EATMYDATA], [eatmydata], [])
622 dnl Checks for library functions.
625 AC_CHECK_DECLS([sys_errlist, _sys_errlist, sys_nerr, _sys_nerr])
627 dnl Check that snprintf actually works as it's meant to.
629 dnl Linux 'man snprintf' warns:
630 dnl Linux libc4.[45] does not have a snprintf, but provides a libbsd that
631 dnl contains an snprintf equivalent to sprintf, i.e., one that ignores the
632 dnl size argument. Thus, the use of snprintf with early libc4 leads to
633 dnl serious security problems.
635 dnl It also warns that glibc < 2.0.6 (and presumably other pre-C90
636 dnl implementations) return -1 when truncating so check that we get the
637 dnl ISO C90 semantics for the returned length when truncating. If we
638 dnl have a working snprintf but with non-ISO return semantics, handle
639 dnl that case separately as it may still be useful in many cases.
641 dnl mingw has _snprintf so check for that too.
642 AC_MSG_CHECKING([for working ISO C90 conforming snprintf])
643 ac_cv_func_snprintf_noniso=no
644 for func in snprintf _snprintf ; do
652 dnl Return different exit status for each error so we can see which
653 dnl check failed by consulting config.log.
655 char buffer[4] = "abc";
656 int res1 = $func(buffer, 2, "%s", "XYZ");
657 if (memcmp(buffer, "X\0c", 4) != 0) return 2;
658 int res2 = $func(buffer, 2, "%x", 0x12);
659 if (memcmp(buffer, "1\0c", 4) != 0) return 3;
660 if (res1 == -1 && res2 == -1) return 15; /* Pre-ISO semantics. */
661 if (res1 != 3) return 4;
662 if (res2 != 2) return 5;
665 [ac_cv_func_snprintf=$func;break],
667 if test 15no = "$?$ac_cv_func_snprintf_noniso" ; then
668 ac_cv_func_snprintf_noniso=$func
670 ac_cv_func_snprintf=no
672 [ac_cv_func_snprintf=unknown;break]
675 AC_MSG_RESULT([$ac_cv_func_snprintf])
676 case $ac_cv_func_snprintf in
678 AC_MSG_CHECKING([for working non-ISO C90 conforming snprintf])
679 AC_MSG_RESULT([$ac_cv_func_snprintf_noniso])
680 if test no != "$ac_cv_func_snprintf_noniso" ; then
681 AC_DEFINE_UNQUOTED([SNPRINTF], [$ac_cv_func_snprintf_noniso],
682 [Define to the name of a function implementing snprintf but not caring about ISO C99 return value semantics (if one exists)])
686 dnl be conservative when crosscompiling
689 AC_DEFINE_UNQUOTED([SNPRINTF_ISO], [$ac_cv_func_snprintf],
690 [Define to the name of a function implementing snprintf with ISO C99 semantics (if one exists)])
691 AC_DEFINE_UNQUOTED([SNPRINTF], [$ac_cv_func_snprintf],
692 [Define to the name of a function implementing snprintf but not caring about ISO C99 return value semantics (if one exists)])
696 dnl ***************************
697 dnl * Select modules to build *
698 dnl ***************************
700 dnl Check which database backends should be built.
702 AC_DEFUN([XAPIAN_BACKEND_ENABLE],
703 [AC_ARG_ENABLE([backend_$1],
704 [AS_HELP_STRING([--enable-backend-$1], [build the $1 database backend [default=yes]])],
707 *) AC_MSG_ERROR([Invalid option: '--enable-backend-$1=$enableval']) ;;
708 esac], [enable_backend_$1=yes])
711 dnl When adding a new backend, update INSTALL too.
712 XAPIAN_BACKEND_ENABLE([chert])
713 XAPIAN_BACKEND_ENABLE([glass])
714 XAPIAN_BACKEND_ENABLE([inmemory])
715 XAPIAN_BACKEND_ENABLE([remote])
718 case $enable_backend_chert$enable_backend_glass in
720 dnl We use zlib for compressing tags in chert/glass. We could
721 dnl automatically disable support if zlib isn't found, but overall that
722 dnl probably does more harm than good - it's most likely that someone just
723 dnl forgot to install the -dev package for zlib.
725 dnl Similarly for uuid support.
727 dnl Check for zlib.h.
728 AC_CHECK_HEADERS([zlib.h], [], [
729 AC_MSG_ERROR([zlib.h not found - required for chert and glass (you may need to install the zlib1g-dev or zlib-devel package)])
732 dnl Check for zlibVersion in -lz.
734 dnl mingw build needs -lzlib or -lzdll.
735 AC_SEARCH_LIBS([zlibVersion], [z zlib zdll], [], [
736 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)])
738 if test x != x"$LIBS" ; then
739 XAPIAN_LIBS="$XAPIAN_LIBS $LIBS"
743 dnl Find the UUID library (from e2fsprogs/util-linux-ng, not the OSSP one).
746 *mingw* | *cygwin*) dnl Use built-in API.
750 dnl Check for uuid/uuid.h (e2fsprogs/util-linux-ng) or uuid.h
751 dnl (FreeBSD/NetBSD).
752 AC_CHECK_HEADERS([uuid/uuid.h], [
753 dnl util-linux-ng's uuid/uuid.h found - check for uuid_generate in
756 AC_SEARCH_LIBS([uuid_generate], [uuid], [], [
757 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)])
759 if test x != x"$LIBS" ; then
760 XAPIAN_LIBS="$XAPIAN_LIBS $LIBS"
763 dnl Try uuid.h as found on FreeBSD/NetBSD, with associated code in libc.
764 AC_CHECK_HEADERS([uuid.h], [
765 dnl Check for uuid_create with no extra libraries required.
766 AC_CHECK_FUNC([uuid_create], [], [
767 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)])
770 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)])
776 dnl Older versions of libuuid (such as that on CentOS 4.7) don't have
777 dnl uuid_unparse_lower(), only uuid_unparse().
778 AC_LINK_IFELSE([AC_LANG_CALL([], [uuid_unparse_lower])],
780 AC_DEFINE([HAVE_UUID_UNPARSE_LOWER], [1],
781 [Define to 1 if you have the 'uuid_unparse_lower' function.])
786 AM_CONDITIONAL([USE_WIN32_UUID_API], [test "$use_win32_uuid_api" = 1])
789 if test "$enable_backend_remote" = yes ; then
790 AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
794 ]])], [win32=no], [win32=yes])
796 case $host_os-$win32 in
798 dnl For mingw and msvc we have an alternative implementation which
799 dnl doesn't need fork() or socketpair().
801 dnl We need -lws2_32 for getaddrinfo(), etc.
803 dnl Vista is needed for the AI_ADDRCONFIG flag to getaddrinfo().
804 AC_DEFINE([WINVER], [0x600],
805 [Version of Windows to assume (0x600 => Vista).])
806 AC_DEFINE([_WIN32_WINNT], [WINVER],
807 [Version of Windows to assume.])
810 dnl DJGPP has a dummy implementation of fork which always fails.
812 dnl For disk-based backend, use flock() for locking, which doesn't need
813 dnl fork() or socketpair().
814 AC_DEFINE([FLINTLOCK_USE_FLOCK], 1, [Define to use flock() for flint-compatible locking])
815 dnl If someone actually wanted remote backend support, then DJGPP has a
816 dnl pthreads port, so using threads like we do on Windows would make more
818 enable_backend_remote=no
821 dnl On Unix, we need fork and socketpair for the remotebackend.
823 AC_CHECK_FUNCS([fork], [], [
824 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.)])
826 dnl Check if -lsocket is required for socketpair (Solaris needs it).
827 dnl And on Haiku it's in -lnetwork.
828 AC_SEARCH_LIBS([socketpair], [socket network], [], [
829 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.)])
831 AC_DEFINE([HAVE_SOCKETPAIR], [1],
832 [Define to 1 if you have the 'socketpair' function.])
833 dnl Check if extra libraries are needed for getaddrinfo or inet_ntop()
834 dnl (e.g. on Solaris).
836 dnl We're currently assuming that any system that is worth trying to
837 dnl support has getaddrinfo() and inet_ntop(), since these are the
838 dnl standard route for supporting IPv6, and that's pretty much essential
839 dnl for platforms to support now.
840 AC_SEARCH_LIBS([getaddrinfo], [nsl socket], [], [
841 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.)])
843 AC_SEARCH_LIBS([inet_ntop], [nsl socket], [], [
844 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.)])
851 if test "$enable_backend_remote" = yes ; then
853 XAPIAN_LIBS="$XAPIAN_LIBS $REMOTE_LIBS"
857 AC_ARG_ENABLE([visibility],
858 [AS_HELP_STRING([--disable-visibility], [disable use of GCC visibility])],
859 [case ${enableval} in
861 *) AC_MSG_ERROR([bad value ${enableval} for --disable-visibility]) ;;
865 if test "`pwd`" != "`cd $srcdir;pwd`" ; then
868 AM_CONDITIONAL([VPATH_BUILD], [test yes = "$vpath_build"])
870 dnl Turn off compilation of anything that we don't have the requirements for
872 dnl Set conditionals to specify what we compile
874 AM_CONDITIONAL([BUILD_BACKEND_CHERT], [test yes = "$enable_backend_chert"])
875 AM_CONDITIONAL([BUILD_BACKEND_GLASS], [test yes = "$enable_backend_glass"])
876 AM_CONDITIONAL([BUILD_BACKEND_INMEMORY], [test yes = "$enable_backend_inmemory"])
877 AM_CONDITIONAL([BUILD_BACKEND_REMOTE], [test yes = "$enable_backend_remote"])
878 AM_CONDITIONAL([BUILD_BACKEND_CHERT_OR_GLASS],
879 [test nono != "$enable_backend_chert$enable_backend_glass"])
881 dnl Used to decide if we should use the zlib-vg.so LD_PRELOAD hack.
883 if test -n "$VALGRIND" ; then
885 linux*) use_zlib_vg=yes ;;
888 AM_CONDITIONAL([USE_ZLIB_VG], [test yes = "$use_zlib_vg"])
890 dnl See if we have fdatasync, and what libraries are needed for it.
891 dnl We need to actually check for a declaration as OS X has a dummy
892 dnl implementation in the library which is not prototyped in any header.
893 AC_CHECK_DECL([fdatasync(int)], [
895 AC_SEARCH_LIBS([fdatasync], [rt], [XAPIAN_LIBS="$LIBS $XAPIAN_LIBS"])
897 AC_CHECK_FUNCS([fdatasync])
899 [ac_cv_func_fdatasync=no],
900 [#include <unistd.h>]
903 AC_CHECK_FUNCS([fsync])
904 AC_CHECK_FUNCS([posix_fadvise])
905 AC_CHECK_FUNCS([ftruncate])
907 dnl HP-UX has pread and pwrite, but they don't work! Apparently this problem
908 dnl manifests when largefile support is enabled, and we definitely want that
909 dnl so don't use pread or pwrite on HP-UX.
912 AC_MSG_CHECKING([for pread])
913 AC_MSG_RESULT([present but broken on $host_os])
914 AC_MSG_CHECKING([for pwrite])
915 AC_MSG_RESULT([present but broken on $host_os])
918 AC_CHECK_FUNC([pread],
919 [AC_DEFINE([HAVE_PREAD], [1],
920 [Define if pread is available on this system])
921 AC_MSG_CHECKING([for any prototype needed for pread])
922 AC_CACHE_VAL([xo_cv_pread_prototype],
925 'extern "C" ssize_t pread(int, void *, size_t, off_t) throw ();' \
926 'extern "C" ssize_t pread(int, void *, size_t, off_t);' ; do
928 #include <sys/types.h>
933 pread(1, b, 256, 20);
935 xo_cv_pread_prototype="$p"
939 if test -z "$xo_cv_pread_prototype"; then
940 AC_MSG_RESULT([not found])
941 AC_MSG_ERROR([Failed to find working prototype for pread])
944 if test " " = "$xo_cv_pread_prototype" ; then
945 AC_MSG_RESULT([none required])
947 AC_MSG_RESULT([$xo_cv_pread_prototype])
948 AC_DEFINE_UNQUOTED([PREAD_PROTOTYPE], [$xo_cv_pread_prototype],
949 [explicit prototype needed for pread (if any)])
952 AC_CHECK_FUNC([pwrite],
953 [AC_DEFINE([HAVE_PWRITE], [1],
954 [Define if pwrite is available on this system])
955 AC_MSG_CHECKING([for any prototype needed for pwrite])
956 AC_CACHE_VAL([xo_cv_pwrite_prototype],
959 'extern "C" ssize_t pwrite(int, const void *, size_t, off_t) throw ();' \
960 'extern "C" ssize_t pwrite(int, const void *, size_t, off_t);' ; do
962 #include <sys/types.h>
966 const char *p = "hello";
969 xo_cv_pwrite_prototype="$p"
973 if test -z "$xo_cv_pwrite_prototype"; then
974 AC_MSG_RESULT([not found])
975 AC_MSG_ERROR([Failed to find working prototype for pwrite])
978 if test " " = "$xo_cv_pwrite_prototype" ; then
979 AC_MSG_RESULT([none required])
981 AC_MSG_RESULT([$xo_cv_pwrite_prototype])
982 AC_DEFINE_UNQUOTED([PWRITE_PROTOTYPE], [$xo_cv_pwrite_prototype],
983 [explicit prototype needed for pwrite (if any)])
989 AC_CHECK_FUNCS([link])
991 dnl *************************
992 dnl * Set debugging options *
993 dnl *************************
995 dnl Which assertion types to enable in the code.
997 AC_ARG_ENABLE([assertions],
998 [AS_HELP_STRING([--enable-assertions], [enable debug assertions (no|partial|yes) [default=no]])],
1002 AC_MSG_ERROR([Invalid option: '--enable-assertions=$enableval']) ;;
1005 AC_ARG_ENABLE([log],
1006 [AS_HELP_STRING([--enable-log], [generate a log of methods called, etc (no|yes|profile) [default=no]])],
1010 AC_MSG_ERROR(['--enable-log=profile' is no longer supported - see http://trac.xapian.org/wiki/ProfilingXapian for alternatives.]) ;;
1012 AC_MSG_ERROR([Invalid option: '--enable-log=$enableval']) ;;
1015 dnl Set defines according to the --enable-assertions and --enable-log options
1018 if test yes = "$enable_assertions" || test partial = "$enable_assertions" ; then
1019 AC_DEFINE([XAPIAN_ASSERTIONS],,
1020 [Define if you want assertions (causes some slow-down)])
1023 if test yes = "$enable_assertions"; then
1024 AC_DEFINE([XAPIAN_ASSERTIONS_PARANOID],,
1025 [Define if you want paranoid assertions (causes significant slow-down)])
1028 if test yes = "$enable_log"; then
1029 AC_DEFINE([XAPIAN_DEBUG_LOG],,
1030 [Define if you want a log of methods called and other debug messages])
1033 dnl ******************************
1034 dnl * Set special compiler flags *
1035 dnl ******************************
1037 dnl Set flags to control warnings (enable more, or disable annoying ones).
1039 if test yes = "$GXX"; then
1040 dnl Intel's C++ compiler and clang both lie and define __GNUC__, so check which
1041 dnl we actually have, as neither is really 100% compatible.
1042 case `echo __INTEL_COMPILER __clang__|$CXX -E - 2>&AS_MESSAGE_LOG_FD|grep -v '^#'` in
1043 *__INTEL_COMPILER*__clang__*)
1044 dnl GCC (since neither substituted):
1046 dnl The exact format of g++ --version seems to change with almost every
1047 dnl minor release so use the preprocessor macros which should be more
1049 AC_MSG_CHECKING([for version of $CXX])
1050 gxx_version=`echo __GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__|$CXX -E -|sed '/^#/d;s/ //g'`
1051 AC_MSG_RESULT([GCC $gxx_version])
1053 case $gxx_version in
1054 [[0123]].*|4.[[0-6]].*)
1055 AC_MSG_ERROR([Xapian requires GCC 4.7 or later])
1059 dnl -Wundef was supported by g++ 3.0 and -fshow-column by g++ 3.1.
1061 dnl -Wlogical-op and -Wmissing-declarations (for C++) were added in
1064 dnl -Wdouble-promotion was added in GCC 4.6.
1066 dnl -Winit-self was added in GCC 3.4, but for GCC < 4.7 g++ always
1067 dnl warns for this case with -Wuninitialized (implied by -W). We
1068 dnl don't intend to use this idiom, so any instances are bugs we'd
1069 dnl like to know about.
1071 dnl All the other options were supported by g++ 2.95.
1072 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 -Wdouble-promotion -Winit-self"
1075 dnl -Wconversion in older GCC versions is intended to help migration
1076 dnl from K&R to ISO C, and isn't useful for us. In 4.3 it was renamed
1077 dnl to -Wtraditional-conversion and a new -Wconversion added which
1078 dnl sounds useful but is a bit buggy currently. So we should consider
1079 dnl enabling -Wconversion once it is stabilised (GCC 4.4 or ...)
1081 dnl -Wold-style-cast is interesting, but triggers for macros from
1082 dnl system headers (e.g. FD_SET) (tested with GCC 4.4).
1084 dnl Automatically add -Werror if maintainer mode is enabled.
1085 if test x$USE_MAINTAINER_MODE = xyes; then
1086 AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
1090 dnl Intel's compiler (since __clang__ not substituted):
1092 dnl -w1 stops the avalanche of uninteresting "remark" messages.
1093 dnl -wd... disables warnings which don't have good code workarounds.
1094 AM_CXXFLAGS="$AM_CXXFLAGS -Wall -w1 -wd177,1572"
1096 dnl Automatically add -Werror if maintainer mode is enabled.
1097 if test x$USE_MAINTAINER_MODE = xyes; then
1098 AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
1102 dnl clang (since __INTEL_COMPILER not substituted):
1103 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"
1104 AM_CXXFLAGS="$AM_CXXFLAGS -Wshadow -Wstrict-overflow=1 -Winit-self -Wmissing-declarations"
1106 dnl Automatically add -Werror if maintainer mode is enabled.
1107 if test x$USE_MAINTAINER_MODE = xyes; then
1108 AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
1113 if test no != "$enable_visibility"; then
1114 dnl GCC doesn't support symbol visibility on all platforms (e.g. it isn't
1116 AC_MSG_CHECKING([if $CXX -fvisibility=hidden works])
1117 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
1118 AC_MSG_RESULT([yes])
1119 AM_CXXFLAGS="$AM_CXXFLAGS -fvisibility=hidden"
1120 dash_d_visibility=-DXAPIAN_ENABLE_VISIBILITY
1126 dnl Not GCC, nor a compiler masquerading as GCC.
1129 dnl +w turns on more warnings.
1130 dnl +wlint turns on "lint-like" warnings.
1131 dnl +W<n1>,<n2>,... suppresses warnings n1, n2, ...
1132 dnl 2340 (remark) "value copied to temporary, reference to temporary
1133 dnl use", in: throw Xapian::UnimplementedError("...");
1134 dnl 2401 "destructor for base class ... is non-virtual" (we don't need a
1135 dnl virtual destructor for intrusive_base, since we never delete
1136 dnl its subclasses by a intrusive_base *).
1137 dnl 3348 "declaration hides constant ..." which seems to misfire!
1138 dnl 4255 (remark) "padding size of struct "..." with ... bytes to
1139 dnl alignment boundary".
1140 dnl 4273 "floating-point equality and inequality comparisons may be
1141 dnl inappropriate due to roundoff common in floating-point computation"
1142 dnl No obvious workaround for when you really do want == or !=.
1143 dnl 4285 "operator= does not have a check for the source and destination
1144 dnl addresses being non-identical" - fires for AutoPtr which
1145 dnl includes such a check indirectly (internaltest's autoptr1 check this).
1146 dnl 20201 "Memory leak is detected" which triggers for "return new Foo;"!
1147 AM_CXXFLAGS="$AM_CXXFLAGS +w +wlint +W2340,2401,3348,4255,4273,4285,20201" ;;
1149 dnl Sun's C++ compiler warns about functions failing to return a value even
1150 dnl when the function ends with a "throw" statement. That's just unhelpful
1151 dnl noise, and adding a dummy "return" after "throw" seems a worse solution
1152 dnl than simply disabling this warning - any genuinely missing return
1153 dnl statements will get reported by compilers with superior warning
1155 XAPIAN_TEST_CXXFLAGS([-erroff=voidretw], [AM_CXXFLAGS])
1160 XAPIAN_TEST_LINKER_FLAG([-Bsymbolic-functions], [symbolic_functions],
1161 [XAPIAN_LDFLAGS="$XAPIAN_LDFLAGS $flag"])
1163 FP_EXCESS_PRECISION=no
1164 AC_MSG_CHECKING([whether to use SSE instructions on x86])
1167 if test "$enable_sse" = no ; then
1169 FP_EXCESS_PRECISION=yes
1171 dnl Default to sse2.
1172 test "$enable_sse" != yes || enable_sse=sse2
1173 if test yes = "$GXX"; then
1174 AC_MSG_RESULT([yes (configure with --disable-sse to disable)])
1175 dnl We can unconditionally use -mtune=generic as it was added in GCC
1176 dnl 4.2, and supported at least as far back as clang 3.0.
1177 AM_CXXFLAGS="$AM_CXXFLAGS -mfpmath=sse -m$enable_sse -mtune=generic"
1179 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
1180 [[#ifndef __SUNPRO_CC
1181 #error Not Sun compiler
1183 [AC_MSG_RESULT([yes (configure with --disable-sse to disable)])
1184 AM_CXXFLAGS="$AM_CXXFLAGS -xarch=$enable_sse"]
1186 [AC_MSG_RESULT([don't know how to for compiler $CXX])]
1192 AC_MSG_RESULT([non-x86 arch ($host_cpu)]) ;;
1194 AC_SUBST([FP_EXCESS_PRECISION])
1197 [/* Disable stupid MSVC "performance" warning for converting int to bool. */
1199 # pragma warning(disable:4800)
1202 /* _FORTIFY_SOURCE is only supported by GCC >= 4.1 and glibc >= 2.3.4, but it
1203 * shouldn't cause a problem to define it where it's not supported and some
1204 * distros may have backported support, so hardcoding version checks is
1205 * counter-productive.
1207 * Check if _FORTIFY_SOURCE is already defined to allow the user to override
1208 * our choice with "./configure CPPFLAGS=-D_FORTIFY_SOURCE=0" or "...=1".
1210 #if defined __GNUC__ && !defined _FORTIFY_SOURCE
1211 # define _FORTIFY_SOURCE 2
1214 /* For GCC >= 3.0 (and Intel's C++ compiler, which also defines __GNUC__),
1215 * we can use __builtin_expect to give the compiler hints about branch
1216 * prediction. See HACKING for how to use these.
1218 #if defined __GNUC__
1219 /* The arguments of __builtin_expect() are both long, so use !! to ensure that
1220 * the first argument is always an integer expression, and always 0 or 1, but
1221 * still has the same truth value for the if or while it is used in.
1223 # define rare(COND) __builtin_expect(!!(COND), 0)
1224 # define usual(COND) __builtin_expect(!!(COND), 1)
1226 # define rare(COND) (COND)
1227 # define usual(COND) (COND)
1230 /* Signal we're building the library so it's OK to include headers such as
1231 * xapian/query.h directly.
1233 #define XAPIAN_LIB_BUILD 1
1235 /* With Sun CC 5.13 (Studio 12.4) on Solaris 11.2, <math.h> seems to get
1236 * implicitly included somehow before <cmath>, and compilation fails due
1237 * to 'std::exception' colliding with 'struct exception'. It's not clear
1238 * how to avoid this, so just define the making macro which <cmath> does
1239 * before it includes <math.h>.
1242 # define __MATHERR_RENAME_EXCEPTION
1246 AC_SUBST([AM_CXXFLAGS])
1248 dnl Restore CXXFLAGS to those the user specified or autoconf defaulted to.
1249 CXXFLAGS=$save_CXXFLAGS
1251 dnl Required for auto regeneration to work in a combined maintainer-mode tree.
1252 : ${AUTOM4TE=autom4te}
1253 AC_SUBST([AUTOM4TE])
1255 dnl Libtool sets this (to yes|no|unknown) and we use it in xapian-config.
1256 AC_SUBST([link_all_deplibs_CXX])
1258 dnl Shared library extension.
1260 eval "SHLIBEXT=$shrext_cmds"
1261 AC_SUBST([SHLIBEXT])
1263 dnl We want to be able to use GNU make % pattern rules in maintainer targets
1264 dnl but automake warns these aren't portable, so we substitute the % to avoid
1269 dnl Split up the version number into "MAJOR.MINOR.REVISION".
1270 MAJOR_VERSION=`echo "$VERSION"|sed 's/\..*//'`
1271 [MINOR_VERSION=`echo "$VERSION"|sed 's/[^.]*\.//;s/\..*//'`]
1272 [REVISION=`echo "$VERSION"|sed 's/.*\.//;s/_.*$//'`]
1274 dnl **************************
1275 dnl * Build the output files *
1276 dnl **************************
1282 docs/doxygen_api.conf
1283 docs/doxygen_source.conf
1285 cmake/xapian-config.cmake
1286 cmake/xapian-config-version.cmake
1287 pkgconfig/xapian-core"$LIBRARY_VERSION_SUFFIX".pc:pkgconfig/xapian-core.pc.in
1289 AC_CONFIG_FILES([tests/runtest], [chmod +x tests/runtest])
1290 AC_CONFIG_FILES([tests/runsrv], [chmod +x tests/runsrv])
1291 AC_CONFIG_FILES([tests/submitperftest], [chmod +x tests/submitperftest])
1292 AC_CONFIG_FILES([tests/perftest/get_machine_info], [chmod +x tests/perftest/get_machine_info])
1293 AC_CONFIG_FILES([xapian-config], [chmod +x xapian-config])
1294 AC_CONFIG_FILES([makemanpage], [chmod +x makemanpage])
1297 dnl There are no files generated by AC_OUTPUT in the following directories
1298 dnl and we need to ensure they exist so that the rest of configure or make
1299 dnl won't fail because they don't exist when srcdir != builddir.
1300 if test yes = "$vpath_build" ; then
1301 for dir in include/xapian languages queryparser ; do
1302 AS_MKDIR_P(["$dir"])
1306 dnl Generate include/xapian/version.h:
1308 dnl MAIN_VERSION is VERSION without any _git123 suffix.
1309 MAIN_VERSION="$MAJOR_VERSION.$MINOR_VERSION.$REVISION"
1311 for backend in CHERT GLASS INMEMORY REMOTE ; do
1312 val=`eval echo "\\\$BUILD_BACKEND_${backend}_TRUE"`
1313 if test -z "$val" ; then
1314 cxxcpp_flags="$cxxcpp_flags -DXAPIAN_HAS_${backend}_BACKEND"
1318 if test yes = "$enable_64bit_docid" ; then
1319 cxxcpp_flags="$cxxcpp_flags -DXAPIAN_DOCID_BASE_TYPE="`echo "$INT64_T"|sed 's/ /____/g'`
1321 cxxcpp_flags="$cxxcpp_flags -DXAPIAN_DOCID_BASE_TYPE="`echo "$INT32_T"|sed 's/ /____/g'`
1324 if test yes = "$enable_64bit_termcount" ; then
1325 cxxcpp_flags="$cxxcpp_flags -DXAPIAN_TERMCOUNT_BASE_TYPE="`echo "$INT64_T"|sed 's/ /____/g'`
1327 cxxcpp_flags="$cxxcpp_flags -DXAPIAN_TERMCOUNT_BASE_TYPE="`echo "$INT32_T"|sed 's/ /____/g'`
1330 dnl For GCC (and compilers which pretend to be GCC) and MSVC, we create some
1331 dnl ABI checks in the generated version.h, and $CXXFLAGS may contain options
1332 dnl which affect the ABI (e.g. -fabi-version for GCC) so we want to use these
1333 dnl options when generating version.h. For these compilers, CXXCPP="$CXX -E"
1334 dnl so it should understand all compiler options.
1336 dnl For other compilers, we only pass $CPPFLAGS to $CXXCPP in case it's an
1337 dnl external cpp which doesn't understand flags which might be in $CXXFLAGS.
1338 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[#ifndef __GNUC__
1344 [cxxcpp_flags="$cxxcpp_flags $CPPFLAGS $CXXFLAGS"],
1345 [cxxcpp_flags="$cxxcpp_flags $CPPFLAGS"])
1346 rm -f include/xapian/version.h.tmp
1347 dnl "\r" in sed is a GNUism, but we only need to remove it on MS Windows
1348 dnl where we'll always have GNU sed, and other sed's will just interpret
1349 dnl it as "r" (Solaris sed) or maybe literal "\r" which won't match.
1351 dnl Use @@ around $MAIN_VERSION so we get " in the final output.
1352 $CXXCPP $cxxcpp_flags\
1353 -DSTRING_VERSION="\"@@$MAIN_VERSION@@\""\
1354 -DMAJOR_VERSION="\"$MAJOR_VERSION\""\
1355 -DMINOR_VERSION="\"$MINOR_VERSION\""\
1356 -DREVISION="\"$REVISION\""\
1358 $srcdir/include/xapian/version_h.cc|\
1359 ${SED-sed} '/"/!d;s/^ *//;/^#/d;s/ *$//;s/" *,//;s/"//g;s/@@/"/g;s/ */ /g;s/ *,\r$//;s/ *,$//;s/____/ /g'\
1360 > include/xapian/version.h.tmp
1361 dnl Only update the file if it has changed, so we don't alter the timestamp
1362 dnl and cause lots of rebuilding needlessly. However, the build system
1363 dnl needs a timestamp to know when to regenerate version.h because version_h.cc
1364 dnl has changed so we use a separate timestamp file.
1365 touch include/xapian/version.h.timestamp
1366 if cmp include/xapian/version.h.tmp include/xapian/version.h >/dev/null 2>&1
1368 rm include/xapian/version.h.tmp
1370 mv include/xapian/version.h.tmp include/xapian/version.h