Factor out function to decode 2 hex digits
[xapian.git] / xapian-bindings / configure.ac
blob602fffefbb5b3c634c1213d78c86da4adea7994e
1 dnl Process this file with autoconf to produce a configure script.
3 dnl See xapian-core's HACKING document for details of the reasons for required
4 dnl versions.
5 AC_PREREQ([2.63])
7 m4_define([project_version], [1.4.20])
8 AC_INIT([xapian-bindings], project_version, [https://xapian.org/bugs])
10 dnl See xapian-core's HACKING document for details of the reasons for required
11 dnl versions.
12 AM_INIT_AUTOMAKE([1.12.2 parallel-tests -Wportability subdir-objects tar-ustar no-dist-gzip dist-xz])
13 AC_CONFIG_SRCDIR([xapian-headers.i])
15 AC_CONFIG_HEADERS([config.h])
17 AC_CONFIG_MACRO_DIR([m4])
19 dnl Mac OS X needs MACOSX_DEPLOYMENT_TARGET set to 10.3 (or higher) to
20 dnl successfully link the SWIG generated modules.  The link always fails on
21 dnl earlier versions of Mac OS X (10.1.4 and 10.2.8 tested), and these versions
22 dnl are long obsolete now, so we just ensure that MACOSX_DEPLOYMENT_TARGET is
23 dnl set to at least 10.3.
24 dnl
25 dnl NB we must do this *BEFORE* LT_INIT since that is what checks
26 dnl MACOSX_DEPLOYMENT_TARGET.
27 AC_CANONICAL_HOST
28 OVERRIDE_MACOSX_DEPLOYMENT_TARGET=
29 case $host in
30 *86*-darwin8*|*-darwin[[912]]*)
31   dnl On 10.5 or later, and 10.4 on x86, the deployment target defaults to the
32   dnl OS version, so we don't need to override on these.
33   ;;
34 *-darwin*)
35   case $MACOSX_DEPLOYMENT_TARGET in
36   "")
37     OVERRIDE_MACOSX_DEPLOYMENT_TARGET=10.3 ;;
38   10.[[012]])
39     AC_MSG_WARN([Overriding MACOSX_DEPLOYMENT_TARGET from $MACOSX_DEPLOYMENT_TARGET to 10.3])
40     OVERRIDE_MACOSX_DEPLOYMENT_TARGET=10.3 ;;
41   esac
42   ;;
43 esac
44 AM_CONDITIONAL(OVERRIDE_MACOSX_DEPLOYMENT_TARGET, test -n "$OVERRIDE_MACOSX_DEPLOYMENT_TARGET")
45 AC_SUBST(OVERRIDE_MACOSX_DEPLOYMENT_TARGET)
46 if test -n "$OVERRIDE_MACOSX_DEPLOYMENT_TARGET" ; then
47   MACOSX_DEPLOYMENT_TARGET=$OVERRIDE_MACOSX_DEPLOYMENT_TARGET
50 dnl Use libtool to manage our libraries, but don't build static libraries as
51 dnl the bindings only have a use for dynamic ones.
52 LT_PREREQ([2.2.6])
53 LT_INIT([disable-static])
55 dnl -no-undefined causes problems on Mac OS X with at least some
56 dnl MACOSX_DEPLOYMENT_TARGET settings, so only pass -no-undefined on
57 dnl platforms where it is required in order to link a shared library at
58 dnl all (Windows is the main one).
59 NO_UNDEFINED=
60 if test unsupported = "$allow_undefined_flag" ; then
61   NO_UNDEFINED=-no-undefined
63 AC_SUBST(NO_UNDEFINED)
65 dnl Checks for programs.
66 AC_PROG_CXX
68 # Checked: freebsd8.0 openbsd4.6 solaris2.9 solaris2.10
69 case $host_os in
70   linux* | k*bsd*-gnu | freebsd* | openbsd* | solaris*)
71     dnl Vanilla libtool sets this to "unknown" which it then handles as "yes".
72     link_all_deplibs_CXX=no
73     ;;
74 esac
76 case $host_os in
77   linux*)
78     dnl Extract search path from ldconfig which is more reliable than the way
79     dnl vanilla libtool extracts them from ld.so.conf.
80     d=`/sbin/ldconfig -N -X -v 2>&AS_MESSAGE_LOG_FD|$SED 's,^\(/.*\):\( (.*)\)\?$,\1,p;d'|tr '\n' ' '`
81     test -z "$d" || sys_lib_dlsearch_path_spec=$d
82     ;;
83 esac
85 dnl Run tests using the C++ compiler.
86 AC_LANG([C++])
88 dnl Probe for any options needed to enable C++11 support.
89 AX_CXX_COMPILE_STDCXX([11])
91 dnl Check for xapian-core.
92 XO_LIB_XAPIAN([], [],
93     [xapian-config]regexp(project_version,
94                           [^\([0-9]*\.[0-9]*[13579]\)\..*$], [-\1]))
95 XO_REQUIRE([1.4.0])
97 NEED_JNILIB_EXT=no
98 NEED_INTREE_DYLD=no
99 INTREE_DYLD_PATH=
100 case $host_os in
101 darwin*)
102   NEED_JNILIB_EXT=yes
103   dnl If we're building against an uninstalled xapian-core, xapian-config
104   dnl --libs will give an error.
105   if $XAPIAN_CONFIG --libs >/dev/null 2>/dev/null ; then
106     :
107   else
108     NEED_INTREE_DYLD=yes
109     dnl $XAPIAN_LIBS may have some options first, so grab the last argument,
110     dnl which should be the .la file.
111     set x $XAPIAN_LIBS
112     as_fn_arith $# - 1
113     shift $as_val
114     INTREE_DYLD_PATH=$1
115     dnl Make sure the path is absolute.
116     case $INTREE_DYLD_PATH in
117       /*) ;;
118       *) INTREE_DYLD_PATH=`pwd`/$INTREE_DYLD_PATH ;;
119     esac
120     dnl Add .libs or equivalent.
121     INTREE_DYLD_PATH=`echo "$INTREE_DYLD_PATH"|sed 's,\(.*/\).*,\1,'`$lt_cv_objdir
122     AC_SUBST([INTREE_DYLD_PATH])
123   fi
124   ;;
125 esac
126 AM_CONDITIONAL(NEED_JNILIB_EXT, test yes = "$NEED_JNILIB_EXT")
127 AM_CONDITIONAL(NEED_INTREE_DYLD, test yes = "$NEED_INTREE_DYLD")
129 dnl We want XAPIAN_CXXFLAGS to be used for configure tests, so add it to
130 dnl CXXFLAGS for the duration of configure.
131 save_CXXFLAGS=$CXXFLAGS
132 CXXFLAGS="$CXXFLAGS $XAPIAN_CXXFLAGS"
134 dnl COMPAT_VERSION is the version of xapian-core that "matches" our version.
135 dnl We allow for bindings being version 0.8.5.1 while xapian-core is 0.8.5.
136 dnl COMPAT_VERSION also ignores any _git123 suffix which snapshots will have.
137 COMPAT_VERSION=[`echo "$PACKAGE_VERSION"|sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/'`]
138 AC_SUBST(COMPAT_VERSION)
140 dnl VERSION_NO_SNAPSHOT simply has any _git123 suffix removed.
141 VERSION_NO_SNAPSHOT=[`echo "$PACKAGE_VERSION"|sed 's/_.*$//'`]
142 AC_SUBST(VERSION_NO_SNAPSHOT)
144 dnl We only need to set docdir for compatibility with autoconf < 2.60 - this
145 dnl code can be removed once we move to requiring autoconf 2.60 or newer.
146 test -n "$docdir" || docdir='${datadir}/doc/${PACKAGE_TARNAME}'
147 AC_SUBST(docdir)
149 AC_ARG_ENABLE(visibility,
150   [AS_HELP_STRING([--disable-visibility], [disable use of GCC visibility])],
151   [case ${enableval} in
152     yes|no) ;;
153     *) AC_MSG_ERROR([bad value ${enableval} for --disable-visibility]) ;;
154   esac])
156 dnl Only probe for SWIG and enable SWIG rules in makefiles if
157 dnl configure --enable-maintainer-mode is used.
158 AM_MAINTAINER_MODE
160 AC_ARG_ENABLE(documentation,
161   [AS_HELP_STRING([--enable-documentation], [enable make rules to rebuild shipped documentation [default=maintainer-mode]])],
162   [case ${enableval} in
163     yes|no) ;;
164     *) AC_MSG_ERROR([bad value ${enableval} for --enable-documentation]) ;;
165   esac])
166 test -z "$enable_documentation" && enable_documentation=$USE_MAINTAINER_MODE
167 AM_CONDITIONAL(DOCUMENTATION_RULES, test x"$enable_documentation" = xyes)
168 AM_CONDITIONAL(MAINTAINER_NO_DOCS, test x"$USE_MAINTAINER_MODE$enable_documentation" = xyesno)
170 if test yes = "$enable_documentation" ; then
171   dnl Check for rst2html. (Needed to make HTML from reStructuredText format)
172   dnl Also look for rst2html.py, which archlinux reportedly installs it as.
173   AC_PATH_PROGS(RST2HTML, [rst2html rst2html.py], [])
174   AC_ARG_VAR([RST2HTML], [reST to HTML convertor])
175   test -z "$RST2HTML" && AC_MSG_ERROR([rst2html is required to build documentation (try package python-docutils)])
178 if test x$USE_MAINTAINER_MODE = xyes; then
179   dnl Check for swig - this does most of the work for the bindings.
180   dnl AC_PATH_PROGS only honours an already set SWIG if it's a full
181   dnl path.  Listing it in the "to be searched" list like this allows
182   dnl ./configure SWIG=myswig to work.
183   swigoverridden=${SWIG+yes}
184   AC_PATH_PROGS(SWIG, ["${SWIG-swig}"], [])
185   AC_ARG_VAR(SWIG, [SWIG interface generator (only needed by Xapian developers)])
186   if test -z "$SWIG" ; then
187     AC_MSG_ERROR([Can't find SWIG utility])
188   fi
189   dnl Check for new enough SWIG.
190   dnl
191   dnl 3.0.6 fixes compiling the Perl bindings under C++11 ("seed" macro issue).
192   dnl 3.0.8 fixes conversion of integers large than an int in Python 3.
193   dnl 3.0.9 fixes generation of unnecessary _swigconstant helpers for Python.
194   dnl 3.0.12 fixes segfault on unload with PHP 7.1
195   v=`$SWIG -version 2>&1|sed 's/^SWIG Version \([[0-9\.]]*\).*/\1/p;d'`
196   case $v in
197     [[012].*|3.0.?|3.0.1[01]|""])
198       msg="SWIG >= 3.0.12 required (you have ${v:-an unknown version})"
199       if test -n "$swigoverridden" ; then
200         dnl If SWIG was explicitly set, make this a warning only.
201         AC_MSG_WARN([$msg])
202       else
203         AC_MSG_ERROR([$msg])
204       fi ;;
205   esac
206   SWIG_FLAGS=`$XAPIAN_CONFIG --swigflags`
207   AC_SUBST(SWIG_FLAGS)
208   XAPIAN_HEADER_DIRS=
209   XAPIAN_HEADERS=
210   for a in $SWIG_FLAGS ; do
211     case $a in
212     -I*)
213       d=`echo "x$a"|sed 's/^x-I//'`
214       dnl Quote each entry in XAPIAN_HEADER_DIRS with "".
215       XAPIAN_HEADER_DIRS=$XAPIAN_HEADER_DIRS' "'$d'"'
216       for f in "$d/"*.h "$d/xapian/*.h" ; do
217         if test -f "$f" ; then
218           XAPIAN_HEADERS="$XAPIAN_HEADERS $f"
219         fi
220       done
221       ;;
222     esac
223   done
224   AC_SUBST([XAPIAN_HEADER_DIRS])
225   AC_SUBST([XAPIAN_HEADERS])
227   dnl Need perl in maintainer mode to generate the except.i file for python.
228   AC_PATH_PROGS(PERL, ["${PERL-perl}"], [])
229   test -z "$PERL" && AC_MSG_ERROR([perl is required in maintainer mode])
230   dnl Need doxygen in maintainer mode to convert C++ doxygen comments to Python
231   dnl docstrings.
232   AC_PATH_PROG(DOXYGEN, doxygen, [])
233   AC_ARG_VAR([DOXYGEN], [Doxygen documentation system])
234   test -z "$DOXYGEN" && AC_MSG_ERROR([doxygen is required to build documentation])
237 AC_ARG_WITH(python,
238   AC_HELP_STRING([--with-python], [enable Python 2 bindings]),
239   [],
240   [with_python=])
242 AC_ARG_WITH(python3,
243   AS_HELP_STRING([--with-python3], [enable Python 3 bindings]),
244   [],
245   [with_python3=])
247 AC_ARG_WITH(php,
248   AC_HELP_STRING([--with-php], [enable PHP 5 bindings]),
249   [],
250   [with_php=])
252 AC_ARG_WITH(php7,
253   AS_HELP_STRING([--with-php7], [enable PHP 7 bindings]),
254   [],
255   [with_php7=])
257 AC_ARG_WITH(ruby,
258   AS_HELP_STRING([--with-ruby], [enable Ruby bindings]),
259   [],
260   [with_ruby=])
262 AC_ARG_WITH(tcl,
263   AS_HELP_STRING([--with-tcl], [enable Tcl bindings]),
264   [],
265   [with_tcl=])
267 AC_ARG_WITH(csharp,
268   AS_HELP_STRING([--with-csharp], [enable CSharp bindings]),
269   [],
270   [with_csharp=])
272 AC_ARG_WITH(java,
273   AS_HELP_STRING([--with-java], [enable Java bindings]),
274   [],
275   [with_java=])
277 AC_ARG_WITH(perl,
278   AS_HELP_STRING([--with-perl], [enable Perl bindings]),
279   [],
280   [with_perl=])
282 AC_ARG_WITH(lua,
283   AS_HELP_STRING([--with-lua], [enable Lua bindings]),
284   [],
285   [with_lua=])
287 case $with_python$with_python3$with_php$with_php7$with_ruby$with_tcl$with_csharp$with_java$with_perl$with_lua in
288 *yes*)
289   dnl Default unspecified values to no.
290   test -z "$with_python" && with_python=no
291   test -z "$with_python3" && with_python3=no
292   test -z "$with_php" && with_php=no
293   test -z "$with_php7" && with_php7=no
294   test -z "$with_tcl" && with_tcl=no
295   test -z "$with_csharp" && with_csharp=no
296   test -z "$with_java" && with_java=no
297   test -z "$with_ruby" && with_ruby=no
298   test -z "$with_perl" && with_perl=no
299   test -z "$with_lua" && with_lua=no
300   ;;
301 esac
303 BINDINGS=
305 if test no != "$with_python" ; then
306   dnl For backward compatibility:
307   : ${PYTHON2="$PYTHON"}
308   : ${PYTHON2_INC="$PYTHON_INC"}
309   : ${PYTHON2_LIB="$PYTHON_LIB"}
310   : ${PYTHON2_LIBS="$PYTHON_LIBS"}
311   : ${PYTHON2_SO="$PYTHON_SO"}
312   dnl See comment for AC_PATH_PROGS(SWIG, ...).
313   if test -n "$PYTHON2" ; then
314     AC_PATH_PROGS(PYTHON2, ["$PYTHON2"], [])
315   else
316     AC_PATH_PROGS(PYTHON2, [python2 python], [])
317   fi
318   AC_ARG_VAR(PYTHON2, [Python 2 interpreter])
319   if test -n "$PYTHON2" ; then
320     dnl Require Python 2.6 or newer.  Older versions are essentially
321     dnl unsupported upstream.
322     AC_MSG_CHECKING([$PYTHON2 version])
323     version=`$PYTHON2 -c 'import sys;print("%d.%d" % sys.version_info[[:2]])' 2>/dev/null`
324     case $version in
325     [2.[6-9]*|2.[1-5][0-9]*])
326       AC_MSG_RESULT([$version])
327       ;;
328     [[3-9].*])
329       AC_MSG_RESULT([$version (too new - use --with-python3 for Python 3 support)])
330       if test yes = "$with_python" ; then
331         AC_MSG_ERROR([Use --with-python3 for Python 3 support ($PYTHON2 is $version)])
332       fi
333       PYTHON2=
334       ;;
335     *)
336       AC_MSG_RESULT([$version (too old)])
337       if test yes = "$with_python" ; then
338         AC_MSG_ERROR([Only Python 2.6 or newer is supported ($PYTHON2 is $version)])
339       fi
340       PYTHON2=
341       ;;
342     esac
343     if test -n "$PYTHON2" ; then
344       if $PYTHON2 -c 'import distutils.sysconfig' 2>/dev/null ; then
345         PYTHON2_INC=`$PYTHON2 -c 'import os,distutils.sysconfig;print(distutils.sysconfig.get_python_inc().replace(os.sep,"/"))'`
346         AC_SUBST(PYTHON2_INC)
347       else
348         if test yes = "$with_python" ; then
349           AC_MSG_ERROR([Couldn't import Python module distutils.sysconfig - you probably need to install a python-dev or python-devel package])
350         else
351           AC_MSG_WARN([Couldn't import Python module distutils.sysconfig - you probably don't have a python-dev or python-devel package installed])
352           PYTHON2=
353         fi
354       fi
355     fi
356     AC_MSG_CHECKING([for python2 sphinx module])
357     if $PYTHON2 -c 'import sphinx;print(repr(sphinx.main))' >&5 2>&5 ; then
358       AC_MSG_RESULT([yes])
359     else
360       AC_MSG_RESULT([no])
361       if test yes = "$with_python" ; then
362         AC_MSG_ERROR([Couldn't import sphinx module and call sphinx.main() for Python2 - try package python-sphinx])
363       fi
364       PYTHON2=
365     fi
366     if test -n "$PYTHON2" ; then
367       dnl Check that Python.h is there, which is a good way to check that
368       dnl the appropriate python-dev package has been installed.
369       AC_MSG_CHECKING([for $PYTHON2_INC/Python.h])
370       if test -f "$PYTHON2_INC/Python.h" ; then
371         AC_MSG_RESULT(yes)
372         AC_MSG_CHECKING([for directory to install python2 bindings in])
373         if test -z "$PYTHON2_LIB" ; then
374           PYTHON2_LIB=`$PYTHON2 -c 'import os,distutils.sysconfig;print(distutils.sysconfig.get_python_lib(1).replace(os.sep,"/"))'`
375         fi
376         AC_MSG_RESULT([$PYTHON2_LIB])
377         AC_ARG_VAR(PYTHON2_LIB, [Directory to install python2 bindings in])
379         AC_MSG_CHECKING([for python2 libraries to link against])
380         case $host_os in
381         mingw* | pw32*)
382           PYTHON2_LIBS=`$PYTHON2 -c 'import os,sys;print("-L"+os.path.join(sys.prefix,"libs").replace(os.sep,"/")+" -lpython"+sys.version[[:3]].replace(".",""))'` ;;
383         cygwin*)
384           PYTHON2_LIBS=`$PYTHON2 -c 'import os,sys;print("-L"+os.path.join(sys.path[[3]],"config")+" -lpython"+sys.version[[:3]])'` ;;
385         *)
386           PYTHON2_LIBS= ;;
387         esac
388         AC_SUBST(PYTHON2_LIBS)
389         AC_MSG_RESULT([$PYTHON2_LIBS])
391         AC_MSG_CHECKING([for python2 module extension])
392         dnl Usually ".so", but for example, Mac OS X uses ".dylib".
393         PYTHON2_SO=`$PYTHON2 -c 'import distutils.sysconfig;print(distutils.sysconfig.get_config_vars("SO")[[0]])'`
394         AC_SUBST(PYTHON2_SO)
395         AC_MSG_RESULT([$PYTHON2_SO])
396         BINDINGS="$BINDINGS python"
397       else
398         AC_MSG_RESULT([no (install python-dev or python-devel package or similar)])
399         if test yes = "$with_python" ; then
400           AC_MSG_ERROR([Python.h not found])
401         fi
402       fi
403     fi
404   fi
407 if test no != "$with_python3" ; then
408   dnl See comment for AC_PATH_PROGS(SWIG, ...).
409   if test -n "$PYTHON3" ; then
410     AC_PATH_PROGS(PYTHON3, ["$PYTHON3"], [])
411   else
412     AC_PATH_PROGS(PYTHON3, [python3 python], [])
413   fi
414   AC_ARG_VAR(PYTHON3, [Python 3 interpreter])
415   if test -n "$PYTHON3" ; then
416     dnl Require Python 3.2 or newer, as that's the oldest version we can
417     dnl easily test with.  If anyone's keen to support older versions, please
418     dnl test and send in any patches needed to get it to work.
419     AC_MSG_CHECKING([$PYTHON3 version])
420     version=`$PYTHON3 -c 'import sys;print("%d.%d" % sys.version_info[[:2]])' 2>/dev/null`
421     case $version in
422     [3.[2-9]*|3.1[0-9]*|[4-9].*])
423       AC_MSG_RESULT([$version])
424       ;;
425     *)
426       AC_MSG_RESULT([$version (too old)])
427       if test yes = "$with_python3" ; then
428         AC_MSG_ERROR([Only Python 3.2 or newer is supported ($python3 is $version)])
429       fi
430       PYTHON3=
431       ;;
432     esac
433     if test -n "$PYTHON3" ; then
434       PYTHON3_INC=`$PYTHON3 -c 'import os,sysconfig;print(sysconfig.get_path("include").replace(os.sep,"/"))' 2>/dev/null`
435       AC_SUBST(PYTHON3_INC)
436     fi
437     AC_MSG_CHECKING([for python3 sphinx module])
438     if $PYTHON3 -c 'import sphinx' >&5 2>&5 ; then
439       AC_MSG_RESULT([yes])
440     else
441       AC_MSG_RESULT([no])
442       if test yes = "$with_python3" ; then
443         AC_MSG_ERROR([Couldn't import sphinx module for Python3 - try package python3-sphinx])
444       fi
445       PYTHON3=
446     fi
447     if test -n "$PYTHON3" ; then
448       dnl Check that Python.h is there, which is a good way to check that
449       dnl the appropriate python3-dev package has been installed.
450       AC_MSG_CHECKING([for $PYTHON3_INC/Python.h])
451       if test -f "$PYTHON3_INC/Python.h" ; then
452         AC_MSG_RESULT(yes)
453         AC_MSG_CHECKING([for directory to install python3 bindings in])
454         if test -z "$PYTHON3_LIB" ; then
455           PYTHON3_LIB=`$PYTHON3 -c 'import os,sysconfig;print(sysconfig.get_path("platlib").replace(os.sep,"/"))'`
456         fi
457         AC_MSG_RESULT([$PYTHON3_LIB])
458         AC_ARG_VAR(PYTHON3_LIB, [Directory to install python3 bindings in])
460         AC_MSG_CHECKING([for python3 libraries to link against])
461         case $host_os in
462         mingw* | pw32*)
463           PYTHON3_LIBS=`$PYTHON3 -c 'import os,sys;print("-L"+os.path.join(sys.prefix,"libs").replace(os.sep,"/")+" -lpython"+sys.version[[:3]].replace(".",""))'` ;;
464         cygwin*)
465           PYTHON3_LIBS=`$PYTHON3 -c 'import os,sys;print("-L"+os.path.join(sys.path[[3]],"config")+" -lpython"+sys.version[[:3]])'` ;;
466         *)
467           PYTHON3_LIBS= ;;
468         esac
469         AC_SUBST(PYTHON3_LIBS)
470         AC_MSG_RESULT([$PYTHON3_LIBS])
472         AC_MSG_CHECKING([for python3 module extension])
473         dnl Encodes the Python version the module is built for, and ends with
474         dnl the platform-dependent shared object extension (which is `.so` on
475         dnl most Unix-like platforms) - e.g. `.cpython-310-x86_64-linux-gnu.so`
476         PYTHON3_EXT_SUFFIX=`$PYTHON3 -c 'import sysconfig;print(sysconfig.get_config_var("EXT_SUFFIX"))'`
477         AC_SUBST(PYTHON3_EXT_SUFFIX)
478         AC_MSG_RESULT([$PYTHON3_EXT_SUFFIX])
480         AC_MSG_CHECKING([for tag for cached compiled scripts])
481         dnl Since Python 3.3 sys.implementation.cache_tag is the preferred option here,
482         dnl and the old approach issues deprecation warnings since Python 3.7.
483         dnl
484         dnl This needs a shell-level || because Python one line program support is poor.
485         PYTHON3_CACHE_TAG=`$PYTHON3 -c 'import sys;print(sys.implementation.cache_tag)' 2>/dev/null || $PYTHON3 -c 'import imp;print(imp.get_tag())'`
486         AC_SUBST(PYTHON3_CACHE_TAG)
487         AC_MSG_RESULT([$PYTHON3_CACHE_TAG])
489         AC_MSG_CHECKING([for extension of cached and optimized python3 bytecode])
490         dnl We use -O instead of cache_from_source()'s optimization parameter
491         dnl as the latter was only added in Python 3.5.  The fallback is needed
492         dnl as cache_from_source() itself is new in Python 3.4.
493         dnl
494         dnl Some Python versions (or maybe packages) need us to explicitly
495         dnl `import importlib.util` here, but others work without it.
496         dnl
497         dnl This needs a shell-level || because Python one line program support
498         dnl is poor.
499         PYTHON3_CACHE_OPT1_EXT=`$PYTHON3 -O -c 'import importlib,importlib.util,sys;print("{1}{2}".format(*importlib.util.cache_from_source("").rpartition(sys.implementation.cache_tag)))' 2>/dev/null || $PYTHON3 -c 'import imp;print(imp.get_tag()+".pyo")'`
500         AC_SUBST(PYTHON3_CACHE_OPT1_EXT)
501         AC_MSG_RESULT([$PYTHON3_CACHE_OPT1_EXT])
503         BINDINGS="$BINDINGS python3"
504       else
505         AC_MSG_RESULT([no (install python3-dev or python3-devel package or similar)])
506         if test yes = "$with_python3" ; then
507           AC_MSG_ERROR([Python.h not found])
508         fi
509       fi
510     fi
511   fi
514 if test x$USE_MAINTAINER_MODE = xyes; then
515   dnl Need python in maintainer mode to run doxy2swig.py.
516   dnl Either Python 2 or 3 is OK for this.
517   if test -n "$PYTHON2" ; then
518     PYTHON=$PYTHON2
519   elif test -n "$PYTHON3" ; then
520     PYTHON=$PYTHON3
521   else
522     AC_PATH_PROGS(PYTHON, [python2 python python3], [])
523   fi
524   test -z "$PYTHON" && AC_MSG_ERROR([python is required in maintainer mode])
527 if test no != "$with_php" ; then
528   dnl See comment for AC_PATH_PROGS(SWIG, ...).
529   if test -n "$PHP_CONFIG" ; then
530     AC_PATH_PROGS(PHP_CONFIG, ["$PHP_CONFIG"], [])
531   fi
532   if test -z "$PHP_CONFIG" ; then
533     AC_PATH_PROGS(PHP_CONFIG, [php-config5 php-config5.6 php-config5.5 php-config], [])
534   fi
535   AC_ARG_VAR(PHP_CONFIG, [php-config utility for PHP5])
536   AC_ARG_VAR(PHP, [PHP5 interpreter (optional - only needed to run PHP5 testsuite with)])
537   if test -n "$PHP_CONFIG" ; then
538     AC_MSG_CHECKING([$PHP_CONFIG version])
539     version=`$PHP_CONFIG --version 2>/dev/null`
540     case $version in
541     dnl 5.6 was the final PHP5 release.
542     5.5.*|5.6.*)
543       AC_MSG_RESULT([$version])
544       PHP_MAJOR_VERSION=`echo "$version"|cut -d. -f1`
545       ;;
546     *)
547       AC_MSG_RESULT([$version (not supported, PHP5 bindings need PHP 5.x where x >= 5)])
548       if test yes = "$with_php" ; then
549         AC_MSG_ERROR([$PHP_CONFIG reports version $version - PHP5 bindings need PHP 5.x where x >= 5])
550       fi
551       with_php=no
552       ;;
553     esac
554     AC_SUBST(PHP_MAJOR_VERSION)
556     if test no != "$with_php" ; then
557       AC_MSG_CHECKING([for PHP5 extension directory])
558       if test -z "$PHP_EXTENSION_DIR" ; then
559         PHP_EXTENSION_DIR=`$PHP_CONFIG --extension-dir`
560       fi
561       AC_MSG_RESULT([$PHP_EXTENSION_DIR])
562       AC_ARG_VAR(PHP_EXTENSION_DIR, [Directory to install PHP5 extensions in])
563     fi
565     if test no != "$with_php" ; then
566       PHP_INC=`$PHP_CONFIG --includes`
567       AC_SUBST(PHP_INC)
568       save_CPPFLAGS=$CPPFLAGS
569       CPPFLAGS="$CPPFLAGS $PHP_INC"
570       dnl One of SGI's SuSE boxes has php-config but no headers.
571       AC_CHECK_HEADER(zend.h, [], [
572         if test yes = "$with_php" ; then
573           AC_MSG_ERROR(['$PHP_CONFIG --includes' reports '$PHP_INC' but zend.h can't be included from there])
574         fi
575         with_php=no], [ ])
576       CPPFLAGS=$save_CPPFLAGS
577     fi
579     if test no != "$with_php" ; then
580       if test x"$PHP" = x ; then
581         AC_MSG_CHECKING([for PHP5 interpreter])
582         dnl PHP5's php-config supports --php-binary, so just use that.
583         PHP=`$PHP_CONFIG --php-binary 2>/dev/null`
584         if test x"$PHP" != x ; then
585           if $PHP -r 'exit(0);' 2> /dev/null ; then
586             if $PHP -r 'exit(PHP_MAJOR_VERSION==5?0:1);' 2> /dev/null ; then
587               AC_MSG_RESULT([$PHP])
588             else
589               dnl We get /usr/bin/php on Debian, which might be PHP7:
590               dnl https://bugs.debian.org/819139
591               if ${PHP}5 -r 'exit(PHP_MAJOR_VERSION==5?0:1);' 2> /dev/null ; then
592                 PHP=${PHP}5
593                 AC_MSG_RESULT([$PHP])
594               else
595                 AC_MSG_RESULT([no ($PHP isn't PHP5)])
596                 PHP=
597               fi
598             fi
599           else
600             AC_MSG_RESULT([no ($PHP does not work)])
601             PHP=
602           fi
603         else
604           AC_MSG_RESULT([not found])
605         fi
606       else
607         AC_PATH_PROGS(PHP, ["$PHP"], [])
608       fi
609       if test x"$PHP" = x ; then
610         AC_MSG_WARN([No PHP5 interpreter found - PHP5 bindings tests will be skipped])
611         dnl The skiptest script just returns exit code 77.
612         PHP='$(top_srcdir)/skiptest'
613       else
614         AC_MSG_CHECKING([for PHP5 path separator])
615         PHP_PATH_SEPARATOR=`$PHP -r 'echo PATH_SEPARATOR;'`
616         AC_SUBST([PHP_PATH_SEPARATOR])
617         AC_MSG_RESULT([$PHP_PATH_SEPARATOR])
618       fi
620       case $host_os in
621       mingw* | pw32*)
622         dnl This is a bit of an informed guess, pending more information from
623         dnl someone who actually has mingw and wants to build the PHP bindings
624         dnl there.  FIXME.
625         PHP_LIBS="-L`$PHP_CONFIG --prefix` -lphp${PHP_MAJOR_VERSION}ts" ;;
626       cygwin*)
627         PHP_LIBS="-lphp${PHP_MAJOR_VERSION}lib" ;;
628       *)
629         PHP_LIBS= ;;
630       esac
631       AC_SUBST(PHP_LIBS)
632       BINDINGS="$BINDINGS php"
633     fi
634   fi
637 if test no != "$with_php7" ; then
638   dnl See comment for AC_PATH_PROGS(SWIG, ...).
639   if test -n "$PHP_CONFIG7" ; then
640     AC_PATH_PROGS(PHP_CONFIG7, ["$PHP_CONFIG7"], [])
641   fi
642   if test -z "$PHP_CONFIG7" ; then
643     AC_PATH_PROGS(PHP_CONFIG7, [php-config7.4 php-config7.3 php-config7.2 php-config7.1 php-config7.0 php-config], [])
644   fi
645   AC_ARG_VAR(PHP_CONFIG7, [php-config utility for PHP7])
646   AC_ARG_VAR(PHP7, [PHP7 interpreter (optional - only needed to run PHP7 testsuite with)])
647   if test -n "$PHP_CONFIG7" ; then
648     AC_MSG_CHECKING([$PHP_CONFIG7 version])
649     version=`$PHP_CONFIG7 --version 2>/dev/null`
650     case $version in
651     [[0123456].*])
652       AC_MSG_RESULT([$version (not supported, PHP7 bindings need PHP 7.x)])
653       if test yes = "$with_php7" ; then
654         AC_MSG_ERROR([$PHP_CONFIG7 reports version $version - PHP7 bindings need 7.x])
655       fi
656       with_php7=no
657       ;;
658     7.*)
659       AC_MSG_RESULT([$version])
660       PHP7_MAJOR_VERSION=`echo "$version"|cut -d. -f1`
661       ;;
662     *)
663       AC_MSG_RESULT([$version (PHP >= 8.0 isn't yet supported)])
664       if test yes = "$with_php7" ; then
665         AC_MSG_ERROR([$PHP_CONFIG7 reports version $version - PHP7 bindings need 7.x])
666       fi
667       with_php7=no
668       ;;
669     esac
670     AC_SUBST(PHP7_MAJOR_VERSION)
672     if test no != "$with_php7" ; then
673       AC_MSG_CHECKING([for PHP7 extension directory])
674       if test -z "$PHP7_EXTENSION_DIR" ; then
675         PHP7_EXTENSION_DIR=`$PHP_CONFIG7 --extension-dir`
676       fi
677       AC_MSG_RESULT([$PHP7_EXTENSION_DIR])
678       AC_ARG_VAR(PHP7_EXTENSION_DIR, [Directory to install PHP7 extensions in])
679     fi
681     if test no != "$with_php7" ; then
682       PHP7_INC=`$PHP_CONFIG7 --includes`
683       AC_SUBST(PHP7_INC)
684     fi
686     if test no != "$with_php7" ; then
687       if test x"$PHP7" = x ; then
688         AC_MSG_CHECKING([for PHP7 interpreter])
689         dnl PHP7's php-config supports --php-binary, so just use that.
690         PHP7=`$PHP_CONFIG7 --php-binary 2>/dev/null`
691         if test x"$PHP7" != x ; then
692           if $PHP7 -r 'exit(0);' 2> /dev/null ; then
693             if $PHP7 -r 'exit(PHP_MAJOR_VERSION==7?0:1);' 2> /dev/null ; then
694               AC_MSG_RESULT([$PHP7])
695             else
696               AC_MSG_RESULT([no ($PHP7 isn't PHP7)])
697               PHP7=
698             fi
699           else
700             AC_MSG_RESULT([no ($PHP7 does not work)])
701             PHP7=
702           fi
703         else
704           AC_MSG_RESULT([not found])
705         fi
706       else
707         AC_PATH_PROGS(PHP7, ["$PHP7"], [])
708       fi
709       if test x"$PHP7" = x ; then
710         AC_MSG_WARN([No PHP7 interpreter found - PHP7 bindings tests will be skipped])
711         dnl The skiptest script just returns exit code 77.
712         PHP7='$(top_srcdir)/skiptest'
713       else
714         AC_MSG_CHECKING([for PHP7 path separator])
715         PHP7_PATH_SEPARATOR=`$PHP7 -r 'echo PATH_SEPARATOR;'`
716         AC_SUBST([PHP7_PATH_SEPARATOR])
717         AC_MSG_RESULT([$PHP7_PATH_SEPARATOR])
718       fi
720       case $host_os in
721       mingw* | pw32*)
722         dnl This is a bit of an informed guess, pending more information from
723         dnl someone who actually has mingw and wants to build the PHP bindings
724         dnl there.  FIXME.
725         PHP7_LIBS="-L`$PHP_CONFIG7 --prefix` -lphp${PHP7_MAJOR_VERSION}ts" ;;
726       cygwin*)
727         PHP7_LIBS="-lphp${PHP7_MAJOR_VERSION}lib" ;;
728       *)
729         PHP7_LIBS= ;;
730       esac
731       AC_SUBST(PHP7_LIBS)
732       BINDINGS="$BINDINGS php7"
733     fi
734   fi
737 if test no != "$with_tcl" ; then
738   dnl The documented minimum requirement is Tcl 8.5.  Older versions may work,
739   dnl but we don't test with them regularly, and they are no longer supported
740   dnl upstream.  Also ::tcl::pckconfig was added in Tcl 8.5, which makes the
741   dnl tests below simpler and more reliable.
742   dnl
743   dnl If you really want to build with an older version, run configure with
744   dnl a lower tcl_min and specify at least TCL_INC explicitly:
745   dnl
746   dnl ./configure tcl_min=8.4 TCL_INC=/usr/include/tcl8.4
747   dnl
748   dnl We definitely need at least Tcl 8.1 for TCL_STUBS.
749   : ${tcl_min=8.5}
750   AC_PATH_PROGS(TCLSH, ["${TCLSH-tclsh}"], [])
751   AC_ARG_VAR(TCLSH, [Tcl interpreter])
752   if test -n "$TCLSH" ; then
753     AC_MSG_CHECKING([$TCLSH version])
754     if echo 'if {$tcl_version < '"$tcl_min"' } { exit 1 }'|$TCLSH 2> /dev/null ; then
755       tcl_version=`echo 'puts "$tcl_version"'|$TCLSH`
756       AC_MSG_RESULT([$tcl_version])
758       AC_ARG_VAR(TCL_LIB, [Directory to install Tcl files into])
759       if test -z "$TCL_LIB" ; then
760         [TCL_LIB=`echo 'foreach d $tcl_pkgPath {if {![regexp {/share(/|$)} $d]} {break}};puts $d'|$TCLSH`]
761       fi
762       AC_SUBST(TCL_LIB)
764       AC_ARG_VAR([TCL_INC], [Directory to include for Tcl headers])
765       if test -z "$TCL_INC" ; then
766         dnl ::tcl::pkgconfig was added in Tcl 8.5.
767         [TCL_INC=`echo 'puts [::tcl::pkgconfig get includedir,runtime]'|$TCLSH 2> /dev/null`]
768       fi
770       dnl Check that the headers are there (the tcl8.N-dev package
771       dnl may not be installed).
772       TCL_CPPFLAGS=
773       AC_MSG_CHECKING([for tcl.h from Tcl $tcl_version])
774       if test x"$TCL_INC" != x && test -f "$TCL_INC/tcl.h" ; then
775         tcl_hdr_version=`awk '($1 == "#define" && $2 == "TCL_VERSION") {print $3}' "$TCL_INC/tcl.h"|sed 's/"//g'`
776         if test x"$tcl_hdr_version" = x"$tcl_version" ; then
777           AC_MSG_RESULT([$TCL_INC/tcl.h])
778           BINDINGS="$BINDINGS tcl8"
779           if test x"$TCL_INC" != x"/usr/include" ; then
780             TCL_CPPFLAGS="-I$TCL_INC"
781           fi
782         else
783           AC_MSG_RESULT([not found])
784           if test yes = "$with_tcl" ; then
785             AC_MSG_ERROR([Found tcl.h from version $tcl_hdr_version, not $tcl_version - specify TCL_INC on configure command line])
786           fi
787           TCLSH=
788         fi
789       else
790         AC_MSG_RESULT([not found])
791         if test yes = "$with_tcl" ; then
792           AC_MSG_ERROR([Can't find tcl.h])
793         fi
794         TCLSH=
795       fi
797       if test -n "$TCLSH" ; then
798         dnl Cygwin needs to link with -ltcl8.5 or similar.
799         TCL_LIBS=
800         case $host_os in
801         cygwin*)
802           AC_CHECK_LIB([tcl$tcl_version], [Tcl_Init],
803                        [TCL_LIBS="-ltcl$tcl_version"],
804                        [AC_MSG_ERROR([libtcl$tcl_version not found])])
805           ;;
806         *)
807           dnl ::tcl::pkgconfig was added in Tcl 8.5, but prior to 8.6 it isn't
808           dnl necessary to link against -ltclstub anyway.
809           [tcl_libdir_runtime=`echo 'puts [::tcl::pkgconfig get libdir,runtime]'|$TCLSH 2> /dev/null`]
810           if test -n "$tcl_libdir_runtime" ; then
811             for x in "/tcl$tcl_version" "" ; do
812               TCLCONFIG_SH=$tcl_libdir_runtime$x/tclConfig.sh
813               if test -r "$TCLCONFIG_SH" ; then
814                 eval "`sed 's/^TCL_STUB_LIB_SPEC=/TCL_LIBS=/p;d' $TCLCONFIG_SH`"
815                 break
816               fi
817             done
818           fi
819           TCL_CPPFLAGS="$TCL_CPPFLAGS -DUSE_TCL_STUBS" ;;
820         esac
821       fi
823       AC_SUBST(TCL_CPPFLAGS)
824       AC_SUBST(TCL_LIBS)
825     else
826       AC_MSG_RESULT([< $tcl_min (too old)])
827       if test yes = "$with_tcl" ; then
828         AC_MSG_ERROR([$TCLSH too old (Tcl $tcl_min or newer required)])
829       fi
830     fi
831   else
832     if test yes = "$with_tcl" ; then
833       AC_MSG_ERROR([tclsh not found])
834     fi
835   fi
838 if test no != "$with_csharp" ; then
839   csc_note=
840   AC_ARG_VAR(CSC, [CSharp compiler command])
841   if test -n "$CSC" ; then
842     AC_PATH_PROGS(CSC, ["$CSC"], [])
843   fi
844   if test -z "$CSC" ; then
845     dnl First we try cli-csc and mono-csc, which are used by Debian and Ubuntu
846     dnl as "alternatives" which can be mapped to the CSharp compiler the admin
847     dnl favours.
848     AC_PATH_PROGS(CSC, [cli-csc mono-csc], [])
849     if test -z "$CSC" ; then
850       dnl mcs is the Mono CSharp compiler, which is a unified compiler
851       dnl available from Mono 2.11 (and also the compiler in Mono 1.0, but
852       dnl that's no longer relevant).
853       AC_PATH_PROGS(CSC, [mcs], [])
854       if test -n "$CSC" ; then
855         dnl There are other tools called mcs (such as /usr/bin/mcs on Tru64),
856         dnl so we check that the mcs we found understands --version which is
857         dnl sufficient to distinguish mono's mcs from the Tru64 one.
858         AC_MSG_CHECKING([whether $CSC is from GNU Mono])
859         if (exec >&5 2>&5;$CSC --version </dev/null;exit $?) ; then
860           AC_MSG_RESULT(yes)
861         else
862           AC_MSG_RESULT(no)
863           CSC=
864           csc_note="$csc_note (found different mcs program)"
865         fi
866       fi
867     fi
868     if test -z "$CSC" ; then
869       dnl csc is the Microsoft CSharp compiler.
870       AC_PATH_PROGS(CSC, [csc], [])
871       if test -n "$CSC" ; then
872         dnl Chicken (the Scheme-to-C compiler) includes a tool called csc so we
873         dnl check if the output from "csc -version" includes the word chicken
874         dnl which is sufficient to distinguish Chicken's csc from Microsoft's
875         dnl csc.exe.
876         AC_MSG_CHECKING([whether $CSC is for CSharp])
877         if $CSC -version 2>/dev/null|grep chicken > /dev/null ; then
878           AC_MSG_RESULT(no)
879           CSC=
880           csc_note="$csc_note (found Chicken csc program)"
881         else
882           AC_MSG_RESULT(yes)
883         fi
884       fi
885     fi
886   fi
888   if test -n "$CSC" ; then
889     AC_ARG_VAR(GACUTIL, [gacutil utility to use for CSharp bindings])
890     if test -n "$GACUTIL" ; then
891       AC_PATH_PROGS(GACUTIL, ["$GACUTIL"], [])
892     fi
893     if test -z "$GACUTIL" ; then
894       AC_PATH_PROGS(GACUTIL, [cli-gacutil gacutil], [])
895     fi
897     AC_ARG_VAR(SN, [sn utility to use for CSharp bindings])
898     if test -n "$SN" ; then
899       AC_PATH_PROGS(SN, ["$SN"], [])
900     fi
901     if test -z "$SN" ; then
902       AC_PATH_PROGS(SN, [cli-sn sn], [])
903     fi
904     if test -n "$GACUTIL" -a -n "$SN" ; then
905       AC_MSG_CHECKING([whether the CSharp compiler works])
906       [echo 'class conftest { public static void Main() { System.Console.WriteLine("OK"); } }' > conftest.cs]
907       if (exec >&5 2>&5;$CSC /out:conftest.exe conftest.cs;exit $?) ; then
908         AC_MSG_RESULT(yes)
909         AC_MSG_CHECKING([whether CSharp programs can just be run])
910         if test OK = "`./conftest.exe 2> /dev/null`" ; then
911           AC_MSG_RESULT(yes)
912           RUN_CSHARP=
913         else
914           AC_MSG_RESULT(no)
915           AC_PATH_PROGS(CLI, ["${CLI-cli}"], [])
916           if test -z "$CLI" ; then
917             AC_PATH_PROGS(CLI, [mono ilrun], [])
918           fi
919           AC_ARG_VAR(CLI, [CSharp bytecode interpreter (optional - only needed to run CSharp testsuite with)])
920           if test -n "$CLI" ; then
921             AC_MSG_CHECKING([whether $CLI can run CSharp programs])
922             if test OK = "`$CLI ./conftest.exe 2> /dev/null`" ; then
923               AC_MSG_RESULT(yes)
924               RUN_CSHARP=$CLI
925             else
926               AC_MSG_RESULT([no - CSharp tests will be skipped])
927               RUN_CSHARP='\$(top_srcdir)/skiptest'
928             fi
929           else
930             AC_MSG_RESULT([not found - CSharp tests will be skipped])
931             RUN_CSHARP='\$(top_srcdir)/skiptest'
932           fi
933         fi
934         AC_SUBST(RUN_CSHARP)
936         AC_MSG_CHECKING([for extra flags for $GACUTIL])
937         GACUTIL_FLAGS='/package $(ASSEMBLY) /gacdir $(libdir) /root $(DESTDIR)$(libdir)'
938         dnl Microsoft's gacutil accepts fewer options than Mono's
939         $GACUTIL /\?|grep '\<Mono\>' >/dev/null || GACUTIL_FLAGS=
940         AC_SUBST([GACUTIL_FLAGS])
941         if test -z "$GACUTIL_FLAGS" ; then
942           AC_MSG_RESULT([no])
943         else
944           AC_MSG_RESULT([$GACUTIL_FLAGS])
945         fi
947         BINDINGS="$BINDINGS csharp"
948       else
949         AC_MSG_RESULT(no)
950         if test yes = "$with_csharp" ; then
951           AC_MSG_ERROR([CSharp compiler $CSC doesn't work])
952         fi
953       fi
954     else
955       if test yes = "$with_csharp" ; then
956         if test -z "$GACUTIL" ; then
957           AC_MSG_ERROR([Mono gacutil not found])
958         elif test -z "$SN" ; then
959           AC_MSG_ERROR([Mono sn not found])
960         fi
961       fi
962     fi
963   else
964     if test yes = "$with_csharp" ; then
965       AC_MSG_ERROR([CSharp compiler not found$csc_note])
966     fi
967   fi
970 JAVA_CPPFLAGS=
971 if test no != "$with_java" ; then
972   AC_PATH_PROGS(JAVA, ["${JAVA-java}"], [],
973         [${JAVA_HOME+$JAVA_HOME/bin:}${JDK_HOME+$JDK_HOME/bin:}$PATH])
974   AC_PATH_PROGS(JAVAC, ["${JAVAC-javac}"], [],
975         [${JAVA_HOME+$JAVA_HOME/bin:}${JDK_HOME+$JDK_HOME/bin:}$PATH])
976   AC_PATH_PROGS(JAR, ["${JAR-jar}"], [],
977         [${JAVA_HOME+$JAVA_HOME/bin:}${JDK_HOME+$JDK_HOME/bin:}$PATH])
978   AC_ARG_VAR(JAVA, [Java interpreter command])
979   AC_ARG_VAR(JAVAC, [Java compiler command])
980   AC_ARG_VAR(JAR, [java jar utility])
981   AC_ARG_VAR(JAVA_HOME, [Pathname of the directory where the JDK is installed])
982   AC_ARG_VAR(JDK_HOME, [Pathname of the directory where the JDK is installed])
983   AC_ARG_VAR(JNI_INCLUDE_DIR, [Pathname of the directory where jni.h is installed])
984   if test -n "$JAVA" -a -n "$JAVAC" -a -n "$JAR" ; then
985     dnl Eric says:
986     dnl  The JNI library *requires* "Java 2", which is 1.2 or better.
987     dnl
988     dnl So checking for jni.h presumably implicitly checks we have "Java 2".
989     dnl Note: jni.h #defines JNI_VERSION_1_[12468] (but not 3, 5 or 7 it seems).
990     dnl So we could check for one of these if we want to check for a particular
991     dnl JDK version...
992     java_ok=no
993     AC_CHECK_HEADER([jni.h], [java_ok=yes], [
994       dnl We need to look for jni.h in /usr/lib/jvm/java-gcj/include on some
995       dnl Debian and Ubuntu boxes at least.  And on Mac OS X, jni.h lives
996       dnl in /System/Library/Frameworks/JavaVM.framework/Headers.
997       SAVE_CPPFLAGS=$CPPFLAGS
998       real_javac=$JAVAC
999       dnl Avoid endlessly traversing if there's a symlink loop.
1000       for count in 1 2 3 4 5 6 7 8 9 ; do
1001         r=`readlink "$real_javac"`
1002         test -n "$r" || break
1003         real_javac=$r
1004       done
1005       dnl Translate ".../bin/javac" to ".../include".
1006       [rel_jnidir=`echo "$real_javac"|sed 's!/[^/]*/[^/]*$!/include!'`]
1007       for jnidir in \
1008           $JNI_INCLUDE_DIR \
1009           ${JAVA_HOME+"$JAVA_HOME/include"} \
1010           ${JDK_HOME+"$JDK_HOME/include"} \
1011           "$rel_jnidir" \
1012           /System/Library/Frameworks/JavaVM.framework/Headers ; do
1013         CPPFLAGS="$SAVE_CPPFLAGS -I$jnidir"
1014         AC_MSG_CHECKING([for jni.h in $jnidir])
1015         if test -f "$jnidir/jni.h" ; then
1016           AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <jni.h>]])], [java_ok=yes])
1017           if test yes = $java_ok ; then
1018             AC_MSG_RESULT([yes])
1019             JAVA_CPPFLAGS=-I$jnidir
1020             break
1021           fi
1023           dnl For OpenJDK (and maybe others) we have to specify an extra -I
1024           dnl option for an OS-specific subdirectory containing a "jni_md.h"
1025           dnl header which is included by "jni.h".  Sadly we seem to need to
1026           dnl hardcode a mapping for these platform names - the list below
1027           dnl was determined by inspecting the source code of OpenJDK 8.
1028           jni_host_os=
1029           case $host_os in
1030             linux*)
1031               jni_host_os=linux ;;
1032             solaris*)
1033               jni_host_os=solaris ;;
1034             mingw* | pw32* | cygwin*)
1035               jni_host_os=win32 ;;
1036             darwin*)
1037               jni_host_os=darwin ;;
1038             *bsd*)
1039               jni_host_os=bsd ;;
1040             aix*)
1041               jni_host_os=aix ;;
1042           esac
1043           if test -n "$jni_host_os" ; then
1044             CPPFLAGS="$CPPFLAGS -I$jnidir/$jni_host_os"
1045             AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <jni.h>]])], [java_ok=yes])
1046             if test yes = $java_ok ; then
1047               AC_MSG_RESULT([yes, requires additional -I$jnidir/$jni_host_os])
1048               JAVA_CPPFLAGS="-I$jnidir -I$jnidir/$jni_host_os"
1049               break
1050             fi
1051           fi
1052           AC_MSG_RESULT([found, but not usable])
1054           CPPFLAGS="$SAVE_CPPFLAGS -I$jnidir"
1055         else
1056           AC_MSG_RESULT([no])
1057         fi
1058       done
1059       CPPFLAGS=$SAVE_CPPFLAGS
1060       test noyes = $java_ok$with_java && AC_MSG_ERROR([jni.h not found])
1061       ], [ ])
1062     AC_SUBST(JAVA_CPPFLAGS)
1063     if test yes = $java_ok ; then
1064       AC_MSG_CHECKING([for Java path separator])
1065       [echo 'public class conftest { public static void main(String[] args) { System.out.println(System.getProperty("path.separator")); } }' > conftest.java]
1066       if (exec >&5 2>&5;$JAVAC conftest.java;exit $?) ; then
1067         JAVA_PATHSEP=`$JAVA conftest 2>&5`
1068         AC_SUBST(JAVA_PATHSEP)
1069         if test -n "$JAVA_PATHSEP" ; then
1070           AC_MSG_RESULT($JAVA_PATHSEP)
1071           BINDINGS="$BINDINGS java"
1073           dnl If -Xcheck:jni is supported then run tests with it.
1074           dnl
1075           dnl ... except that with OpenJDK 8 and 9 -Xcheck:jni seems to report
1076           dnl false positives and so can't usefully be turned on in this
1077           dnl situation.  Recheck this with future versions.
1078 dnl       AC_MSG_CHECKING([for $JAVA -Xcheck:jni option])
1079 dnl       JAVA_PATHSEP2=`$JAVA conftest 2>&5`
1080           JAVA_CHECK_JNI_OPTION=
1081 dnl       if test "$JAVA_PATHSEP" = "$JAVA_PATHSEP2" ; then
1082 dnl         JAVA_CHECK_JNI_OPTION=-Xcheck:jni
1083 dnl         AC_MSG_RESULT([yes])
1084 dnl       else
1085 dnl         AC_MSG_RESULT([no])
1086 dnl       fi
1087           AC_SUBST([JAVA_CHECK_JNI_OPTION])
1088         else
1089           AC_MSG_RESULT([failed to run test program])
1090           java_ok=no
1091         fi
1092       else
1093         AC_MSG_RESULT([failed to compile test program])
1094         java_ok=no
1095       fi
1096       if test no = "$java_ok" ; then
1097         test yes = "$with_java" && AC_MSG_ERROR([Couldn't compile and run a simple Java test program])
1098       fi
1099     fi
1100   else
1101     if test yes = "$with_java" ; then
1102       if test -z "$JAVA" ; then
1103         AC_MSG_ERROR([java not found])
1104       elif test -z "$JAVAC" ; then
1105         AC_MSG_ERROR([javac not found])
1106       elif test -z "$JAR" ; then
1107         AC_MSG_ERROR([jar not found])
1108       fi
1109     fi
1110   fi
1113 if test no != "$with_ruby" ; then
1114   dnl See comment for AC_PATH_PROGS(SWIG, ...).
1115   if test -n "$RUBY" ; then
1116     AC_PATH_PROGS(RUBY, ["$RUBY"], [])
1117   else
1118     AC_PATH_PROGS(RUBY, [ruby], [])
1119   fi
1120   AC_ARG_VAR(RUBY, [Ruby interpreter])
1121   if test -n "$RUBY" ; then
1122     dnl Require Ruby 2.1 or newer.
1123     AC_MSG_CHECKING([$RUBY version])
1124     dnl RUBY_VERSION works with 1.6.  Once we've checked we have at least 1.8
1125     dnl we can safely use RbConfig below (RbConfig requires Ruby 1.8).
1126     version=`$RUBY -e 'print RUBY_VERSION' 2>/dev/null`
1127     case $version in
1128     "")
1129       AC_MSG_RESULT([\$RUBY -e 'print RUBY_VERSION' didn't work])
1130       if test yes = "$with_ruby" ; then
1131         AC_MSG_ERROR([Working Ruby interpreter not found])
1132       fi
1133       RUBY=
1134       ;;
1135     [[01].*|2.0.*])
1136       AC_MSG_RESULT([$version (too old)])
1137       if test yes = "$with_ruby" ; then
1138         AC_MSG_ERROR([Only Ruby 2.1 or newer is supported ($RUBY is $version)])
1139       fi
1140       RUBY=
1141       ;;
1142     esac
1143     if test -n "$RUBY" ; then
1144       AC_MSG_RESULT([$version])
1145       AC_ARG_VAR(RUBY_INC, [Directory where ruby.h can be found])
1146       if test -z "$RUBY_INC" ; then
1147         dnl Ruby 1.9 added rubyhdrdir.
1148         [RUBY_INC=`$RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyhdrdir"]'`]
1149       fi
1150       AC_SUBST(RUBY_INC)
1151       dnl Check that ruby.h is there, which is a good way to check that
1152       dnl the appropriate ruby-dev package has been installed.
1153       AC_MSG_CHECKING([for $RUBY_INC/ruby.h])
1154       if test -f "$RUBY_INC/ruby.h" ; then
1155         AC_MSG_RESULT(yes)
1157         AC_ARG_VAR(RUBY_INC_ARCH, [Directory where ruby/config.h can be found])
1158         if test -z "$RUBY_INC_ARCH" ; then
1159           dnl Ruby 2.0 and later have rubyarchhdrdir.
1160           [RUBY_INC_ARCH=`$RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyarchhdrdir"]'`]
1161         fi
1162         AC_SUBST(RUBY_INC_ARCH)
1164         AC_ARG_VAR(RUBY_LIB, [Directory to install ruby files into])
1165         if test -z "$RUBY_LIB" ; then
1166           [RUBY_LIB=`$RUBY -rrbconfig -e 'print RbConfig::CONFIG["sitelibdir"]'`]
1167         fi
1168         AC_SUBST(RUBY_LIB)
1170         AC_ARG_VAR(RUBY_LIB_ARCH, [Directory to install ruby binary modules into])
1171         if test -z "$RUBY_LIB_ARCH" ; then
1172           [RUBY_LIB_ARCH=`$RUBY -rrbconfig -e 'print RbConfig::CONFIG["sitearchdir"]'`]
1173         fi
1174         AC_SUBST(RUBY_LIB_ARCH)
1176         RUBY_LIBS=
1177         if test unsupported = "$allow_undefined_flag" ; then
1178           dnl For Microsoft Windows and a few other platforms.
1179           [RUBY_LIBS=`$RUBY -rrbconfig -e 'print RbConfig::CONFIG["LIBRUBYARG"]'`]
1180         fi
1181         AC_SUBST(RUBY_LIBS)
1183         dnl rdoc is included as part of the Ruby core distribution, so run it
1184         dnl at build time rather shipping the rather large generated output in
1185         dnl our source tarball.
1186         if test -n "$RDOC" ; then
1187           AC_PATH_PROGS(RDOC, ["$RDOC"], [])
1188         else
1189           dnl Try replace the *last* 'ruby' with 'rdoc'.
1190           rdoc_best_guess=`echo "$RUBY"|sed 's,\(.*\)ruby,\1rdoc,'`
1191           AC_PATH_PROGS(RDOC, ["$rdoc_best_guess"], [])
1192           if test -z "$RDOC"; then
1193             AC_PATH_PROGS(RDOC, [rdoc], [])
1194           fi
1195         fi
1196         if test -n "$RDOC"; then
1197           BINDINGS="$BINDINGS ruby"
1198         fi
1199         AC_ARG_VAR([RDOC], [Ruby documentation generator])
1200       else
1201         AC_MSG_RESULT([no (install ruby-dev or ruby-devel package or similar)])
1202         if test yes = "$with_ruby" ; then
1203           AC_MSG_ERROR([ruby.h not found])
1204         fi
1205       fi
1206       RUBY_DLEXT=`$RUBY -rrbconfig -e 'print RbConfig::CONFIG[["DLEXT"]]'`
1207       AC_SUBST(RUBY_DLEXT)
1208     fi
1209   fi
1212 if test no != "$with_perl" ; then
1213   AC_PATH_PROGS(PERL, ["${PERL-perl}"], [])
1214   AC_ARG_VAR(PERL, [Perl interpreter])
1215   if test -n "$PERL" ; then
1216     if test -z "$PERL_INC" ; then
1217       PERL_INC=`$PERL -MConfig -e 'print $Config{archlibexp}, "/CORE"'`
1218     fi
1219     AC_SUBST(PERL_INC)
1221     AC_ARG_VAR(PERL_ARCH, [Directory to install architecture-dependent perl files into])
1222     if test -z "$PERL_ARCH" ; then
1223       PERL_ARCH=`$PERL -MConfig -e 'print $Config{installsitearch}'`
1224     fi
1225     AC_SUBST(PERL_ARCH)
1227     AC_ARG_VAR(PERL_LIB, [Directory to install architecture-independent perl files into])
1228     if test -z "$PERL_LIB" ; then
1229       PERL_LIB=`$PERL -MConfig -e 'print $Config{installsitelib}'`
1230     fi
1231     AC_SUBST(PERL_LIB)
1233     AC_ARG_VAR(PERL_SO, [Extension for compiled Perl modules])
1234     if test -z "$PERL_SO" ; then
1235       PERL_SO=`$PERL -MConfig -e 'print ".", $Config{dlext}'`
1236     fi
1237     AC_SUBST(PERL_SO)
1239     if test -z "$PERL_XAPIAN_VERSION" ; then
1240       dnl snapshot versions look like 1.2.3_git123
1241       case $PACKAGE_VERSION in
1242       *_git*)
1243         PERL_XAPIAN_VERSION=`echo "$PACKAGE_VERSION"|sed 's/_git/./'` ;;
1244       *)
1245         PERL_XAPIAN_VERSION=$PACKAGE_VERSION.0 ;;
1246       esac
1247     fi
1248     AC_SUBST(PERL_XAPIAN_VERSION)
1250     BINDINGS="$BINDINGS perl"
1251   else
1252     if test yes = "$with_perl" ; then
1253       AC_MSG_ERROR([perl not found])
1254     fi
1255   fi
1258 if test no != "$with_lua" ; then
1259   AC_PATH_PROGS(LUA, ["${LUA-lua}"], [])
1260   AC_ARG_VAR(LUA, [lua interpreter])
1261   if test -n "$LUA" ; then
1262     dnl We need Lua 5.1 or later.
1263     AC_MSG_CHECKING([$LUA version])
1264     lua_version=`$LUA -e 'print(_VERSION)' | cut -f 2 -d ' ' 2>&AS_MESSAGE_LOG_FD`
1266     case $lua_version in
1267     [[01234]].*|5.0|5.0.*)
1268       AC_MSG_RESULT([$lua_version < 5.1 (too old)])
1269       if test yes = "$with_lua" ; then
1270         AC_MSG_ERROR([$LUA too old (Lua 5.1 or newer required)])
1271       fi
1272       LUA=
1273       ;;
1274     "")
1275       AC_MSG_RESULT([\$LUA -e 'print(_VERSION)' | cut -f 2 -d ' ' didn't work])
1277       if test yes = "$with_lua" ; then
1278         AC_MSG_ERROR([Working Lua interpreter not found])
1279       fi
1280       LUA=
1281       ;;
1282     esac
1284     if test -n "$LUA" ; then
1285       AC_MSG_RESULT([$lua_version])
1287       AC_ARG_VAR([LUA_LIB], [Directory to install compiled Lua modules into])
1288       AC_ARG_VAR([LUA_SO], [Extension for compiled Lua modules (e.g. LUA_SO=.so)])
1289       AC_MSG_CHECKING([for directory to install compiled Lua modules into])
1290       if test -z "$LUA_LIB" -o -z "$LUA_SO" ; then
1291         lua_cpath=`$LUA -e 'require("package") print(package.cpath)'`
1292         dnl Look for the first absolute path in lua_cpath which has leaf
1293         dnl "?.<ext>" and put the directory part into lua_lib and <ext> into
1294         dnl lua_so.  If LUA_SO was specified by the user, only consider
1295         dnl entries where <ext> matches LUA_SO.
1296         lua_lib=
1297         lua_so=
1298         case $LUA_SO in
1299           "")
1300            [lua_so_pat='[a-zA-Z][a-zA-Z]*'] ;;
1301           .*)
1302             dnl If LUA_SO has a leading '.', remove it.
1303             lua_so_pat=`AS_ECHO("$LUA_SO")|sed 's/^\.//'` ;;
1304           *)
1305             dnl If LUA_SO was specified without a leading '.', add one to the
1306             dnl value substituted into Makefile.in.
1307             lua_so_pat=$LUA_SO
1308             LUA_SO=.$LUA_SO
1309             ;;
1310         esac
1311         while test x"$lua_cpath" != x ; do
1312           [lua_lib=`expr X"$lua_cpath" : X'\([^;]*\)'`]
1313           lua_so=.`expr X"$lua_lib" : X'/.*/?\.\('"$lua_so_pat"'\)$'`
1314           case $lua_so in
1315             .|.lua)
1316               dnl If someone has foolishly put ?.lua in cpath, ignore them.
1317               lua_lib=
1318               ;;
1319             *)
1320               lua_lib=`expr X"$lua_lib" : X'\(/.*\)/?\.'"$lua_so_pat"'$'`
1321               break ;;
1322           esac
1323           [lua_cpath=`expr X"$lua_cpath" : X'[^;]*;*\(.*\)'`]
1324         done
1325         test -n "$LUA_LIB" || LUA_LIB=$lua_lib
1326         test -n "$LUA_SO" || LUA_SO=$lua_so
1327       fi
1328       if test -z "$LUA_LIB"; then
1329         AC_MSG_RESULT([not found])
1330       else
1331         AC_MSG_RESULT([$LUA_LIB])
1332       fi
1333       AC_SUBST([LUA_LIB])
1335       AC_MSG_CHECKING([for extension to use for compiled Lua modules])
1336       if test -z "$LUA_SO"; then
1337         AC_MSG_RESULT([not found])
1338       else
1339         AC_MSG_RESULT([$LUA_SO])
1340       fi
1341       AC_SUBST([LUA_SO])
1343       AC_MSG_CHECKING([for Lua header files])
1344       AC_ARG_VAR([LUA_INC], [Directory to include for lua headers])
1345       if test -z "$LUA_INC" ; then
1346         dirs="/usr/include/lua$lua_version /usr/local/include/lua$lua_version"
1347         for i in $dirs ; do
1348           if test -r "$i/lua.h"; then
1349             LUA_INC=$i
1350             break
1351           fi
1352         done
1353       fi
1355       if test -z "$LUA_INC" ; then
1356         AC_MSG_RESULT([not found])
1357       else
1358         AC_MSG_RESULT([$LUA_INC])
1359         BINDINGS="$BINDINGS lua"
1360         LUA_CPPFLAGS="-I$LUA_INC"
1361       fi
1362       AC_SUBST([LUA_CPPFLAGS])
1363     fi
1364   else
1365     if test yes = "$with_lua" ; then
1366       AC_MSG_ERROR([lua not found])
1367     fi
1368   fi
1371 AC_SUBST(BINDINGS)
1373 case $BINDINGS in
1374 *python*) dnl Matches python and/or python3
1375   dnl C++11 has thread_local
1376   dnl GCC and some others have __thread
1377   dnl MSVC and some others have __declspec(thread)
1378   AC_MSG_CHECKING([for thread-local storage qualifier])
1379   AC_ARG_VAR([THREAD_LOCAL], [thread-local storage qualifier])
1380   if test -z "$THREAD_LOCAL" ; then
1381     for t in thread_local __thread '__declspec(thread)' ; do
1382       AC_COMPILE_IFELSE([AC_LANG_SOURCE([[static $t void * p;]])],
1383                         [THREAD_LOCAL=$t; break])
1384     done
1385   fi
1386   if test -z "$THREAD_LOCAL" ; then
1387     AC_MSG_RESULT([unknown, disabling thread-local support])
1388   else
1389     AC_MSG_RESULT([$THREAD_LOCAL])
1390     AC_DEFINE_UNQUOTED([THREAD_LOCAL], [$THREAD_LOCAL], [Thread local storage qualifier (undefined if no TLS)])
1391   fi
1392   ;;
1393 esac
1395 dnl Set flags to control warnings (enable more, or disable annoying ones)
1396 dnl and other compiler specific flags.
1397 SWIG_CXXFLAGS=
1398 if test yes = "$GXX" ; then
1399   dnl Python itself is compiled with -fno-strict-aliasing, and it appears
1400   dnl it's safest to follow this lead when compiling the SWIG generated
1401   dnl interface code.  E.g.:
1402   dnl   https://article.gmane.org/gmane.comp.gcc.devel/74692
1403   dnl The code SWIG generates for other languages seems to have similar
1404   dnl issues too, so just turn this on for all of them.
1405   dnl
1406   dnl There's no need to check -fno-strict-aliasing is supported as it works
1407   dnl with GCC 2.95 and we don't support anything older.
1408   SWIG_CXXFLAGS="-fno-strict-aliasing"
1410   dnl We need to explicitly link against -lstdc++ on OpenBSD (discovered
1411   dnl on OpenBSD 3.7 with GCC 3.3.5 but this appears to be due to a
1412   dnl deliberate decision on the part of OpenBSD developers).  Luckily
1413   dnl we can just always specify -lstdc++ explicitly if GCC is the
1414   dnl compiler and libtool will eliminate the duplicate on other
1415   dnl platforms.
1416   XAPIAN_LIBS="$XAPIAN_LIBS -lstdc++"
1418   dnl Intel's C++ compiler is identified as "GXX" by autoconf's test - check
1419   dnl which we actually have.
1420   AC_EGREP_CPP(yes,
1421     [#ifdef __INTEL_COMPILER
1422      yes
1423      #endif
1424     ],
1425     [
1426       dnl Intel's compiler:
1427       dnl
1428       dnl -w1 stops the avalanche of uninteresting "remark" messages.
1429       dnl -wd... disables warnings which don't have good code workarounds.
1430       dnl
1431       dnl Swig generated code gives lots of unused and uninitialized warnings.
1432       dnl They're non-harmful, so suppress them.
1433       SWIG_CXXFLAGS="$SWIG_CXXFLAGS -Wall -w1 -wd177,1572"
1434     ],
1435     [
1436       dnl GCC or clang:
1437       dnl
1438       dnl Swig generated code gives lots of unused and uninitialized warnings.
1439       dnl They're non-harmful, so suppress them.
1440       SWIG_CXXFLAGS="$SWIG_CXXFLAGS -Wall -Wno-unused -Wno-uninitialized"
1441     ])
1443   if test no != "$enable_visibility"; then
1444     dnl GCC doesn't support symbol visibility on all platforms (e.g. it isn't
1445     dnl supported on mingw and visibility attributes result in warnings).
1446     AC_MSG_CHECKING([if $CXX -fvisibility=hidden -fvisibility-inlines-hidden works])
1447     if echo 'int bar() __attribute__((visibility("default"))); int baz() __attribute__((visibility("internal"))); int bar() { return 6; } int baz() { return 7; } 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
1448       AC_MSG_RESULT([yes])
1449       SWIG_CXXFLAGS="$SWIG_CXXFLAGS -fvisibility=hidden -fvisibility-inlines-hidden"
1450     else
1451       AC_MSG_RESULT([no])
1452     fi
1453   fi
1455 AC_SUBST(SWIG_CXXFLAGS)
1457 dnl Restore CXXFLAGS to those the user specified or autoconf defaulted to.
1458 CXXFLAGS=$save_CXXFLAGS
1460 dnl Required for auto regeneration to work in a combined maintainer-mode tree.
1461 : ${AUTOM4TE=autom4te}
1462 AC_SUBST([AUTOM4TE])
1464 AC_CONFIG_FILES([Makefile
1465  doxygen_xml.conf
1466  xapian-version.h
1467  python/Makefile python/docs/conf.py python/version.i
1468  python3/Makefile python3/docs/conf.py python3/version.i
1469  php/Makefile
1470  php7/Makefile
1471  java/Makefile
1472  tcl8/Makefile tcl8/pkgIndex.tcl
1473  csharp/Makefile csharp/AssemblyInfo.cs
1474  ruby/Makefile
1475  perl/Makefile
1476  lua/Makefile
1477  xapian-bindings.spec
1478  ])
1479 AC_OUTPUT
1481 echo ""
1482 if test -z "$BINDINGS" ; then
1483   echo "*** Not found the required tools for building bindings for any"
1484   echo "*** supported language!"
1485   echo "***"
1486   echo "*** You may need to install -dev or -devel packages for the languages"
1487   echo "*** you want to build bindings for."
1488   echo "***"
1489   echo "*** For details of how to point configure at tools not on PATH, see:"
1490   echo "***     ./configure --help"
1491 else
1492   echo "*** Building bindings for languages:" $BINDINGS
1494 echo ""
1495 if test "$COMPAT_VERSION" != "$XAPIAN_VERSION" ; then
1496   release_series=[`echo "$COMPAT_VERSION"|sed 's/[0-9][0-9]*$//'`]
1497   case $XAPIAN_VERSION in
1498   $release_series*) ;;
1499   *)
1500     AC_MSG_ERROR([Xapian library is version ${XAPIAN_VERSION-<0.8.2} which is from a different release series to bindings $PACKAGE_VERSION, so they aren't compatible.])
1501     ;;
1502   esac
1503   dnl 0.8.2 was the first version which set XAPIAN_VERSION
1504   AC_MSG_WARN([Xapian library is version ${XAPIAN_VERSION-<0.8.2} but the bindings are version $PACKAGE_VERSION - we strongly recommend using matching versions.])