Update for 1.3.4
[xapian.git] / xapian-core / configure.ac
blob9fdc6289dbca9cc33743ca52a1038c1060eaec08
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.4], [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 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
51 AC_SUBST([incdir])
53 dnl Check the build directory doesn't contain a space, so we die early with
54 dnl a helpful error.
55 case `pwd` in
56 *' '*)
57    AC_MSG_ERROR([You can't build in a directory whose path contains a space])
58    ;;
59 esac
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.
64 case $0 in
65 *' '*)
66    dnl Note: for in-tree builds, the build directory test above will fire
67    dnl before this can.
68    AC_MSG_ERROR([You can't build with sources in a directory whose path contains a space])
69    ;;
70 esac
72 dnl Check the prefix to install in doesn't contain a space, so we die early with
73 dnl a helpful error.
74 case $prefix in
75 *' '*)
76    AC_MSG_ERROR([You can't install in a directory whose path contains a space])
77    ;;
78 esac
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.
82 original_CXX=
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.
98 LT_PREREQ([2.2.8])
99 LT_INIT
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).
104 NO_UNDEFINED=
105 if test unsupported = "$allow_undefined_flag" ; then
106   NO_UNDEFINED=-no-undefined
108 AC_SUBST(NO_UNDEFINED)
110 AM_CXXFLAGS=
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!
116 case $build_os in
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
121         dnl it did.
122         AC_MSG_ERROR([
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
130     fi
131   ;;
132 esac
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
139 AM_MAINTAINER_MODE
141 dnl Checks for programs.
142 AC_PROG_CXX
144 AC_CANONICAL_HOST
146 # Checked: freebsd8.0 openbsd4.6 solaris2.9 solaris2.10
147 case $host_os in
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
151     ;;
152 esac
154 case $host_os in
155   linux*)
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
160     ;;
161 esac
163 case $host in
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 ;;
170   *)
171     NO_INSTALL=-no-install ;;
172 esac
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
180 dnl anyway!
181 if test -n "$CXX" ; then
182   AC_LANG_CPLUSPLUS
183   AC_MSG_CHECKING([whether $CXX is a working C++ compiler])
184   AC_CACHE_VAL([xo_cv_cxx_works],
185     [
186     AC_TRY_RUN([int main() {}],
187                xo_cv_cxx_works=yes,
188                xo_cv_cxx_works=no,
189                AC_TRY_LINK([], [], xo_cv_cxx_works=yes, xo_cv_cxx_works=no))
190     ])
191   AC_MSG_RESULT([$xo_cv_cxx_works])
192 else
193   xo_cv_cxx_works=no
195 if test no = "$xo_cv_cxx_works" ; then
196   case $original_CXX in
197   CCC=*)
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=
201     ;;
202   esac
203   if test -z "$original_CXX" ; then
204   AC_MSG_ERROR([
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++
211   else
212   AC_MSG_ERROR([
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.
217   fi
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.
226 AC_PROG_CC
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
231     CC_FOR_BUILD=cc
232   else
233     CC_FOR_BUILD="$CC"
234   fi
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.
239 AC_LANG_CPLUSPLUS
241 dnl Enable large file support if possible.
242 AC_SYS_LARGEFILE
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])
251 XAPIAN_LDFLAGS=
252 XAPIAN_LIBS=
253 AC_SUBST([XAPIAN_LDFLAGS])
254 AC_SUBST([XAPIAN_LIBS])
256 AC_DEFUN([XAPIAN_TEST_LINKER_FLAG],
257   [
258   AC_MSG_CHECKING([for $CXX -Wl,$1])
259   AC_CACHE_VAL([xo_cv_$2],
260     [
261     flag=$1
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'
270       xo_cv_$2=no
271       $4
272     else
273       xo_cv_$2=yes
274       $3
275     fi
276     ])
277   AC_MSG_RESULT([$xo_cv_$2])
278   ])
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],
283   [
284   XTC_save_CXXFLAGS=$CXXFLAGS
285   CXXFLAGS="$CXXFLAGS $1"
286   AC_TRY_COMPILE([], [],
287                  [$2="${$2} $1"
288                   CXXFLAGS=$XTC_save_CXXFLAGS
289                   $3],
290                  [CXXFLAGS=$XTC_save_CXXFLAGS
291                   $4])
292   ])
294 ldflags=
295 if test yesyes = "$GXX$enable_shared" ; then
296   case $host_os in
297     *mingw* | *cygwin*)
298       XAPIAN_TEST_LINKER_FLAG([--enable-runtime-pseudo-reloc], [enable_runtime_pseudo_reloc],
299         [ldflags="-Wl,$flag"],
300         [
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])
305         ])
306     ;;
307   esac
309 dnl Only works for ldflags which can be specified anywhere on the link line.
310 AC_SUBST([ldflags])
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).
318 AC_ARG_ENABLE([sse],
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
324     sse|sse2|yes|no) ;;
325     *) AC_MSG_ERROR([bad value ${enableval} for --enable-sse or --disable-sse]) ;;
326   esac],
327   [enable_sse=yes])
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
338 #endif
339 #include <cmath>
340 #include <cstdio>
341 #include <ctime>
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])], [
346     LIBS="-lm $LIBS"
347     AC_TRY_LINK([#include <cmath>
348 #include <cstdio>
349 #include <ctime>
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>])
355     ])
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])
370 AC_TRY_COMPILE([
371 #include <exception>
372 #include <typeinfo>],
373         [
374         int f();
375         try {
376             return f();
377         } catch (std::exception & e) {
378             return typeid(e).name()[0];
379         }],
380     AC_MSG_RESULT([yes])
381     AC_DEFINE([USE_RTTI], [1], [Define if the testsuite can use RTTI]),
382     AC_MSG_RESULT([no]))
383 CXXFLAGS=$save_CXXFLAGS
385 dnl Check for time functions.
386 AC_CHECK_FUNCS([clock_gettime sleep nanosleep gettimeofday ftime])
388 case $host_os in
389   *mingw*)
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])
394     ;;
395 esac
397 dnl We use timer_create() if available to implement a search time limit.
398 SAVE_LIBS=$LIBS
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.])])
402 LIBS=$SAVE_LIBS
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]),
414   AC_MSG_RESULT([no]))
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
434 dnl platforms.
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
454 AC_TYPE_SSIZE_T
456 AC_TYPE_PID_T
458 AC_TYPE_MODE_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])
469 case 4 in
470     "$ac_cv_sizeof_int")   INT32_T=int ;;
471     "$ac_cv_sizeof_long")  INT32_T=long ;;
472     "$ac_cv_sizeof_short") INT32_T=short ;;
473     *)
474       AC_MSG_RESULT([none found])
475       AC_MSG_ERROR([No 32 bit integer type found])
476 esac
477 AC_MSG_RESULT([$INT32_T])
479 AC_MSG_CHECKING([for 64 bit integer type])
480 case 8 in
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' ;;
484     *)
485       AC_MSG_RESULT([none found])
486       AC_MSG_ERROR([No 64 bit integer type found])
487 esac
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' ;;
496     *)
497       AC_MSG_RESULT([none found])
498       AC_MSG_ERROR([No unsigned type equivalent to off_t found])
499 esac
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
512     yes|no) ;;
513   *) AC_MSG_ERROR([bad value ${enableval} for --enable-64bit-docid]) ;;
514   esac],
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
520     yes|no) ;;
521   *) AC_MSG_ERROR([bad value ${enableval} for --enable-64bit-termcount]) ;;
522   esac],
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
528     yes|no) ;;
529     *) AC_MSG_ERROR([bad value ${enableval} for --enable-documentation]) ;;
530   esac],
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).
582     dnl
583     dnl No need to check for VALGRIND_COUNT_LEAKS now - that was added before
584     dnl 2.0.0.
585     AC_MSG_CHECKING([if valgrind supports --log-file with %p])
586     vglog=config.vglog.%p.tmp
587     vglogwild="config.vglog.*.tmp*"
588     rm -f $vglogwild
589     if $VALGRIND --log-file="$vglog" -q true 2>&AS_MESSAGE_LOG_FD ; then
590       for f in $vglogwild ; do
591         case $f in
592         $vglog*) VALGRIND= ;;
593         esac
594       done
595       if test x"$VALGRIND" = x ; then
596         AC_MSG_RESULT([no])
597       else
598         AC_MSG_RESULT([yes])
599         AC_CHECK_HEADERS([valgrind/memcheck.h], [], [VALGRIND=], [ ])
600       fi        
601     else
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])
605       VALGRIND=
606     fi
607     rm -f $vglogwild
608   fi
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
617 dnl eatmydata.
618 if test -n "${EATMYDATA-unset}" ; then
619   AC_PATH_PROG([EATMYDATA], [eatmydata], [])
622 dnl Checks for library functions.
623 AC_FUNC_MEMCMP
624 AC_FUNC_STRERROR_R
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
645   AC_RUN_IFELSE([
646     AC_LANG_PROGRAM(
647       [[
648 #include <cstdio>
649 #include <cstring>
650 using namespace std;
651       ]],
652       dnl Return different exit status for each error so we can see which
653       dnl check failed by consulting config.log.
654       [[
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;
663       ]]
664     )],
665     [ac_cv_func_snprintf=$func;break],
666     [
667     if test 15no = "$?$ac_cv_func_snprintf_noniso" ; then
668       ac_cv_func_snprintf_noniso=$func
669     fi
670     ac_cv_func_snprintf=no
671     ],
672     [ac_cv_func_snprintf=unknown;break]
673   )
674 done
675 AC_MSG_RESULT([$ac_cv_func_snprintf])
676 case $ac_cv_func_snprintf in
677   no)
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)])
683     fi
684     ;;
685   unknown)
686     dnl be conservative when crosscompiling
687     ;;
688   *)
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)])
693     ;;
694 esac
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]])],
705     [case $enableval in
706       yes|no) ;;
707       *) AC_MSG_ERROR([Invalid option: '--enable-backend-$1=$enableval']) ;;
708     esac], [enable_backend_$1=yes])
709   ])
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])
717 use_win32_uuid_api=0
718 case $enable_backend_chert$enable_backend_glass in
719 *yes*)
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.
724   dnl
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)])
730     ], [ ])
732   dnl Check for zlibVersion in -lz.
733   SAVE_LIBS=$LIBS
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)])
737     ])
738   if test x != x"$LIBS" ; then
739     XAPIAN_LIBS="$XAPIAN_LIBS $LIBS"
740   fi
741   LIBS=$SAVE_LIBS
743   dnl Find the UUID library (from e2fsprogs/util-linux-ng, not the OSSP one).
745   case $host_os in
746     *mingw* | *cygwin*) dnl Use built-in API.
747       use_win32_uuid_api=1
748       ;;
749     *)
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
754         dnl -luuid.
755         SAVE_LIBS=$LIBS
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)])
758           ])
759         if test x != x"$LIBS" ; then
760           XAPIAN_LIBS="$XAPIAN_LIBS $LIBS"
761         fi
762       ], [
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)])
768           ])
769         ], [
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)])
771         ], [ ])
772       ], [ ])
773       ;;
774   esac
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])],
779     [
780     AC_DEFINE([HAVE_UUID_UNPARSE_LOWER], [1],
781               [Define to 1 if you have the 'uuid_unparse_lower' function.])
782     ])
783   LIBS=$SAVE_LIBS
784   ;;
785 esac
786 AM_CONDITIONAL([USE_WIN32_UUID_API], [test "$use_win32_uuid_api" = 1])
788 REMOTE_LIBS=
789 if test "$enable_backend_remote" = yes ; then
790   AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
791 #ifdef __WIN32__
792 #error WIN32
793 #endif
794   ]])], [win32=no], [win32=yes])
796   case $host_os-$win32 in
797     *-yes )
798       dnl For mingw and msvc we have an alternative implementation which
799       dnl doesn't need fork() or socketpair().
800       dnl
801       dnl We need -lws2_32 for getaddrinfo(), etc.
802       REMOTE_LIBS=-lws2_32
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.])
808       ;;
809     *djgpp* | *msdos* )
810       dnl DJGPP has a dummy implementation of fork which always fails.
811       dnl
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
817       dnl sense.
818       enable_backend_remote=no
819       ;;
820     *)
821       dnl On Unix, we need fork and socketpair for the remotebackend.
822       SAVE_LIBS=$LIBS
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.)])
825       ])
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.)])
830       ])
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).
835       dnl
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.)])
842       ])
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.)])
845       ])
846       REMOTE_LIBS=$LIBS
847       LIBS=$SAVE_LIBS
848       ;;
849   esac
851   if test "$enable_backend_remote" = yes ; then
852     TYPE_SOCKLEN_T
853     XAPIAN_LIBS="$XAPIAN_LIBS $REMOTE_LIBS"
854   fi
857 AC_ARG_ENABLE([visibility],
858   [AS_HELP_STRING([--disable-visibility], [disable use of GCC visibility])],
859   [case ${enableval} in
860     yes|no) ;;
861     *) AC_MSG_ERROR([bad value ${enableval} for --disable-visibility]) ;;
862   esac])
864 vpath_build=no
865 if test "`pwd`" != "`cd $srcdir;pwd`" ; then
866   vpath_build=yes
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.
882 use_zlib_vg=no
883 if test -n "$VALGRIND" ; then
884   case $host_os in
885     linux*) use_zlib_vg=yes ;;
886   esac
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)], [
894   SAVE_LIBS=$LIBS
895   AC_SEARCH_LIBS([fdatasync], [rt], [XAPIAN_LIBS="$LIBS $XAPIAN_LIBS"])
896   LIBS=$SAVE_LIBS
897   AC_CHECK_FUNCS([fdatasync])
898   ],
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.
910 case $host_os in
911   hpux*)
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])
916     ;;
917   *)
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],
923           [
924             for p in ' ' \
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
927               AC_TRY_COMPILE([
928 #include <sys/types.h>
929 #include <unistd.h>
931               ],[
932                 char b[256];
933                 pread(1, b, 256, 20);
934               ],[
935                 xo_cv_pread_prototype="$p"
936                 break
937               ])
938             done
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])
942             fi
943           ])
944           if test " " = "$xo_cv_pread_prototype" ; then
945             AC_MSG_RESULT([none required])
946           else
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)])
950           fi
951         ])
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],
957           [
958             for p in ' ' \
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
961               AC_TRY_COMPILE([
962 #include <sys/types.h>
963 #include <unistd.h>
965               ],[
966                 const char *p = "hello";
967                 pwrite(1, p, 5, 20);
968               ],[
969                 xo_cv_pwrite_prototype="$p"
970                 break
971               ])
972             done
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])
976             fi
977           ])
978           if test " " = "$xo_cv_pwrite_prototype" ; then
979             AC_MSG_RESULT([none required])
980           else
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)])
984           fi
985         ])
986     ;;
987 esac
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]])],
999   [case $enableval in
1000     yes|partial|no) ;;
1001     *)
1002       AC_MSG_ERROR([Invalid option: '--enable-assertions=$enableval']) ;;
1003   esac])
1005 AC_ARG_ENABLE([log],
1006   [AS_HELP_STRING([--enable-log], [generate a log of methods called, etc (no|yes|profile) [default=no]])],
1007   [case $enableval in
1008     yes|no) ;;
1009     profile)
1010       AC_MSG_ERROR(['--enable-log=profile' is no longer supported - see http://trac.xapian.org/wiki/ProfilingXapian for alternatives.]) ;;
1011     *)
1012       AC_MSG_ERROR([Invalid option: '--enable-log=$enableval']) ;;
1013   esac])
1015 dnl Set defines according to the --enable-assertions and --enable-log options
1016 dnl given.
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).
1038 dash_d_visibility=
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
1048       dnl robust.
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])
1056         ;;
1057       esac
1059       dnl -Wundef was supported by g++ 3.0 and -fshow-column by g++ 3.1.
1060       dnl
1061       dnl -Wlogical-op and -Wmissing-declarations (for C++) were added in
1062       dnl GCC 4.3.
1063       dnl
1064       dnl -Wdouble-promotion was added in GCC 4.6.
1065       dnl
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.
1070       dnl
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"
1074       dnl FIXME:
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 ...)
1080       dnl
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"
1087       fi
1088       ;;
1089     *__clang__*)
1090       dnl Intel's compiler (since __clang__ not substituted):
1091       dnl
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"
1099       fi
1100       ;;
1101     *__INTEL_COMPILER*)
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"
1109       fi
1110       ;;
1111   esac
1113   if test no != "$enable_visibility"; then
1114     dnl GCC doesn't support symbol visibility on all platforms (e.g. it isn't
1115     dnl on mingw).
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
1121     else
1122       AC_MSG_RESULT([no])
1123     fi
1124   fi
1125 else
1126   dnl Not GCC, nor a compiler masquerading as GCC.
1127   case /$CXX in
1128   */aCC)
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" ;;
1148   */sunCC|*/CC)
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
1154     dnl machinery.
1155     XAPIAN_TEST_CXXFLAGS([-erroff=voidretw], [AM_CXXFLAGS])
1156     ;;
1157   esac
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])
1165 case $host_cpu in
1166   i*86)
1167     if test "$enable_sse" = no ; then
1168       AC_MSG_RESULT([no])
1169       FP_EXCESS_PRECISION=yes
1170     else
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"
1178       else
1179         AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
1180 [[#ifndef __SUNPRO_CC
1181 #error Not Sun compiler
1182 #endif]])],
1183           [AC_MSG_RESULT([yes (configure with --disable-sse to disable)])
1184           AM_CXXFLAGS="$AM_CXXFLAGS -xarch=$enable_sse"]
1185           ,
1186           [AC_MSG_RESULT([don't know how to for compiler $CXX])]
1187         )
1188       fi
1189     fi
1190     ;;
1191   *)
1192     AC_MSG_RESULT([non-x86 arch ($host_cpu)]) ;;
1193 esac
1194 AC_SUBST([FP_EXCESS_PRECISION])
1196 AH_BOTTOM(
1197 [/* Disable stupid MSVC "performance" warning for converting int to bool. */
1198 #ifdef _MSC_VER
1199 # pragma warning(disable:4800)
1200 #endif
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".
1209  */
1210 #if defined __GNUC__ && !defined _FORTIFY_SOURCE
1211 # define _FORTIFY_SOURCE 2
1212 #endif
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.
1217  */
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.
1222  */
1223 # define rare(COND) __builtin_expect(!!(COND), 0)
1224 # define usual(COND) __builtin_expect(!!(COND), 1)
1225 #else
1226 # define rare(COND) (COND)
1227 # define usual(COND) (COND)
1228 #endif
1230 /* Signal we're building the library so it's OK to include headers such as
1231  * xapian/query.h directly.
1232  */
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>.
1240  */
1241 #ifdef __SUNPRO_CC
1242 # define __MATHERR_RENAME_EXCEPTION
1243 #endif
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.
1259 module=no
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
1265 dnl this warning.
1266 PERCENT='%'
1267 AC_SUBST([PERCENT])
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 **************************
1278 AC_CONFIG_FILES([
1279  Makefile
1280  tests/Makefile
1281  docs/Makefile
1282  docs/doxygen_api.conf
1283  docs/doxygen_source.conf
1284  xapian-core.spec
1285  cmake/xapian-config.cmake
1286  cmake/xapian-config-version.cmake
1287  pkgconfig/xapian-core"$LIBRARY_VERSION_SUFFIX".pc:pkgconfig/xapian-core.pc.in
1288  ])
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])
1295 AC_OUTPUT
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"])
1303   done
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"
1310 cxxcpp_flags=-I.
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"
1315   fi
1316 done
1318 if test yes = "$enable_64bit_docid" ; then
1319   cxxcpp_flags="$cxxcpp_flags -DXAPIAN_DOCID_BASE_TYPE="`echo "$INT64_T"|sed 's/ /____/g'`
1320 else
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'`
1326 else
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__
1339 #ifndef _MSC_VER
1340        choke me
1341 #endif
1342 #endif
1343 ]])],
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\""\
1357         $dash_d_visibility\
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
1367 then
1368   rm include/xapian/version.h.tmp
1369 else
1370   mv include/xapian/version.h.tmp include/xapian/version.h