Factor out directory separator knowledge
[xapian.git] / xapian-core / configure.ac
blobf14f9ac2de52ade1d012a12f9e3d274b576ab574
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.5.0], [https://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 libxapian1.5
32 dnl 0:0:0 1.5.0 Reset as library renamed
33 LIBRARY_VERSION_INFO=0:0:0
34 AC_SUBST([LIBRARY_VERSION_INFO])
36 LIBRARY_VERSION_SUFFIX=
37 dnl Where xapian.h, etc go.
38 incdir=$includedir
39 case $PACKAGE_VERSION in
40   [*.*[13579].*])
41     dnl Development release series:
42     [dev_series=`echo "$PACKAGE_VERSION"|sed 's/\.[^.]*$//'`]
44     dnl Append version installed programs by default.  To specify no suffix,
45     dnl configure with: --program-suffix=
46     test x"$program_suffix" != xNONE || program_suffix=-$dev_series
48     incdir=$incdir/xapian-$dev_series
50     LIBRARY_VERSION_SUFFIX=-$dev_series
51     ;;
52 esac
54 AC_SUBST([LIBRARY_VERSION_SUFFIX])
55 AC_SUBST([incdir])
57 dnl Check the build directory doesn't contain a space, so we die early with
58 dnl a helpful error.
59 case `pwd` in
60 *' '*)
61    AC_MSG_ERROR([You can't build in a directory whose path contains a space])
62    ;;
63 esac
65 dnl Check the source directory doesn't contain a space, so we die early with
66 dnl a helpful error.  FIXME: Unfortunately, configure seems to choke before
67 dnl it gets to us so this code doesn't get a chance to fire.
68 case $0 in
69 *' '*)
70    dnl Note: for in-tree builds, the build directory test above will fire
71    dnl before this can.
72    AC_MSG_ERROR([You can't build with sources in a directory whose path contains a space])
73    ;;
74 esac
76 dnl Check the prefix to install in doesn't contain a space, so we die early with
77 dnl a helpful error.
78 case $prefix in
79 *' '*)
80    AC_MSG_ERROR([You can't install in a directory whose path contains a space])
81    ;;
82 esac
84 dnl Note if the user specified a particular C++ compiler so we can give a more
85 dnl appropriate error message if we can't link a simple C++ program.
86 original_CXX=
87 if test -n "$CXX" ; then
88   original_CXX="CXX=$CXX"
89 elif test -n "$CCC" ; then
90   original_CXX="CCC=$CCC"
93 dnl See HACKING document for details of the reasons for required versions.
94 AM_INIT_AUTOMAKE([1.13 -Wportability tar-ustar no-dist-gzip dist-xz std-options])
95 AC_CONFIG_SRCDIR([matcher/multiandpostlist.cc])
97 AC_CONFIG_HEADERS([config.h])
99 AC_CONFIG_MACRO_DIRS([m4])
101 AM_PROG_AR
103 dnl Use libtool to manage our libraries.
104 LT_PREREQ([2.2.8])
105 dnl Default to only building shared libraries.
107 dnl Building both shared and static means having to compile the files which
108 dnl make up the library twice on most platforms.  Shared libraries are the
109 dnl better option for most users, and if anyone really wants static libraries,
110 dnl they can configure with --enable-static (or --enable-static=xapian-core if
111 dnl configuring a combined tree with the bindings).
113 dnl We don't export any data items from the library, so it should be safe to
114 dnl enable win32-dll without decorating any declarations specially.
115 LT_INIT([disable-static win32-dll])
117 dnl -no-undefined causes problems on Solaris with Sun CC in C++11 mode, so only
118 dnl pass -no-undefined on platforms where it is required in order to link a
119 dnl shared library at all (Windows is the main one).
120 NO_UNDEFINED=
121 if test unsupported = "$allow_undefined_flag" ; then
122   NO_UNDEFINED=-no-undefined
124 AC_SUBST(NO_UNDEFINED)
126 AM_CXXFLAGS=
128 dnl A standard "gotcha" for mingw and cygwin users is to not set up their
129 dnl PATH correctly, so that MSDOS FIND.EXE is found before Unix find.  Help
130 dnl them out by checking for this condition, rather than letting libtool
131 dnl fail in obscure ways.  NB check the *BUILD* OS, not the host one!
132 case $build_os in
133   *mingw* | *cygwin* | pw32*)
134     find /dirunlikelytoexist >/dev/null 2>&1
135     if test $? = 2 ; then
136         dnl Unix find will return 1 if the directory didn't exist, or 0 if
137         dnl it did.
138         AC_MSG_ERROR([
139 *** You appear to have an MSDOS-like FIND.EXE in your PATH ahead of any
140 *** UNIX-like find.  This misconfiguration will confuse libtool - you'll need
141 *** to make sure you have a UNIX-like find installed and fix your PATH, then
142 *** rerun configure.  For more information, see:
144 ***   https://www.cygwin.com/faq/faq.html#faq.using.find
146     fi
147   ;;
148 esac
150 dnl Add parameters for aclocal
151 dnl (This must come after AM_INIT_AUTOMAKE, since it modifies ACLOCAL)
152 ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
154 dnl disable "maintainer only" rules by default
155 AM_MAINTAINER_MODE
157 dnl Checks for programs.
158 AC_PROG_CXX
160 AC_CANONICAL_HOST
162 # Checked: freebsd8.0 openbsd4.6 solaris2.9 solaris2.10
163 case $host_os in
164   linux* | k*bsd*-gnu | freebsd* | openbsd* | solaris*)
165     dnl Vanilla libtool sets this to "unknown" which it then handles as "yes".
166     link_all_deplibs_CXX=no
167     ;;
168 esac
170 case $host_os in
171   linux*)
172     dnl Extract search path from ldconfig which is more reliable than the way
173     dnl vanilla libtool extracts them from ld.so.conf.
174     d=`/sbin/ldconfig -N -X -v 2>&AS_MESSAGE_LOG_FD|$SED 's,^\(/.*\):\( (.*)\)\?$,\1,p;d'|tr '\n' ' '`
175     test -z "$d" || sys_lib_dlsearch_path_spec=$d
176     ;;
177 esac
179 case $host in
180   *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
181     dnl On these platforms, libtool emits a warning if -no-install is passed,
182     dnl and uses -no-fast-install instead - the least ugly way to avoid that
183     dnl warnings seems to be to duplicate the above list of platforms from
184     dnl libtool and use -no-fast-install on them directly.
185     NO_INSTALL=-no-fast-install ;;
186   *)
187     NO_INSTALL=-no-install ;;
188 esac
189 AC_SUBST([NO_INSTALL])
191 dnl For reasons which are beyond me, if autoconf can't find a C++ compiler
192 dnl it will set CXX to g++ (which obviously won't work) rather than actually
193 dnl telling the user that it couldn't find a C++ compiler and telling them
194 dnl to either install one or set CXX if there's one configure failed to find.
195 dnl It's probably worthwhile checking that the C++ compiler actually works
196 dnl anyway!
197 if test -n "$CXX" ; then
198   AC_LANG_CPLUSPLUS
199   AC_MSG_CHECKING([whether $CXX is a working C++ compiler])
200   AC_CACHE_VAL([xo_cv_cxx_works],
201     [
202     AC_TRY_RUN([int main() {}],
203                xo_cv_cxx_works=yes,
204                xo_cv_cxx_works=no,
205                AC_TRY_LINK([], [], xo_cv_cxx_works=yes, xo_cv_cxx_works=no))
206     ])
207   AC_MSG_RESULT([$xo_cv_cxx_works])
208 else
209   xo_cv_cxx_works=no
211 if test no = "$xo_cv_cxx_works" ; then
212   case $original_CXX in
213   CCC=*)
214     dnl CCC is handled in a slightly odd way - if its value isn't an
215     dnl executable (taking PATH into account) then it is ignored!
216     test "$original_CXX" = "CCC=$CXX" || original_CXX=
217     ;;
218   esac
219   if test -z "$original_CXX" ; then
220   AC_MSG_ERROR([
221 *** You need a working C++ compiler to compile Xapian, but configure failed to
222 *** find one.  If you have a working C++ compiler, you can tell configure where
223 *** to find it by invoking it like so:
225 ***   ./configure CXX=/opt/bin/c++
227   else
228   AC_MSG_ERROR([
229 *** You need a working C++ compiler to compile Xapian, but the compiler you
230 *** specified (with '$original_CXX') doesn't appear to be able to successfully
231 *** compile and link a simple program.
233   fi
236 dnl Probe for any options needed to enable C++11 support.
237 AX_CXX_COMPILE_STDCXX_11
239 dnl We don't use a C compiler to compile Xapian's code, but on some platforms
240 dnl (e.g. mingw) libtool uses $LTCC which defaults to $CC, and it's also use to
241 dnl build auxiliary tools like snowball and lemon.
242 AC_PROG_CC
244 dnl Check endianness.
245 AC_C_BIGENDIAN
247 dnl We want a non-cross-compiling C compiler for building lemon with.
248 if test -z "$CC_FOR_BUILD" ; then
249   if test yes = "$cross_compiling"; then
250     CC_FOR_BUILD=cc
251   else
252     CC_FOR_BUILD="$CC"
253   fi
255 AC_ARG_VAR([CC_FOR_BUILD], [C compiler command for native compilation (needed to compile build tools during cross-builds)])
257 dnl Run tests using the C++ compiler.
258 AC_LANG_CPLUSPLUS
260 dnl Enable large file support if possible.
261 AC_SYS_LARGEFILE
262 dnl With xlC on AIX, -D_LARGE_FILES changes the ABI of std::string, so it
263 dnl also needs to be used when compiling user code.
264 abi_affecting_cxxflags=
265 if $GREP '^#define _LARGE_FILES 1$' confdefs.h > /dev/null 2>&1 ; then
266   abi_affecting_cxxflags=-D_LARGE_FILES
268 AC_SUBST([abi_affecting_cxxflags])
270 AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
271 #if defined __WIN32__ || defined _WIN32
272 #error WIN32
273 #endif
274 ]])], [win32=no], [win32=yes])
276 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[
277 #ifdef _MSC_VER
278 #error MSVC
279 #endif
280 ]])], [msvc=no], [msvc=yes])
282 XAPIAN_LDFLAGS=
283 XAPIAN_LIBS=
284 AC_SUBST([XAPIAN_LDFLAGS])
285 AC_SUBST([XAPIAN_LIBS])
287 AC_DEFUN([XAPIAN_TEST_LINKER_FLAG],
288   [
289   AC_MSG_CHECKING([for $CXX -Wl,$1])
290   AC_CACHE_VAL([xo_cv_ldflag_$2],
291     [
292     save_LDFLAGS=$LDFLAGS
293     LDFLAGS="$LDFLAGS -Wl,$1"
294     flag=$1
295     AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
296       [xo_cv_ldflag_$2=yes
297       $3],
298       [xo_cv_ldflag_$2=no
299       $4])
300     LDFLAGS=$save_LDFLAGS
301     ])
302   AC_MSG_RESULT([$xo_cv_ldflag_$2])
303   ])
305 dnl Test if the compiler works with $1 added to CXXFLAGS; if it does, add $1 to
306 dnl variable $2.  If the test passes, also do $3; if it fails, also do $4.
307 AC_DEFUN([XAPIAN_TEST_CXXFLAGS],
308   [
309   XTC_save_CXXFLAGS=$CXXFLAGS
310   CXXFLAGS="$CXXFLAGS $1"
311   AC_TRY_COMPILE([], [],
312                  [CXXFLAGS=$XTC_save_CXXFLAGS
313                   $2="${$2} $1"
314                   $3],
315                  [CXXFLAGS=$XTC_save_CXXFLAGS
316                   $4])
317   ])
319 ldflags=
320 if test yesyes = "$GXX$enable_shared" ; then
321   case $host_os in
322     *mingw* | *cygwin*)
323       XAPIAN_TEST_LINKER_FLAG([--enable-runtime-pseudo-reloc], [enable_runtime_pseudo_reloc],
324         [ldflags="-Wl,$flag"],
325         [
326         dnl Can't use AC_DISABLE_SHARED after AC_PROG_LIBTOOL, but
327         dnl this test needs to be after AC_PROG_LIBTOOL, so we can't
328         dnl just disable the shared build automatically...
329         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])
330         ])
331     ;;
332   esac
334 dnl Only works for ldflags which can be specified anywhere on the link line.
335 AC_SUBST([ldflags])
337 dnl Preserve the default CXXFLAGS.
338 save_CXXFLAGS=$CXXFLAGS
340 dnl x86 has excess precision issues with 387 FP instructions, which are
341 dnl avoided by using SSE instructions instead.  This is also faster (~6% in
342 dnl a CPU bound testcase).
343 AC_ARG_ENABLE([sse],
344 [AS_HELP_STRING([--disable-sse],
345                 [disable use of SSE FP instructions on x86])]
346 [AS_HELP_STRING([[--enable-sse[=sse|sse2]]],
347                 [set which SSE FP instructions to use on x86 (default: sse2)])],
348   [case ${enableval} in
349     sse|sse2|yes|no) ;;
350     *) AC_MSG_ERROR([bad value ${enableval} for --enable-sse or --disable-sse]) ;;
351   esac],
352   [enable_sse=yes])
354 dnl Some versions of Sun's C++ compiler reportedly need an explicit -lm.
355 dnl The maths functions we use include: exp log ceil fabs sqrt
356 AC_MSG_CHECKING([if -lm is required for maths functions])
357 dnl Don't use constant arguments as the compiler might simply evaluate the
358 dnl whole expression at compile time, and it might inline certain functions
359 dnl so test several functions.  Also write results using printf() so that
360 dnl the compiler can't optimise away the computations.
361 AC_TRY_LINK([#ifdef __SUNPRO_CC
362 #error Need -lm for Sun C++ 5.9 under libtool 2.2.10
363 #endif
364 #include <cmath>
365 #include <cstdio>
366 #include <ctime>
367 using namespace std;], [
368   double a = log(ceil(time(NULL)/7.0));
369   printf("%f %f %f\n", a, sqrt(a), exp(fabs(a - 12345.6)));
370   ], [AC_MSG_RESULT([no])], [
371     LIBS="-lm $LIBS"
372     AC_TRY_LINK([#include <cmath>
373 #include <cstdio>
374 #include <ctime>
375 using namespace std;], [
376   double a = log(ceil(time(NULL)/7.0));
377   printf("%f %f %f\n", a, sqrt(a), exp(fabs(a - 12345.6)));],
378         [AC_MSG_RESULT([yes])],
379         [AC_MSG_ERROR([Failed to link a C++ program using <cmath>])
380     ])
383 dnl C++11 should have log2(double), but keep this check for now to allow for
384 dnl compilers with incomplete library support for C++11.
385 AC_CHECK_DECLS([log2(double)], [], [],
386 [#include <cmath>
387 using namespace std;])
389 dnl exp10() is a GNU libc extension.
390 AC_CHECK_DECLS([exp10(double)], [], [],
391 [#include <cmath>
392 using namespace std;])
394 dnl Darwin provides __exp10().
395 AC_CHECK_DECLS([__exp10(double)], [], [],
396 [#include <cmath>
397 using namespace std;])
399 dnl GCC provides __builtin_exp10() (but notably clang doesn't currently).
400 dnl On mingw, __builtin_exp10() causes GCC to generate a call to exp10() which
401 dnl then fails to link, so perform a link check here to catch that.
402 AC_CACHE_CHECK([for __builtin_exp10], ac_cv_link___builtin_exp10, [
403   AC_LINK_IFELSE([AC_LANG_PROGRAM([[
404 #include <cstdio>
405 #include <ctime>
406 using namespace std;]],
407     [[printf("%f", __builtin_exp10(double(time(NULL)*1e-8)));]])],
408     [ac_cv_link___builtin_exp10=yes],
409     [ac_cv_link___builtin_exp10=no])
411 if test $ac_cv_link___builtin_exp10 = yes ; then
412   AC_DEFINE([HAVE___BUILTIN_EXP10], [1], [Define to 1 if you have the `__builtin_exp10' function.])
415 dnl See if <typeinfo> can be used in the testsuite - at least for GCC and xlC,
416 dnl compilation of the test code below fails if RTTI isn't being generated
417 dnl (g++ -fno-rtti, or by default with xlC).
418 AC_MSG_CHECKING([if RTTI is supported])
419 save_CXXFLAGS=$CXXFLAGS
420 dnl xlC issues a warning for typeid() being used without RTTI being enabled,
421 dnl so for this test we pass the xlC option to make that warning into an error.
422 XAPIAN_TEST_CXXFLAGS([-qhaltonmsg=1540-2412], [CXXFLAGS])
423 AC_TRY_COMPILE([
424 #include <exception>
425 #include <typeinfo>],
426         [
427         int f();
428         try {
429             return f();
430         } catch (std::exception & e) {
431             return typeid(e).name()[0];
432         }],
433     AC_MSG_RESULT([yes])
434     AC_DEFINE([USE_RTTI], [1], [Define if the testsuite can use RTTI]),
435     AC_MSG_RESULT([no]))
436 CXXFLAGS=$save_CXXFLAGS
438 AC_CHECK_DECLS([__builtin_bswap16, __builtin_bswap32], [], [], [ ])
439 AC_CHECK_DECLS([__builtin_clz, __builtin_clzl, __builtin_clzll], [], [], [ ])
440 AC_CHECK_DECLS([__builtin_ctz, __builtin_ctzl, __builtin_ctzll], [], [], [ ])
441 AC_CHECK_DECLS([__builtin_expect], [], [], [ ])
442 AC_CHECK_DECLS([__builtin_popcount, __builtin_popcountl, __builtin_popcountll], [], [], [ ])
443 AC_CHECK_DECLS([__popcnt, __popcnt64], [], [], [#include <intrin.h>])
445 dnl Check for time functions.
446 AC_CHECK_FUNCS([clock_gettime sleep nanosleep gettimeofday ftime])
448 case $host_os in
449   *mingw*)
450     dnl For _ftime64() on mingw we need to tell it we're happy to require
451     dnl MSVCRT 6.10 or higher, which isn't too onerous a requirement it seems.
452     AC_DEFINE([__MSVCRT_VERSION__], [0x0601], [Define on mingw to the minimum msvcrt version to assume])
453     AC_DEFINE([MINGW_HAS_SECURE_API], [1], [Define on mingw to get _s suffixed "secure" functions declared in headers])
454     ;;
455 esac
457 dnl We use timer_create() if available to implement a search time limit.
458 SAVE_LIBS=$LIBS
459 AC_SEARCH_LIBS([timer_create], [rt],
460                [
461     AC_MSG_CHECKING([for timer_create() usability])
462     AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
463 [[#if defined _AIX || defined __GNU__
464 #error timer_create known not to work
465 #endif]])],
466         [AC_MSG_RESULT([yes])
467         XAPIAN_LIBS="$LIBS $XAPIAN_LIBS"
468         AC_DEFINE([HAVE_TIMER_CREATE], [1], [Define to 1 if you have the 'timer_create' function.])]
469         ,
470         [AC_MSG_RESULT([no])
471     ])
473 LIBS=$SAVE_LIBS
475 dnl Used by tests/soaktest/soaktest.cc
476 AC_CHECK_FUNCS([srandom random])
478 dnl Used by tests/harness/testsuite.cc
479 AC_CHECK_FUNCS([sigaction])
480 AC_MSG_CHECKING([for sigsetjmp and siglongjmp])
481 AC_TRY_COMPILE([#include <setjmp.h>],
482   [sigjmp_buf jb; if (sigsetjmp(jb, 1)) { siglongjmp(jb, 1);  }],
483   AC_DEFINE([HAVE_SIGSETJMP], [1], [Define to 1 if you have the 'sigsetjmp' function])
484   AC_MSG_RESULT([yes]),
485   AC_MSG_RESULT([no]))
487 dnl Used by tests/harness/cputimer.cc:
488 AC_CHECK_FUNCS([getrusage times sysconf])
490 dnl Used by tests/api_replicate.cc.
492 dnl Solaris < 10 only has putenv().
494 dnl Microsoft have marked putenv() as deprecated, so we use _putenv_s() under
495 dnl MSVC to avoid deprecation warnings.  We probe here since mingw doesn't
496 dnl currently (v3.20) provide _putenv_s(), so we can't just use it conditional
497 dnl on __WIN32__ being defined.  We need to check for a declaration rather
498 dnl than just seeing if the symbol exists, as the symbol will exist in the C
499 dnl runtime DLL even if mingw doesn't declare it in its headers.
500 AC_CHECK_FUNCS([setenv])
501 AC_CHECK_DECLS([_putenv_s(const char *,const char *)], [], [],
502 [#include <stdlib.h>])
504 dnl See if we have closefrom(), or some functions that are useful to implement
505 dnl closefrom() on platforms which don't provide it.
506 AC_CHECK_FUNCS([closefrom getdirentries getrlimit])
508 dnl See if ftime returns void (as it does on mingw)
509 AC_MSG_CHECKING([return type of ftime])
510 if test $ac_cv_func_ftime = yes ; then
511   AC_TRY_COMPILE([#include <sys/timeb.h>],
512     [struct timeb tp; int i = ftime(&tp);],
513     AC_MSG_RESULT([int]),
514     AC_MSG_RESULT([void])
515     AC_DEFINE([FTIME_RETURNS_VOID], [1], [Define if ftime returns void]))
518 dnl Check how to find the hostname: uname() in sys/utsname.h, or gethostname()
519 dnl Don't use default includes as inttypes.h is found by Compaq C but not C++
520 dnl so it causes all header probes to fail.
521 AC_CHECK_HEADERS([sys/utsname.h], [], [], [ ])
522 AC_CHECK_FUNCS([gethostname])
524 dnl mingw (for instance) lacks ssize_t
525 AC_TYPE_SSIZE_T
527 AC_TYPE_PID_T
529 AC_TYPE_MODE_T
531 AC_CHECK_SIZEOF([short])
532 AC_CHECK_SIZEOF([int])
533 AC_CHECK_SIZEOF([long])
534 AC_CHECK_SIZEOF([long long])
536 AC_CHECK_HEADERS([sys/types.h])
537 AC_CHECK_SIZEOF([off_t])
539 AC_MSG_CHECKING([for 32 bit integer type])
540 case 4 in
541     "$ac_cv_sizeof_int")   INT32_T=int ;;
542     "$ac_cv_sizeof_long")  INT32_T=long ;;
543     "$ac_cv_sizeof_short") INT32_T=short ;;
544     *)
545       AC_MSG_RESULT([none found])
546       AC_MSG_ERROR([No 32 bit integer type found])
547 esac
548 AC_MSG_RESULT([$INT32_T])
550 AC_MSG_CHECKING([for 64 bit integer type])
551 case 8 in
552     "$ac_cv_sizeof_int")       INT64_T=int ;;
553     "$ac_cv_sizeof_long")      INT64_T=long ;;
554     "$ac_cv_sizeof_long_long") INT64_T='long long' ;;
555     *)
556       AC_MSG_RESULT([none found])
557       AC_MSG_ERROR([No 64 bit integer type found])
558 esac
559 AC_MSG_RESULT([$INT64_T])
561 dnl Used to avoid undefined behaviour left shifting file sizes.
562 AC_MSG_CHECKING([for unsigned equivalent of off_t])
563 case $ac_cv_sizeof_off_t in
564     "$ac_cv_sizeof_int")       UNSIGNED_OFF_T=unsigned ;;
565     "$ac_cv_sizeof_long")      UNSIGNED_OFF_T='unsigned long' ;;
566     "$ac_cv_sizeof_long_long") UNSIGNED_OFF_T='unsigned long long' ;;
567     *)
568       AC_MSG_RESULT([none found])
569       AC_MSG_ERROR([No unsigned type equivalent to off_t found])
570 esac
571 AC_DEFINE_UNQUOTED([UNSIGNED_OFF_T], [$UNSIGNED_OFF_T], [Define to an unsigned type equivalent to off_t])
572 AC_MSG_RESULT([$UNSIGNED_OFF_T])
574 dnl Check for perl (needed to generate some sources and documentation).
575 AC_PATH_PROG([PERL], [perl], [])
576 if test x$USE_MAINTAINER_MODE = xyes; then
577   test -z "$PERL" && AC_MSG_ERROR([perl is required in maintainer mode])
580 AC_ARG_ENABLE([64bit_docid],
581   [AS_HELP_STRING([--enable-64bit-docid], [enable 64bit docid [default=no]])],
582   [case ${enableval} in
583     yes|no) ;;
584   *) AC_MSG_ERROR([bad value ${enableval} for --enable-64bit-docid]) ;;
585   esac],
586   [enable_64bit_docid=no])
588 AC_ARG_ENABLE([64bit_termcount],
589   [AS_HELP_STRING([--enable-64bit-termcount], [enable 64bit termcount [default=no]])],
590   [case ${enableval} in
591     yes|no) ;;
592   *) AC_MSG_ERROR([bad value ${enableval} for --enable-64bit-termcount]) ;;
593   esac],
594   [enable_64bit_termcount=no])
596 AC_ARG_ENABLE([documentation],
597   [AS_HELP_STRING([--enable-documentation], [enable make rules to rebuild documentation [default=maintainer-mode]])],
598   [case ${enableval} in
599     yes|no) ;;
600     *) AC_MSG_ERROR([bad value ${enableval} for --enable-documentation]) ;;
601   esac],
602   [enable_documentation=$USE_MAINTAINER_MODE])
603 AM_CONDITIONAL([DOCUMENTATION_RULES], [test x"$enable_documentation" = xyes])
604 AM_CONDITIONAL([MAINTAINER_NO_DOCS], [test x"$USE_MAINTAINER_MODE$enable_documentation" = xyesno])
606 if test x"$enable_documentation" = xyes ; then
607   dnl Checks for dot.  (Diagrams in the documentation)
608   AC_PATH_PROG([DOT], [dot])
609   test -z "$DOT" && AC_MSG_ERROR([dot (part of the graphviz package) is required to build documentation])
610   DOXYGEN_DOT_PATH=`echo "$DOT" | sed 's!/dot$!!'`
611   AC_SUBST([DOXYGEN_DOT_PATH])
613   dnl Check for doxygen. (Needed to make some more of the documentation)
614   AC_PATH_PROG([DOXYGEN], [doxygen], [])
615   test -z "$DOXYGEN" && AC_MSG_ERROR([doxygen is required to build documentation])
617   dnl Check for help2man. (Needed to make man pages from "--help" output).
618   AC_PATH_PROG([HELP2MAN], [help2man], [])
619   test -z "$HELP2MAN" && AC_MSG_ERROR([help2man is required to build documentation])
621   dnl Check for rst2html. (Needed to make HTML from reStructuredText format)
622   dnl Also look for rst2html.py, which archlinux reportedly installs it as.
623   AC_PATH_PROGS([RST2HTML], [rst2html rst2html.py], [])
624   test -z "$RST2HTML" && AC_MSG_ERROR([rst2html is required to build documentation (try package python-docutils)])
626   dnl Check for pngcrush, which we optionally use to reduce the size of the
627   dnl PNG files which doxygen generates.  We can get by without it, so don't
628   dnl fail here if it's not found.
629   AC_PATH_PROG([PNGCRUSH], [pngcrush], [])
632 dnl Checks for header files.
633 AC_CHECK_HEADERS([fcntl.h limits.h sys/errno.h sys/select.h], [], [], [ ])
634 AC_CHECK_HEADERS([sys/resource.h],
635                  [], [], [#include <sys/types.h>])
637 dnl cxxabi.h was added in GCC 3.1, but clang lies and defines __GNUC__ yet
638 dnl doesn't seem to reliably provide this header, so probe for it.
639 AC_CHECK_HEADERS([cxxabi.h], [], [], [ ])
641 dnl If valgrind is installed and new enough, we use it for leak checking in the
642 dnl testsuite.  If VALGRIND is set to an empty value, then skip the check and
643 dnl don't use valgrind.
644 if test -n "${VALGRIND-unset}" ; then
645   AC_PATH_PROG([VALGRIND], [valgrind], [])
646   if test -n "$VALGRIND" ; then
647     dnl Check that the installed valgrind version works, and supports the
648     dnl options we use.  This means we won't try to use valgrind < 3.3.0
649     dnl (released 7/12/2007) since before that --log-file didn't expand
650     dnl %p (and appended the process id).
651     dnl
652     dnl No need to check for VALGRIND_COUNT_LEAKS now - that was added before
653     dnl 2.0.0.
654     AC_MSG_CHECKING([if valgrind supports --log-file with %p and --child-silent-after-fork=yes])
655     vglog=config.vglog.%p.tmp
656     vglogwild="config.vglog.*.tmp*"
657     rm -f $vglogwild
658     if $VALGRIND --log-file="$vglog" --child-silent-after-fork=yes -q true 2>&AS_MESSAGE_LOG_FD ; then
659       for f in $vglogwild ; do
660         case $f in
661         $vglog*) VALGRIND= ;;
662         esac
663       done
664       if test x"$VALGRIND" = x ; then
665         AC_MSG_RESULT([no])
666       else
667         AC_MSG_RESULT([yes])
668         AC_CHECK_HEADERS([valgrind/memcheck.h], [], [VALGRIND=], [ ])
669       fi
670     else
671       dnl The valgrind detected doesn't seem to work!  Perhaps this is an
672       dnl x86_64 box with a 32 bit valgrind.
673       AC_MSG_RESULT([$VALGRIND doesn't work])
674       VALGRIND=
675     fi
676     rm -f $vglogwild
677   fi
680 if test -n "$VALGRIND" ; then
681   AC_DEFINE([HAVE_VALGRIND], [1], [Define if a suitable valgrind is installed])
684 dnl If eatmydata is installed, we run the testsuite under it to speed it up.
685 dnl If EATMYDATA is set to an empty value, then skip this check and don't use
686 dnl eatmydata.
687 if test -n "${EATMYDATA-unset}" ; then
688   AC_PATH_PROG([EATMYDATA], [eatmydata], [])
691 dnl Checks for library functions.
692 AC_FUNC_MEMCMP
693 AC_FUNC_STRERROR_R
695 AC_CACHE_CHECK([for sys_errlist and sys_nerr], ac_cv_sys_errlist_and_sys_nerr, [
696   AC_LINK_IFELSE([AC_LANG_PROGRAM(
697 dnl On Linux, sys_errlist and sys_nerr need <stdio.h>, though the man page
698 dnl says <errno.h>.  The man page seems to match other platforms such as
699 dnl NetBSD, so include both headers to ensure we get them.
700 [[#include <errno.h>
701 #include <stdio.h>]],
702 [[  printf("%s", sys_errlist[sys_nerr - 1]);]])],
703   [ ac_cv_sys_errlist_and_sys_nerr=yes ],
704   [ ac_cv_sys_errlist_and_sys_nerr=no ])
706 if test "x$ac_cv_sys_errlist_and_sys_nerr" = "xyes" ; then
707   AC_DEFINE([HAVE_SYS_ERRLIST_AND_SYS_NERR], [1],[Define if you have 'sys_errlist' and 'sys_nerr'])
710 AC_CACHE_CHECK([for _sys_errlist and _sys_nerr], ac_cv__sys_errlist_and__sys_nerr, [
711   AC_LINK_IFELSE([AC_LANG_PROGRAM(
712 [[#include <errno.h>
713 #include <stdio.h>]],
714 [[  printf("%s", _sys_errlist[_sys_nerr - 1]);]])],
715   [ ac_cv__sys_errlist_and__sys_nerr=yes ],
716   [ ac_cv__sys_errlist_and__sys_nerr=no
717   ])
719 if test "x$ac_cv__sys_errlist_and__sys_nerr" = "xyes" ; then
720   AC_DEFINE([HAVE__SYS_ERRLIST_AND__SYS_NERR], [1],[Define if you have '_sys_errlist' and '_sys_nerr'])
723 dnl Check that snprintf actually works as it's meant to.
725 dnl Linux 'man snprintf' warns:
726 dnl  Linux libc4.[45] does not have a snprintf, but provides a libbsd that
727 dnl  contains an snprintf equivalent to sprintf, i.e., one that ignores the
728 dnl  size argument.  Thus, the use of snprintf with early libc4 leads to
729 dnl  serious security problems.
731 dnl It also warns that glibc < 2.0.6 (and presumably other pre-C99
732 dnl implementations) return -1 when truncating so check that we get the
733 dnl ISO C99 semantics for the returned length when truncating.  If we
734 dnl have a working snprintf but with non-ISO return semantics, handle
735 dnl that case separately as it may still be useful in many cases.
737 dnl mingw has _snprintf so check for that too.
738 AC_MSG_CHECKING([for working ISO C99 conforming snprintf])
739 ac_cv_func_snprintf_noniso=no
740 for func in snprintf _snprintf ; do
741   AC_RUN_IFELSE([
742     AC_LANG_PROGRAM(
743       [[
744 #include <cstdio>
745 #include <cstring>
746 using namespace std;
747       ]],
748       dnl Return different exit status for each error so we can see which
749       dnl check failed by consulting config.log.
750       [[
751         char buffer[4] = "abc";
752         int res1 = $func(buffer, 2, "%s", "XYZ");
753         if (memcmp(buffer, "X\0c", 4) != 0) return 2;
754         int res2 = $func(buffer, 2, "%x", 0x12);
755         if (memcmp(buffer, "1\0c", 4) != 0) return 3;
756         if (res1 == -1 && res2 == -1) return 15; /* Pre-ISO semantics. */
757         if (res1 != 3) return 4;
758         if (res2 != 2) return 5;
759       ]]
760     )],
761     [ac_cv_func_snprintf=$func;break],
762     [
763     if test 15no = "$?$ac_cv_func_snprintf_noniso" ; then
764       ac_cv_func_snprintf_noniso=$func
765     fi
766     ac_cv_func_snprintf=no
767     ],
768     [ac_cv_func_snprintf=unknown;break]
769   )
770 done
771 AC_MSG_RESULT([$ac_cv_func_snprintf])
772 case $ac_cv_func_snprintf in
773   no)
774     AC_MSG_CHECKING([for working non-ISO C99 conforming snprintf])
775     AC_MSG_RESULT([$ac_cv_func_snprintf_noniso])
776     if test no != "$ac_cv_func_snprintf_noniso" ; then
777       AC_DEFINE_UNQUOTED([SNPRINTF], [$ac_cv_func_snprintf_noniso],
778         [Define to the name of a function implementing snprintf but not caring about ISO C99 return value semantics (if one exists)])
779     fi
780     ;;
781   unknown)
782     dnl be conservative when crosscompiling
783     ;;
784   *)
785     AC_DEFINE_UNQUOTED([SNPRINTF_ISO], [$ac_cv_func_snprintf],
786        [Define to the name of a function implementing snprintf with ISO C99 semantics (if one exists)])
787     AC_DEFINE_UNQUOTED([SNPRINTF], [$ac_cv_func_snprintf],
788        [Define to the name of a function implementing snprintf but not caring about ISO C99 return value semantics (if one exists)])
789     ;;
790 esac
792 dnl ***************************
793 dnl * Select modules to build *
794 dnl ***************************
796 dnl Check which database backends should be built.
798 AC_DEFUN([_XAPIAN_BACKEND_ENABLE],
799   [AC_ARG_ENABLE([backend_$1],
800     [AS_HELP_STRING([--enable-backend-$1], [build the $1 database backend [default=$3]])],
801     [case $enableval in
802       yes|no) ;;
803       *) AC_MSG_ERROR([Invalid option: '--enable-backend-$1=$enableval']) ;;
804     esac], [enable_backend_$1=$2])
805   ])
807 AC_DEFUN([XAPIAN_BACKEND_ENABLE],
808   [_XAPIAN_BACKEND_ENABLE([$1],
809     m4_default([$2], [yes]),
810     m4_default([$3], [yes]))
811   ])
813 dnl When adding a new backend, update INSTALL too.
814 XAPIAN_BACKEND_ENABLE([glass])
815 XAPIAN_BACKEND_ENABLE([inmemory])
816 default_enable_backend_remote=yes
817 case $host_os in
818   *djgpp* | *msdos* )
819     dnl We don't currently support the remote backend on this platform so
820     dnl disable it by default.
821     default_enable_backend_remote=no
822     ;;
823 esac
824 XAPIAN_BACKEND_ENABLE([remote], [$default_enable_backend_remote], [yes (except for MSDOS)])
826 use_proc_for_uuid=0
827 use_win32_uuid_api=0
828 win32_need_lws2_32=0
829 case $enable_backend_glass in
830 *yes*)
831   dnl We use zlib for compressing tags in glass.  We could
832   dnl automatically disable support if zlib isn't found, but overall that
833   dnl probably does more harm than good - it's most likely that someone just
834   dnl forgot to install the -dev package for zlib.
835   dnl
836   dnl Similarly for uuid support.
838   dnl Check for zlib.h.
839   AC_CHECK_HEADERS([zlib.h], [], [
840     AC_MSG_ERROR([zlib.h not found - required for glass (you may need to install the zlib1g-dev or zlib-devel package)])
841     ], [ ])
843   dnl Check for zlibVersion in -lz.
844   SAVE_LIBS=$LIBS
845   dnl mingw build needs -lzlib or -lzdll.
846   AC_SEARCH_LIBS([zlibVersion], [z zlib zdll], [], [
847     AC_MSG_ERROR([zlibVersion() not found in -lz, -lzlib, or -lzdll - required for glass (you may need to install the zlib1g-dev or zlib-devel package)])
848     ])
849   if test x != x"$LIBS" ; then
850     XAPIAN_LIBS="$XAPIAN_LIBS $LIBS"
851   fi
852   LIBS=$SAVE_LIBS
854   dnl Find the UUID library (from e2fsprogs/util-linux-ng, not the OSSP one).
856   case $host_os-$win32 in
857     *-yes | *cygwin*) dnl Use built-in win32 API.
858       use_win32_uuid_api=1
859       AC_DEFINE([USE_WIN32_UUID_API], [1],
860                 [Define to 1 to use UuidCreate(), etc])
861       if test $win32 = yes ; then
862         dnl We need -lws2_32 for htonl(), etc, but not for Cygwin which
863         dnl provides these functions in its libc.
864         win32_need_lws2_32=1
865       fi
866       XAPIAN_LIBS="$XAPIAN_LIBS -lrpcrt4"
867       ;;
868     *)
869       dnl Check for uuid/uuid.h (e2fsprogs/util-linux-ng) or uuid.h
870       dnl (FreeBSD/NetBSD).
871       AC_CHECK_HEADERS([uuid/uuid.h], [
872         dnl util-linux-ng's uuid/uuid.h found - check for uuid_generate in
873         dnl -luuid.
874         SAVE_LIBS=$LIBS
875         AC_SEARCH_LIBS([uuid_generate], [uuid], [], [
876           AC_MSG_ERROR([uuid_generate() not found in -luuid - required for glass (you may need to install the uuid-dev, libuuid-devel or e2fsprogs-devel package)])
877           ])
878         if test x != x"$LIBS" ; then
879           XAPIAN_LIBS="$XAPIAN_LIBS $LIBS"
880         fi
881       ], [
882         dnl Try uuid.h as found on FreeBSD/NetBSD, with associated code in libc.
883         AC_CHECK_HEADERS([uuid.h], [
884           dnl Check for uuid_create with no extra libraries required.
885           AC_CHECK_FUNC([uuid_create], [], [
886             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)])
887           ])
888         ], [
889           dnl Especially useful for Android.
890           AC_MSG_CHECKING([if host platform supports /proc/sys/kernel/random/uuid])
891           case $host_os in
892             linux*)
893               use_proc_for_uuid=1
894               AC_DEFINE([USE_PROC_FOR_UUID], [1],
895                         [Define to 1 to read UUID from '/proc/sys/kernel/random/uuid'])
896               AC_MSG_RESULT([yes])
897               ;;
898             *)
899               AC_MSG_RESULT([no])
900               AC_MSG_ERROR([Failed to find a way to generate UUIDs, required for glass backends (you may need to install the uuid-dev, libuuid-devel or e2fsprogs-devel package)])
901               ;;
902           esac
903         ], [ ])
904       ], [ ])
905       ;;
906   esac
908   dnl Older versions of libuuid (such as that on CentOS 4.7) don't have
909   dnl uuid_unparse_lower(), only uuid_unparse().
910   AC_LINK_IFELSE([AC_LANG_CALL([], [uuid_unparse_lower])],
911     [
912     AC_DEFINE([HAVE_UUID_UNPARSE_LOWER], [1],
913               [Define to 1 if you have the 'uuid_unparse_lower' function.])
914     ])
915   LIBS=$SAVE_LIBS
917   case $host_os in
918     *djgpp* | *msdos* )
919       dnl DJGPP has a dummy implementation of fork which always fails.
920       dnl
921       dnl For disk-based backends, use flock() for locking, which doesn't need
922       dnl fork() or socketpair().
923       AC_DEFINE([FLINTLOCK_USE_FLOCK], 1, [Define to use flock() for flint-compatible locking])
924       ;;
925   esac
926   ;;
927 esac
928 AM_CONDITIONAL([USE_PROC_FOR_UUID], [test "$use_proc_for_uuid" = 1])
929 AM_CONDITIONAL([USE_WIN32_UUID_API], [test "$use_win32_uuid_api" = 1])
931 if test "$enable_backend_remote" = yes ; then
932   case $host_os-$win32 in
933     *-yes )
934       dnl For mingw and msvc we have an alternative implementation which
935       dnl doesn't need fork() or socketpair().
936       dnl
937       dnl We need -lws2_32 for getaddrinfo(), etc.
938       win32_need_lws2_32=1
939       dnl Vista is needed for the AI_ADDRCONFIG flag to getaddrinfo().
940       AC_DEFINE([WINVER], [0x600],
941                 [Version of Windows to assume (0x600 => Vista).])
942       AC_DEFINE([_WIN32_WINNT], [WINVER],
943                 [Version of Windows to assume.])
944       ;;
945     *djgpp* | *msdos* )
946       dnl DJGPP has a dummy implementation of fork which always fails.  If
947       dnl someone actually wanted remote backend support, then DJGPP has a
948       dnl pthreads port, so using threads like we do on Windows would make more
949       dnl sense.
950       AC_MSG_ERROR([The remote backend is not currently supported on this platform.])
951       ;;
952     *)
953       dnl On Unix, we need fork and socketpair for the remotebackend.
954       SAVE_LIBS=$LIBS
955       AC_CHECK_FUNCS([fork], [], [
956         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.)])
957       ])
958       dnl Check if -lsocket is required for socketpair (Solaris needs it).
959       dnl And on Haiku it's in -lnetwork.
960       AC_SEARCH_LIBS([socketpair], [socket network], [], [
961         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.)])
962       ])
963       AC_DEFINE([HAVE_SOCKETPAIR], [1],
964                 [Define to 1 if you have the 'socketpair' function.])
965       dnl Check if extra libraries are needed for getaddrinfo or inet_ntop()
966       dnl (e.g. on Solaris).
967       dnl
968       dnl We're currently assuming that any system that is worth trying to
969       dnl support has getaddrinfo() and inet_ntop(), since these are the
970       dnl standard route for supporting IPv6, and that's pretty much essential
971       dnl for platforms to support now.
972       AC_SEARCH_LIBS([getaddrinfo], [nsl socket], [], [
973         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.)])
974       ])
975       AC_SEARCH_LIBS([inet_ntop], [nsl socket], [], [
976         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.)])
977       ])
978       XAPIAN_LIBS="$XAPIAN_LIBS $LIBS"
979       LIBS=$SAVE_LIBS
980       ;;
981   esac
983   TYPE_SOCKLEN_T
986 if test "$win32_need_lws2_32" = 1 ; then
987   XAPIAN_LIBS="$XAPIAN_LIBS -lws2_32"
990 AC_ARG_ENABLE([visibility],
991   [AS_HELP_STRING([--disable-visibility], [disable use of GCC visibility])],
992   [case ${enableval} in
993     yes|no) ;;
994     *) AC_MSG_ERROR([bad value ${enableval} for --disable-visibility]) ;;
995   esac])
997 vpath_build=no
998 if test "`pwd`" != "`cd $srcdir;pwd`" ; then
999   vpath_build=yes
1001 AM_CONDITIONAL([VPATH_BUILD], [test yes = "$vpath_build"])
1003 dnl Turn off compilation of anything that we don't have the requirements for
1005 dnl Set conditionals to specify what we compile
1007 AM_CONDITIONAL([BUILD_BACKEND_GLASS], [test yes = "$enable_backend_glass"])
1008 AM_CONDITIONAL([BUILD_BACKEND_INMEMORY], [test yes = "$enable_backend_inmemory"])
1009 AM_CONDITIONAL([BUILD_BACKEND_REMOTE], [test yes = "$enable_backend_remote"])
1010 AM_CONDITIONAL([BUILD_BACKEND_TOOLS],
1011   [test no != "$enable_backend_glass"])
1013 dnl Decide if we should use the zlib-vg.so LD_PRELOAD hack.
1014 use_zlib_vg=no
1015 if test -n "$VALGRIND" ; then
1016   case $host_os in
1017     linux*) use_zlib_vg=yes ;;
1018   esac
1020 AM_CONDITIONAL([USE_ZLIB_VG], [test yes = "$use_zlib_vg"])
1022 dnl See if we have fdatasync, and what libraries are needed for it.
1023 dnl We need to actually check for a declaration as OS X has a dummy
1024 dnl implementation in the library which is not prototyped in any header.
1025 AC_CHECK_DECL([fdatasync(int)], [
1026   SAVE_LIBS=$LIBS
1027   AC_SEARCH_LIBS([fdatasync], [rt], [XAPIAN_LIBS="$LIBS $XAPIAN_LIBS"])
1028   LIBS=$SAVE_LIBS
1029   AC_CHECK_FUNCS([fdatasync])
1030   ],
1031   [ac_cv_func_fdatasync=no],
1032   [#include <unistd.h>]
1035 AC_CHECK_FUNCS([fsync])
1036 AC_CHECK_FUNCS([posix_fadvise])
1037 if test "$win32" = no ; then
1038   dnl ftruncate() under Wine seems to be buggy and sometimes fails, though
1039   dnl a cut-down reproducer seems fine.  For now just avoid ftruncate()
1040   dnl entirely on this platform - we'll fallback to lseek() + write() of a
1041   dnl single zero byte, which is pretty efficient.
1042   AC_CHECK_FUNCS([ftruncate])
1045 dnl HP-UX has pread and pwrite, but they don't work!  Apparently this problem
1046 dnl manifests when largefile support is enabled, and we definitely want that
1047 dnl so don't use pread or pwrite on HP-UX.
1048 case $host_os in
1049   hpux*)
1050     AC_MSG_CHECKING([for pread])
1051     AC_MSG_RESULT([present but broken on $host_os])
1052     AC_MSG_CHECKING([for pwrite])
1053     AC_MSG_RESULT([present but broken on $host_os])
1054     ;;
1055   *)
1056     AC_CHECK_FUNC([pread],
1057        [AC_DEFINE([HAVE_PREAD], [1],
1058             [Define if pread is available on this system])
1059         AC_MSG_CHECKING([for any prototype needed for pread])
1060         AC_CACHE_VAL([xo_cv_pread_prototype],
1061           [
1062             for p in ' ' \
1063               'extern "C" ssize_t pread(int, void *, size_t, off_t) throw ();' \
1064               'extern "C" ssize_t pread(int, void *, size_t, off_t);' ; do
1065               AC_TRY_COMPILE([
1066 #include <sys/types.h>
1067 #include <unistd.h>
1069               ],[
1070                 char b[256];
1071                 pread(1, b, 256, 20);
1072               ],[
1073                 xo_cv_pread_prototype="$p"
1074                 break
1075               ])
1076             done
1077             if test -z "$xo_cv_pread_prototype"; then
1078               AC_MSG_RESULT([not found])
1079               AC_MSG_ERROR([Failed to find working prototype for pread])
1080             fi
1081           ])
1082           if test " " = "$xo_cv_pread_prototype" ; then
1083             AC_MSG_RESULT([none required])
1084           else
1085             AC_MSG_RESULT([$xo_cv_pread_prototype])
1086             AC_DEFINE_UNQUOTED([PREAD_PROTOTYPE], [$xo_cv_pread_prototype],
1087                                [explicit prototype needed for pread (if any)])
1088           fi
1089         ])
1090     AC_CHECK_FUNC([pwrite],
1091        [AC_DEFINE([HAVE_PWRITE], [1],
1092             [Define if pwrite is available on this system])
1093         AC_MSG_CHECKING([for any prototype needed for pwrite])
1094         AC_CACHE_VAL([xo_cv_pwrite_prototype],
1095           [
1096             for p in ' ' \
1097               'extern "C" ssize_t pwrite(int, const void *, size_t, off_t) throw ();' \
1098               'extern "C" ssize_t pwrite(int, const void *, size_t, off_t);' ; do
1099               AC_TRY_COMPILE([
1100 #include <sys/types.h>
1101 #include <unistd.h>
1103               ],[
1104                 const char *p = "hello";
1105                 pwrite(1, p, 5, 20);
1106               ],[
1107                 xo_cv_pwrite_prototype="$p"
1108                 break
1109               ])
1110             done
1111             if test -z "$xo_cv_pwrite_prototype"; then
1112               AC_MSG_RESULT([not found])
1113               AC_MSG_ERROR([Failed to find working prototype for pwrite])
1114             fi
1115           ])
1116           if test " " = "$xo_cv_pwrite_prototype" ; then
1117             AC_MSG_RESULT([none required])
1118           else
1119             AC_MSG_RESULT([$xo_cv_pwrite_prototype])
1120             AC_DEFINE_UNQUOTED([PWRITE_PROTOTYPE], [$xo_cv_pwrite_prototype],
1121                                [explicit prototype needed for pwrite (if any)])
1122           fi
1123         ])
1124     ;;
1125 esac
1127 AC_MSG_CHECKING([for directory separator(s)])
1128 case $host_os-$win32 in
1129   *-yes | cygwin* | os2* | *djgpp* | *msdos* )
1130     AC_MSG_RESULT([/ and \\])
1131     AC_DEFINE([DIR_SEPS], ["/\\"], [directory separator(s) as a character or string literal])
1132     AC_DEFINE([DIR_SEPS_LIST], [{ '/', '\\' }], [directory separator(s) as an initialiser list])
1133     ;;
1134   *)
1135     AC_MSG_RESULT([/])
1136     AC_DEFINE([DIR_SEPS], ['/'], [directory separator(s) as a character or string literal])
1137     AC_DEFINE([DIR_SEPS_LIST], [{ '/' }], [directory separator(s) as an initialiser list])
1138     ;;
1139 esac
1141 AC_CHECK_FUNCS([link])
1143 dnl *************************
1144 dnl * Set debugging options *
1145 dnl *************************
1147 dnl Which assertion types to enable in the code.
1149 AC_ARG_ENABLE([assertions],
1150   [AS_HELP_STRING([--enable-assertions], [enable debug assertions (no|partial|yes) [default=no]])],
1151   [case $enableval in
1152     yes|partial|no) ;;
1153     *)
1154       AC_MSG_ERROR([Invalid option: '--enable-assertions=$enableval']) ;;
1155   esac])
1157 AC_ARG_ENABLE([log],
1158   [AS_HELP_STRING([--enable-log], [generate a log of methods called, etc (no|yes|profile) [default=no]])],
1159   [case $enableval in
1160     yes|no) ;;
1161     profile)
1162       AC_MSG_ERROR(['--enable-log=profile' is no longer supported - see https://trac.xapian.org/wiki/ProfilingXapian for alternatives.]) ;;
1163     *)
1164       AC_MSG_ERROR([Invalid option: '--enable-log=$enableval']) ;;
1165   esac])
1167 dnl Set defines according to the --enable-assertions and --enable-log options
1168 dnl given.
1170 if test yes = "$enable_assertions" || test partial = "$enable_assertions" ; then
1171   AC_DEFINE([XAPIAN_ASSERTIONS],,
1172     [Define if you want assertions (causes some slow-down)])
1175 if test yes = "$enable_assertions"; then
1176   AC_DEFINE([XAPIAN_ASSERTIONS_PARANOID],,
1177     [Define if you want paranoid assertions (causes significant slow-down)])
1180 if test yes = "$enable_log"; then
1181   AC_DEFINE([XAPIAN_DEBUG_LOG],,
1182     [Define if you want a log of methods called and other debug messages])
1185 dnl ******************************
1186 dnl * Set special compiler flags *
1187 dnl ******************************
1189 dnl Set flags to control warnings (enable more, or disable annoying ones).
1190 dash_d_visibility=
1191 if test yes = "$GXX"; then
1192   dnl Intel's C++ compiler and clang both lie and define __GNUC__, so check which
1193   dnl we actually have, as neither is really 100% compatible.
1194   case `echo __INTEL_COMPILER __clang__|$CXX -E - 2>&AS_MESSAGE_LOG_FD|grep -v '^#'` in
1195     *__INTEL_COMPILER*__clang__*)
1196       dnl GCC (since neither substituted):
1198       dnl The exact format of g++ --version seems to change with almost every
1199       dnl minor release so use the preprocessor macros which should be more
1200       dnl robust.
1201       AC_MSG_CHECKING([for version of $CXX])
1202       gxx_version=`echo __GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__|$CXX -E -|sed '/^#/d;s/ //g'`
1203       AC_MSG_RESULT([GCC $gxx_version])
1205       case $gxx_version in
1206       [[0123]].*|4.[[0-7]].*)
1207         AC_MSG_ERROR([Xapian requires GCC 4.8 or later])
1208         ;;
1209       esac
1211       dnl -Wundef was supported by g++ 3.0.
1212       dnl
1213       dnl -Wlogical-op and -Wmissing-declarations (for C++) were added in
1214       dnl GCC 4.3.
1215       dnl
1216       dnl -Wdouble-promotion was added in GCC 4.6.
1217       dnl
1218       dnl -Winit-self was added in GCC 3.4, but for GCC < 4.7 g++ always
1219       dnl warns for this case with -Wuninitialized (implied by -W).  We
1220       dnl don't intend to use this idiom, so any instances are bugs we'd
1221       dnl like to know about.
1222       dnl
1223       dnl All the other options were supported by g++ 2.95.
1224       AM_CXXFLAGS="$AM_CXXFLAGS -Wall -W -Wredundant-decls -Wpointer-arith -Wcast-qual -Wcast-align -Wformat-security -fno-gnu-keywords -Wundef -Woverloaded-virtual -Wstrict-null-sentinel -Wshadow -Wstrict-overflow=1 -Wlogical-op -Wmissing-declarations -Wdouble-promotion -Winit-self"
1226       dnl FIXME:
1227       dnl -Wconversion in older GCC versions is intended to help migration
1228       dnl from K&R to ISO C, and isn't useful for us.  In 4.3 it was renamed
1229       dnl to -Wtraditional-conversion and a new -Wconversion added which
1230       dnl sounds useful but is a bit buggy currently.  So we should consider
1231       dnl enabling -Wconversion once it is stabilised (GCC 4.4 or ...)
1232       dnl
1233       dnl -Wold-style-cast is interesting, but triggers for macros from
1234       dnl system headers (e.g. FD_SET).  GCC 4.8 improved this by making
1235       dnl -ftrack-macro-expansion=2 the default, but we still see such
1236       dnl warnings on some platforms for some reason (e.g. Cygwin with GCC
1237       dnl 5.4.0 warns about FD_SET, and on Debian with GCC 4.9.2 we see
1238       dnl warnings from zlib.h).
1240       dnl Automatically add -Werror if maintainer mode is enabled.
1241       if test x$USE_MAINTAINER_MODE = xyes; then
1242         AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
1243       fi
1244       ;;
1245     *__clang__*)
1246       dnl Intel's compiler (since __clang__ not substituted):
1247       dnl
1248       dnl -w1 stops the avalanche of uninteresting "remark" messages.
1249       dnl -wd... disables warnings which don't have good code workarounds.
1250       AM_CXXFLAGS="$AM_CXXFLAGS -Wall -w1 -wd177,1572"
1252       dnl Automatically add -Werror if maintainer mode is enabled.
1253       if test x$USE_MAINTAINER_MODE = xyes; then
1254         AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
1255       fi
1256       ;;
1257     *__INTEL_COMPILER*)
1258       dnl clang (since __INTEL_COMPILER not substituted):
1260       dnl These options all work at least as far back as clang++ 3.0:
1261       AM_CXXFLAGS="$AM_CXXFLAGS -Wall -W -Wredundant-decls -Wpointer-arith -Wcast-qual -Wcast-align -Wformat-security -fno-gnu-keywords -Wundef -Woverloaded-virtual -Wshadow -Wstrict-overflow=1 -Wmissing-declarations -Winit-self"
1263       dnl Automatically add -Werror if maintainer mode is enabled.
1264       if test x$USE_MAINTAINER_MODE = xyes; then
1265         AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
1266       fi
1267       ;;
1268   esac
1270   if test no != "$enable_visibility"; then
1271     dnl GCC doesn't support symbol visibility on all platforms (e.g. it isn't
1272     dnl supported on mingw).
1273     AC_MSG_CHECKING([if $CXX -fvisibility=hidden works])
1274     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
1275       AC_MSG_RESULT([yes])
1276       AM_CXXFLAGS="$AM_CXXFLAGS -fvisibility=hidden"
1277       dash_d_visibility=-DXAPIAN_ENABLE_VISIBILITY
1279       dnl If available, enable -fvisibility-inlines-hidden too, which results
1280       dnl in inline functions in API classes being marked as hidden so that
1281       dnl they get bound at link time inside the library reducing the number
1282       dnl of relocations needed at library load time.
1283       AC_MSG_CHECKING([if $CXX -fvisibility-inlines-hidden works])
1284       if echo 'int bar() __attribute__((visibility("default"))); int foo() {return 42;}'|$CXX -Werror -fvisibility=hidden -fvisibility-inlines-hidden -c -oconftest.o -xc++ - >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ; then
1285         AC_MSG_RESULT([yes])
1286         AM_CXXFLAGS="$AM_CXXFLAGS -fvisibility-inlines-hidden"
1287       else
1288         AC_MSG_RESULT([no])
1289       fi
1290     else
1291       AC_MSG_RESULT([no])
1292     fi
1293   fi
1294 else
1295   dnl Not GCC, nor a compiler masquerading as GCC.
1296   case /$CXX in
1297   */aCC)
1298     dnl +w turns on more warnings.
1299     dnl +wlint turns on "lint-like" warnings.
1300     dnl +W<n1>,<n2>,... suppresses warnings n1, n2, ...
1301     dnl 2340 (remark) "value copied to temporary, reference to temporary
1302     dnl use", in: throw Xapian::UnimplementedError("...");
1303     dnl 2401 "destructor for base class ... is non-virtual" (we don't need a
1304     dnl virtual destructor for intrusive_base, since we never delete
1305     dnl       its subclasses by a intrusive_base *).
1306     dnl 3348 "declaration hides constant ..." which seems to misfire!
1307     dnl 4255 (remark) "padding size of struct "..." with ... bytes to
1308     dnl alignment boundary".
1309     dnl 4273 "floating-point equality and inequality comparisons may be
1310     dnl inappropriate due to roundoff common in floating-point computation"
1311     dnl No obvious workaround for when you really do want == or !=.
1312     dnl 20201 "Memory leak is detected" which triggers for "return new Foo;"!
1313     AM_CXXFLAGS="$AM_CXXFLAGS +w +wlint +W2340,2401,3348,4255,4273,20201" ;;
1314   */sunCC|*/CC)
1315     dnl Sun's C++ compiler warns about functions failing to return a value even
1316     dnl when the function ends with a "throw" statement.  That's just unhelpful
1317     dnl noise, and adding a dummy "return" after "throw" seems a worse solution
1318     dnl than simply disabling this warning - any genuinely missing return
1319     dnl statements will get reported by compilers with superior warning
1320     dnl machinery.
1321     XAPIAN_TEST_CXXFLAGS([-erroff=voidretw], [AM_CXXFLAGS])
1322     ;;
1323   esac
1326 XAPIAN_TEST_LINKER_FLAG([-Bsymbolic-functions], [symbolic_functions],
1327   [XAPIAN_LDFLAGS="$XAPIAN_LDFLAGS $flag"])
1329 FP_EXCESS_PRECISION=no
1330 AC_MSG_CHECKING([whether to use SSE instructions on x86])
1331 case $host_cpu in
1332   i*86)
1333     if test "$enable_sse" = no ; then
1334       AC_MSG_RESULT([no])
1335       FP_EXCESS_PRECISION=yes
1336     else
1337       dnl Default to sse2.
1338       test "$enable_sse" != yes || enable_sse=sse2
1339       if test yes = "$GXX"; then
1340         AC_MSG_RESULT([yes (configure with --disable-sse to disable)])
1341         dnl We can unconditionally use -mtune=generic as it was added in GCC
1342         dnl 4.2, and supported at least as far back as clang 3.0.
1343         AM_CXXFLAGS="$AM_CXXFLAGS -mfpmath=sse -m$enable_sse -mtune=generic"
1344       else
1345         AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
1346 [[#ifndef __SUNPRO_CC
1347 #error Not Sun compiler
1348 #endif]])],
1349           [AC_MSG_RESULT([yes (configure with --disable-sse to disable)])
1350           AM_CXXFLAGS="$AM_CXXFLAGS -xarch=$enable_sse"]
1351           ,
1352           [AC_MSG_RESULT([don't know how to for compiler $CXX])
1353           FP_EXCESS_PRECISION=yes]
1354         )
1355       fi
1356     fi
1357     ;;
1358   *)
1359     AC_MSG_RESULT([non-x86 arch ($host_cpu)]) ;;
1360 esac
1361 AC_SUBST([FP_EXCESS_PRECISION])
1363 AH_BOTTOM(
1364 [/* Disable stupid MSVC warnings. */
1365 #ifdef _MSC_VER
1366 /* Passing an empty parameter to a single parameter macro. */
1367 # pragma warning(disable:4003)
1368 /* A "performance" warning for converting int to bool. */
1369 # pragma warning(disable:4800)
1370 #endif
1372 #ifdef _MSC_VER
1373 /* Tell MSVC we want M_PI, etc defined. */
1374 # define _USE_MATH_DEFINES
1376 /* Tell MSVC we don't want max() and min() macros defined. */
1377 # define NOMINMAX
1378 #endif
1380 /* MSVC defines _WIN32 but not __WIN32__. */
1381 #if !defined __WIN32__ && defined _WIN32 && !defined _WIN64
1382 # define __WIN32__
1383 #endif
1385 /* _FORTIFY_SOURCE is only supported by GCC >= 4.1 and glibc >= 2.3.4, but it
1386  * shouldn't cause a problem to define it where it's not supported and some
1387  * distros may have backported support, so hardcoding version checks is
1388  * counter-productive.
1390  * Check if _FORTIFY_SOURCE is already defined to allow the user to override
1391  * our choice with "./configure CPPFLAGS=-D_FORTIFY_SOURCE=0" or "...=1".
1392  */
1393 #if defined __GNUC__ && !defined _FORTIFY_SOURCE
1394 # define _FORTIFY_SOURCE 2
1395 #endif
1397 /* For compilers which support it (such as GCC, clang, Intel's C++ compiler)
1398  * we can use __builtin_expect to give the compiler hints about branch
1399  * prediction.  See HACKING for how to use these.
1400  */
1401 #if HAVE_DECL___BUILTIN_EXPECT
1402 /* The arguments of __builtin_expect() are both long, so use !! to ensure that
1403  * the first argument is always an integer expression, and always 0 or 1, but
1404  * still has the same truth value for the if or while it is used in.
1405  */
1406 # define rare(COND) __builtin_expect(!!(COND), 0)
1407 # define usual(COND) __builtin_expect(!!(COND), 1)
1408 #else
1409 # define rare(COND) (COND)
1410 # define usual(COND) (COND)
1411 #endif
1413 /* Signal we're building the library so it's OK to include headers such as
1414  * xapian/query.h directly.
1415  */
1416 #define XAPIAN_LIB_BUILD 1
1418 /* With Sun CC 5.13 (Studio 12.4) on Solaris 11.2, <math.h> seems to get
1419  * implicitly included somehow before <cmath>, and compilation fails due
1420  * to 'std::exception' colliding with 'struct exception'.  It's not clear
1421  * how to avoid this, so just define the same magic macro which <cmath> does
1422  * before it includes <math.h>.
1423  */
1424 #ifdef __SUNPRO_CC
1425 # define __MATHERR_RENAME_EXCEPTION
1426 #endif
1429 AC_SUBST([AM_CXXFLAGS])
1431 dnl Restore CXXFLAGS to those the user specified or autoconf defaulted to.
1432 CXXFLAGS=$save_CXXFLAGS
1434 dnl Required for auto regeneration to work in a combined maintainer-mode tree.
1435 : ${AUTOM4TE=autom4te}
1436 AC_SUBST([AUTOM4TE])
1438 dnl Libtool sets this (to yes|no|unknown) and we use it in xapian-config.
1439 AC_SUBST([link_all_deplibs_CXX])
1441 dnl Shared library extension.
1442 module=no
1443 eval "SHLIBEXT=$shrext_cmds"
1444 AC_SUBST([SHLIBEXT])
1446 dnl We want to be able to use GNU make % pattern rules in maintainer targets
1447 dnl but automake warns these aren't portable, so we substitute the % to avoid
1448 dnl this warning.
1449 PERCENT='%'
1450 AC_SUBST([PERCENT])
1452 dnl Split up the version number into "MAJOR.MINOR.REVISION".
1453 MAJOR_VERSION=`echo "$VERSION"|sed 's/\..*//'`
1454 [MINOR_VERSION=`echo "$VERSION"|sed 's/[^.]*\.//;s/\..*//'`]
1455 [REVISION=`echo "$VERSION"|sed 's/.*\.//;s/_.*$//'`]
1457 dnl **************************
1458 dnl * Build the output files *
1459 dnl **************************
1461 AC_CONFIG_FILES([
1462  Makefile
1463  tests/Makefile
1464  docs/Makefile
1465  docs/doxygen_api.conf
1466  docs/doxygen_source.conf
1467  xapian-core.spec
1468  cmake/xapian-config.cmake
1469  cmake/xapian-config-version.cmake
1470  pkgconfig/xapian-core"$LIBRARY_VERSION_SUFFIX".pc:pkgconfig/xapian-core.pc.in
1471  ])
1472 AC_CONFIG_FILES([tests/runtest], [chmod +x tests/runtest])
1473 AC_CONFIG_FILES([tests/runsrv], [chmod +x tests/runsrv])
1474 AC_CONFIG_FILES([tests/submitperftest], [chmod +x tests/submitperftest])
1475 AC_CONFIG_FILES([tests/perftest/get_machine_info], [chmod +x tests/perftest/get_machine_info])
1476 AC_CONFIG_FILES([xapian-config], [chmod +x xapian-config])
1477 AC_CONFIG_FILES([makemanpage], [chmod +x makemanpage])
1478 AC_OUTPUT
1480 dnl There are no files generated by AC_OUTPUT in the following directories
1481 dnl and we need to ensure they exist so that the rest of configure or make
1482 dnl won't fail because they don't exist when srcdir != builddir.
1483 if test yes = "$vpath_build" ; then
1484   for dir in include/xapian languages queryparser ; do
1485     AS_MKDIR_P(["$dir"])
1486   done
1489 dnl Generate include/xapian/version.h:
1491 dnl MAIN_VERSION is VERSION without any _git123 suffix.
1492 MAIN_VERSION="$MAJOR_VERSION.$MINOR_VERSION.$REVISION"
1493 cxxcpp_flags=-I.
1494 for backend in GLASS INMEMORY REMOTE ; do
1495   val=`eval echo "\\\$BUILD_BACKEND_${backend}_TRUE"`
1496   if test -z "$val" ; then
1497     cxxcpp_flags="$cxxcpp_flags -DXAPIAN_HAS_${backend}_BACKEND"
1498   fi
1499 done
1501 if test yes = "$enable_64bit_docid" ; then
1502   cxxcpp_flags="$cxxcpp_flags -DXAPIAN_DOCID_BASE_TYPE="`echo "$INT64_T"|sed 's/ /____/g'`
1503 else
1504   cxxcpp_flags="$cxxcpp_flags -DXAPIAN_DOCID_BASE_TYPE="`echo "$INT32_T"|sed 's/ /____/g'`
1507 if test yes = "$enable_64bit_termcount" ; then
1508   cxxcpp_flags="$cxxcpp_flags -DXAPIAN_TERMCOUNT_BASE_TYPE="`echo "$INT64_T"|sed 's/ /____/g'`
1509 else
1510   cxxcpp_flags="$cxxcpp_flags -DXAPIAN_TERMCOUNT_BASE_TYPE="`echo "$INT32_T"|sed 's/ /____/g'`
1513 dnl Always ought to be 64 bit.
1514 cxxcpp_flags="$cxxcpp_flags -DXAPIAN_TOTALLENGTH_TYPE="`echo "unsigned $INT64_T"|sed 's/ /____/g'`
1516 dnl Make revision numbers in the API 64 bit for future-proofing.
1517 cxxcpp_flags="$cxxcpp_flags -DXAPIAN_REVISION_TYPE="`echo "unsigned $INT64_T"|sed 's/ /____/g'`
1519 dnl For GCC (and compilers which pretend to be GCC) and MSVC, we create some
1520 dnl ABI checks in the generated version.h, and $CXXFLAGS may contain options
1521 dnl which affect the ABI (e.g. -fabi-version for GCC) so we want to use these
1522 dnl options when generating version.h.  For these compilers, CXXCPP="$CXX -E"
1523 dnl so it should understand all compiler options.
1525 dnl For other compilers, we only pass $CPPFLAGS to $CXXCPP in case it's an
1526 dnl external cpp which doesn't understand flags which might be in $CXXFLAGS.
1527 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[#ifndef __GNUC__
1528 #ifndef _MSC_VER
1529        choke me
1530 #endif
1531 #endif
1532 ]])],
1533         [cxxcpp_flags="$cxxcpp_flags $CPPFLAGS $CXXFLAGS"],
1534         [cxxcpp_flags="$cxxcpp_flags $CPPFLAGS"])
1535 rm -f include/xapian/version.h.tmp
1536 dnl "\r" in sed is a GNUism, but we only need to remove it on MS Windows
1537 dnl where we'll always have GNU sed, and other sed's will just interpret
1538 dnl it as "r" (Solaris sed) or maybe literal "\r" which won't match.
1540 dnl Use @@ around $MAIN_VERSION so we get " in the final output.
1541 $CXXCPP $cxxcpp_flags\
1542         -DSTRING_VERSION="\"@@$MAIN_VERSION@@\""\
1543         -DMAJOR_VERSION="\"$MAJOR_VERSION\""\
1544         -DMINOR_VERSION="\"$MINOR_VERSION\""\
1545         -DREVISION="\"$REVISION\""\
1546         $dash_d_visibility\
1547         $srcdir/include/xapian/version_h.cc|\
1548         ${SED-sed} '/"/!d;s/^ *//;/^#/d;s/ *$//;s/" *,//;s/"//g;s/@@/"/g;s/  */ /g;s/ *,\r$//;s/ *,$//;s/____/ /g;s/\\\\$/\\/'\
1549         > include/xapian/version.h.tmp
1550 dnl Only update the file if it has changed, so we don't alter the timestamp
1551 dnl and cause lots of rebuilding needlessly.  However, the build system
1552 dnl needs a timestamp to know when to regenerate version.h because version_h.cc
1553 dnl has changed so we use a separate timestamp file.
1554 touch include/xapian/version.h.timestamp
1555 if cmp include/xapian/version.h.tmp include/xapian/version.h >/dev/null 2>&1
1556 then
1557   rm include/xapian/version.h.tmp
1558 else
1559   mv include/xapian/version.h.tmp include/xapian/version.h