Merge branch 'release'
[notmuch] / configure
1 #! /bin/sh
2
3 set -u
4
5 # Test whether this shell is capable of parameter substring processing.
6 ( option='a/b'; : ${option#*/} ) 2>/dev/null || {
7     echo "
8 The shell interpreting '$0' is lacking some required features.
9
10 To work around this problem you may try to execute:
11
12     ksh $0 $*
13  or
14     bash $0 $*
15 "
16     exit 1
17 }
18
19 # Store original IFS value so it can be changed (and restored) in many places.
20 readonly DEFAULT_IFS="$IFS"
21
22 # The top-level directory for the source. This ./configure and all Makefiles
23 # are good with ${srcdir} usually being relative. Some components (e.g. tests)
24 # are executed in subdirectories and for those it is simpler to use
25 # ${NOTMUCH_SRCDIR} which holds absolute path to the source.
26 srcdir=$(dirname "$0")
27 NOTMUCH_SRCDIR=$(cd "$srcdir" && pwd)
28
29 subdirs="util compat lib parse-time-string completion doc emacs"
30 subdirs="${subdirs} performance-test test test/test-databases"
31 subdirs="${subdirs} bindings"
32
33 # For a non-srcdir configure invocation (such as ../configure), create
34 # the directory structure and copy Makefiles.
35 if [ "$srcdir" != "." ]; then
36
37     for dir in . ${subdirs}; do
38         mkdir -p "$dir"
39         cp "$srcdir"/"$dir"/Makefile.local "$dir"
40         cp "$srcdir"/"$dir"/Makefile "$dir"
41     done
42
43     # Easiest way to get the test suite to work is to just copy the
44     # whole thing into the build directory.
45     cp -a "$srcdir"/test/* test
46
47     # Emacs only likes to generate compiled files next to the .el files
48     # by default so copy these as well (which is not ideal).
49     cp -a "$srcdir"/emacs/*.el emacs
50
51     # We were not able to create fully working Makefile using ruby mkmf.rb
52     # so ruby bindings source files are copied as well (ditto -- not ideal).
53     mkdir bindings/ruby
54     cp -a "$srcdir"/bindings/ruby/*.[ch] bindings/ruby
55     cp -a "$srcdir"/bindings/ruby/extconf.rb bindings/ruby
56 fi
57
58 # Set several defaults (optionally specified by the user in
59 # environment variables)
60 CC=${CC:-cc}
61 CXX=${CXX:-c++}
62 CFLAGS=${CFLAGS:--g -O2}
63 CPPFLAGS=${CPPFLAGS:-}
64 CXXFLAGS_for_sh=${CXXFLAGS:-${CFLAGS}}
65 CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)}
66 LDFLAGS=${LDFLAGS:-}
67 XAPIAN_CONFIG=${XAPIAN_CONFIG:-}
68 PYTHON=${PYTHON:-}
69
70 # We don't allow the EMACS or GZIP Makefile variables inherit values
71 # from the environment as we do with CC and CXX above. The reason is
72 # that these names as environment variables have existing uses other
73 # than the program name that we want. (EMACS is set to 't' when a
74 # shell is running within emacs and GZIP specifies arguments to pass
75 # on the gzip command line).
76
77 # Set the defaults for values the user can specify with command-line
78 # options.
79 PREFIX=/usr/local
80 LIBDIR=
81 WITH_DOCS=1
82 WITH_API_DOCS=1
83 WITH_EMACS=1
84 WITH_DESKTOP=1
85 WITH_BASH=1
86 WITH_RUBY=1
87 WITH_ZSH=1
88 WITH_RETRY_LOCK=1
89
90 usage ()
91 {
92     cat <<EOF
93 Usage: ./configure [options]...
94
95 This script configures notmuch to build on your system.
96
97 It verifies that dependencies are available, determines flags needed
98 to compile and link against various required libraries, and identifies
99 whether various system functions can be used or if locally-provided
100 replacements will be built instead.
101
102 Finally, it allows you to control various aspects of the build and
103 installation process.
104
105 First, some common variables can specified via environment variables:
106
107         CC              The C compiler to use
108         CFLAGS          Flags to pass to the C compiler
109         CPPFLAGS        Flags to pass to the C preprocessor
110         CXX             The C++ compiler to use
111         CXXFLAGS        Flags to pass to the C compiler
112         LDFLAGS         Flags to pass when linking
113
114 Each of these values can further be controlled by specifying them
115 later on the "make" command line.
116
117 Other environment variables can be used to control configure itself,
118 (and for which there is no equivalent build-time control):
119
120         XAPIAN_CONFIG   The program to use to determine flags for
121                         compiling and linking against the Xapian
122                         library. [$XAPIAN_CONFIG]
123         PYTHON          Name of python command to use in
124                         configure and the test suite.
125
126 Additionally, various options can be specified on the configure
127 command line.
128
129         --prefix=PREFIX Install files in PREFIX [$PREFIX]
130
131 By default, "make install" will install the resulting program to
132 $PREFIX/bin, documentation to $PREFIX/man, etc. You can
133 specify an installation prefix other than $PREFIX using
134 --prefix, for instance:
135
136         ./configure --prefix=\$HOME
137
138 Fine tuning of some installation directories is available:
139
140         --libdir=DIR            Install libraries to DIR [PREFIX/lib]
141         --includedir=DIR        Install header files to DIR [PREFIX/include]
142         --mandir=DIR            Install man pages to DIR [PREFIX/share/man]
143         --sysconfdir=DIR        Read-only single-machine data [PREFIX/etc]
144         --emacslispdir=DIR      Emacs code [PREFIX/share/emacs/site-lisp]
145         --emacsetcdir=DIR       Emacs miscellaneous files [PREFIX/share/emacs/site-lisp]
146         --bashcompletiondir=DIR Bash completions files [SYSCONFDIR/bash_completion.d]
147         --zshcompletiondir=DIR  Zsh completions files [PREFIX/share/zsh/functions/Completion/Unix]
148
149 Some features can be disabled (--with-feature=no is equivalent to
150 --without-feature) :
151
152         --without-bash-completion       Do not install bash completions files
153         --without-docs                  Do not install documentation
154         --without-api-docs              Do not install API man page
155         --without-emacs                 Do not install lisp file
156         --without-desktop               Do not install desktop file
157         --without-ruby                  Do not install ruby bindings
158         --without-zsh-completion        Do not install zsh completions files
159         --without-retry-lock            Do not use blocking xapian opens, even if available
160
161 Additional options are accepted for compatibility with other
162 configure-script calling conventions, but don't do anything yet:
163
164         --build=<cpu>-<vendor>-<os>     Currently ignored
165         --host=<cpu>-<vendor>-<os>      Currently ignored
166         --infodir=DIR                   Currently ignored
167         --datadir=DIR                   Currently ignored
168         --localstatedir=DIR             Currently ignored
169         --libexecdir=DIR                Currently ignored
170         --disable-maintainer-mode       Currently ignored
171         --disable-dependency-tracking   Currently ignored
172
173 EOF
174 }
175
176 # Parse command-line options
177 for option; do
178     if [ "${option}" = '--help' ] ; then
179         usage
180         exit 0
181     elif [ "${option%%=*}" = '--prefix' ] ; then
182         PREFIX="${option#*=}"
183     elif [ "${option%%=*}" = '--libdir' ] ; then
184         LIBDIR="${option#*=}"
185     elif [ "${option%%=*}" = '--includedir' ] ; then
186         INCLUDEDIR="${option#*=}"
187     elif [ "${option%%=*}" = '--mandir' ] ; then
188         MANDIR="${option#*=}"
189     elif [ "${option%%=*}" = '--sysconfdir' ] ; then
190         SYSCONFDIR="${option#*=}"
191     elif [ "${option%%=*}" = '--emacslispdir' ] ; then
192         EMACSLISPDIR="${option#*=}"
193     elif [ "${option%%=*}" = '--emacsetcdir' ] ; then
194         EMACSETCDIR="${option#*=}"
195     elif [ "${option%%=*}" = '--bashcompletiondir' ] ; then
196         BASHCOMPLETIONDIR="${option#*=}"
197     elif [ "${option%%=*}" = '--zshcompletiondir' ] ; then
198         ZSHCOMLETIONDIR="${option#*=}"
199     elif [ "${option%%=*}" = '--with-docs' ]; then
200         if [ "${option#*=}" = 'no' ]; then
201             WITH_DOCS=0
202             WITH_API_DOCS=0
203         else
204             WITH_DOCS=1
205         fi
206     elif [ "${option}" = '--without-docs' ] ; then
207         WITH_DOCS=0
208         WITH_API_DOCS=0
209     elif [ "${option%%=*}" = '--with-api-docs' ]; then
210         if [ "${option#*=}" = 'no' ]; then
211             WITH_API_DOCS=0
212         else
213             WITH_API_DOCS=1
214         fi
215     elif [ "${option}" = '--without-api-docs' ] ; then
216         WITH_API_DOCS=0
217     elif [ "${option%%=*}" = '--with-emacs' ]; then
218         if [ "${option#*=}" = 'no' ]; then
219             WITH_EMACS=0
220         else
221             WITH_EMACS=1
222         fi
223     elif [ "${option}" = '--without-emacs' ] ; then
224         WITH_EMACS=0
225     elif [ "${option%%=*}" = '--with-desktop' ]; then
226         if [ "${option#*=}" = 'no' ]; then
227             WITH_DESKTOP=0
228         else
229             WITH_DESKTOP=1
230         fi
231     elif [ "${option}" = '--without-desktop' ] ; then
232         WITH_DESKTOP=0
233     elif [ "${option%%=*}" = '--with-bash-completion' ]; then
234         if [ "${option#*=}" = 'no' ]; then
235             WITH_BASH=0
236         else
237             WITH_BASH=1
238         fi
239     elif [ "${option}" = '--without-bash-completion' ] ; then
240         WITH_BASH=0
241     elif [ "${option%%=*}" = '--with-ruby' ]; then
242         if [ "${option#*=}" = 'no' ]; then
243             WITH_RUBY=0
244         else
245             WITH_RUBY=1
246         fi
247     elif [ "${option}" = '--without-ruby' ] ; then
248         WITH_RUBY=0
249     elif [ "${option%%=*}" = '--with-retry-lock' ]; then
250         if [ "${option#*=}" = 'no' ]; then
251             WITH_RETRY_LOCK=0
252         else
253             WITH_RETRY_LOCK=1
254         fi
255     elif [ "${option}" = '--without-retry-lock' ] ; then
256         WITH_RETRY_LOCK=0
257     elif [ "${option%%=*}" = '--with-zsh-completion' ]; then
258         if [ "${option#*=}" = 'no' ]; then
259             WITH_ZSH=0
260         else
261             WITH_ZSH=1
262         fi
263     elif [ "${option}" = '--without-zsh-completion' ] ; then
264         WITH_ZSH=0
265     elif [ "${option%%=*}" = '--build' ] ; then
266         true
267     elif [ "${option%%=*}" = '--host' ] ; then
268         true
269     elif [ "${option%%=*}" = '--infodir' ] ; then
270         true
271     elif [ "${option%%=*}" = '--datadir' ] ; then
272         true
273     elif [ "${option%%=*}" = '--localstatedir' ] ; then
274         true
275     elif [ "${option%%=*}" = '--libexecdir' ] ; then
276         true
277     elif [ "${option}" = '--disable-maintainer-mode' ] ; then
278         true
279     elif [ "${option}" = '--disable-dependency-tracking' ] ; then
280         true
281     else
282         echo "Unrecognized option: ${option}"
283         echo "See:"
284         echo "  $0 --help"
285         echo ""
286         exit 1
287     fi
288 done
289
290 # We set this value early, (rather than just while printing the
291 # Makefile.config file later like most values), because we need to
292 # actually investigate this value compared to the ldconfig_paths value
293 # below.
294 if [ -z "$LIBDIR" ] ; then
295     libdir_expanded="${PREFIX}/lib"
296 else
297     # very non-general variable expansion
298     libdir_expanded=$(printf %s "$LIBDIR" | sed "s|\${prefix}|${PREFIX}|; s|\$prefix\>|${PREFIX}|; s|//*|/|g")
299 fi
300
301 cat <<EOF
302 Welcome to Notmuch, a system for indexing, searching and tagging your email.
303
304 We hope that the process of building and installing notmuch is quick
305 and smooth so that you can soon be reading and processing your email
306 more efficiently than ever.
307
308 If anything goes wrong in the configure process, you can override any
309 decisions it makes by manually editing the Makefile.config file that
310 it creates. Also please do as much as you can to figure out what could
311 be different on your machine compared to those of the notmuch
312 developers. Then, please email those details to the Notmuch list
313 (notmuch@notmuchmail.org) so that we can hopefully make future
314 versions of notmuch easier for you to use.
315
316 We'll now investigate your system to verify that all required
317 dependencies are available:
318
319 EOF
320
321 errors=0
322 printf "int main(void){return 0;}\n" > minimal.c
323
324 printf "Sanity checking C compilation environment... "
325 if ${CC} ${CFLAGS} ${CPPFLAGS} minimal.c ${LDFLAGS} -o minimal > /dev/null 2>&1
326 then
327     printf "OK.\n"
328 else
329     printf "Fail.\n"
330     errors=$((errors + 1))
331 fi
332
333 printf "Sanity checking C++ compilation environment... "
334 if ${CXX} ${CXXFLAGS_for_sh} ${CPPFLAGS} minimal.c ${LDFLAGS} -o minimal > /dev/null 2>&1
335 then
336     printf "OK.\n"
337 else
338     printf "Fail.\n"
339     errors=$((errors + 1))
340 fi
341
342 if [ $errors -gt 0 ]; then
343     cat <<EOF
344 *** Error: Initial sanity checking of environment failed.  Please try
345 running configure in a clean environment, and if the problem persists,
346 report a bug.
347 EOF
348     rm -f minimal minimal.c
349     exit 1
350 fi
351
352 printf "Reading libnotmuch version from source... "
353 cat > _libversion.c <<EOF
354 #include <stdio.h>
355 #include "lib/notmuch.h"
356 int main(void) {
357     printf("libnotmuch_version_major=%d\n",
358                 LIBNOTMUCH_MAJOR_VERSION);
359     printf("libnotmuch_version_minor=%d\n",
360                 LIBNOTMUCH_MINOR_VERSION);
361     printf("libnotmuch_version_release=%d\n",
362                 LIBNOTMUCH_MICRO_VERSION);
363     return 0;
364 }
365 EOF
366 if ${CC} ${CFLAGS} -I"$srcdir" _libversion.c -o _libversion > /dev/null 2>&1 \
367        && ./_libversion > _libversion.sh && . ./_libversion.sh
368 then
369     printf "OK.\n"
370 else
371     cat <<EOF
372
373 *** Error: Reading lib/notmuch.h failed.
374 Please try running configure again in a clean environment, and if the
375 problem persists, report a bug.
376 EOF
377     rm -f _libversion _libversion.c _libversion.sh
378     exit 1
379 fi
380
381 if pkg-config --version > /dev/null 2>&1; then
382     have_pkg_config=1
383 else
384     have_pkg_config=0
385 fi
386
387 printf "Checking for Xapian development files... "
388 have_xapian=0
389 for xapian_config in ${XAPIAN_CONFIG} xapian-config xapian-config-1.3; do
390     if ${xapian_config} --version > /dev/null 2>&1; then
391         xapian_version=$(${xapian_config} --version | sed -e 's/.* //')
392         printf "Yes (%s).\n" ${xapian_version}
393         have_xapian=1
394         xapian_cxxflags=$(${xapian_config} --cxxflags)
395         xapian_ldflags=$(${xapian_config} --libs)
396         break
397     fi
398 done
399 if [ ${have_xapian} = "0" ]; then
400     printf "No.\n"
401     errors=$((errors + 1))
402 fi
403
404 have_xapian_compact=0
405 have_xapian_field_processor=0
406 if [ ${have_xapian} = "1" ]; then
407     printf "Checking for Xapian compaction support... "
408     cat>_compact.cc<<EOF
409 #include <xapian.h>
410 class TestCompactor : public Xapian::Compactor { };
411 EOF
412     if ${CXX} ${CXXFLAGS_for_sh} ${xapian_cxxflags} -c _compact.cc -o _compact.o > /dev/null 2>&1
413     then
414         have_xapian_compact=1
415         printf "Yes.\n"
416     else
417         printf "No.\n"
418         errors=$((errors + 1))
419     fi
420
421     rm -f _compact.o _compact.cc
422
423     printf "Checking for Xapian FieldProcessor API... "
424     cat>_field_processor.cc<<EOF
425 #include <xapian.h>
426 class TitleFieldProcessor : public Xapian::FieldProcessor { };
427 EOF
428     if ${CXX} ${CXXFLAGS_for_sh} ${xapian_cxxflags} -c _field_processor.cc -o _field_processor.o > /dev/null 2>&1
429     then
430         have_xapian_field_processor=1
431         printf "Yes.\n"
432     else
433         printf "No. (optional)\n"
434     fi
435
436     rm -f _field_processor.o _field_processor.cc
437
438     default_xapian_backend=""
439     # DB_RETRY_LOCK is only supported on Xapian > 1.3.2
440     have_xapian_db_retry_lock=0
441     if [ $WITH_RETRY_LOCK = "1" ]; then
442         printf "Checking for Xapian lock retry support... "
443         cat>_retry.cc<<EOF
444 #include <xapian.h>
445 int flag = Xapian::DB_RETRY_LOCK;
446 EOF
447         if ${CXX} ${CXXFLAGS_for_sh} ${xapian_cxxflags} -c _retry.cc -o _retry.o > /dev/null 2>&1
448         then
449             have_xapian_db_retry_lock=1
450             printf "Yes.\n"
451         else
452             printf "No. (optional)\n"
453         fi
454         rm -f _retry.o _retry.cc
455     fi
456
457     printf "Testing default Xapian backend... "
458     cat >_default_backend.cc <<EOF
459 #include <xapian.h>
460 int main(int argc, char** argv) {
461    Xapian::WritableDatabase db("test.db",Xapian::DB_CREATE_OR_OPEN);
462 }
463 EOF
464     ${CXX} ${CXXFLAGS_for_sh} ${xapian_cxxflags} _default_backend.cc -o _default_backend ${xapian_ldflags}
465     ./_default_backend
466     if [ -f test.db/iamglass ]; then
467         default_xapian_backend=glass
468     else
469         default_xapian_backend=chert
470     fi
471     printf "%s\n" "${default_xapian_backend}";
472     rm -rf test.db _default_backend _default_backend.cc
473 fi
474
475 # we need to have a version >= 2.6.5 to avoid a crypto bug. We need
476 # 2.6.7 for permissive "From " header handling.
477 GMIME_MINVER=2.6.7
478
479 printf "Checking for GMime development files... "
480 if pkg-config --exists "gmime-2.6 >= $GMIME_MINVER"; then
481     printf "Yes.\n"
482     have_gmime=1
483     gmime_cflags=$(pkg-config --cflags gmime-2.6)
484     gmime_ldflags=$(pkg-config --libs gmime-2.6)
485 else
486     have_gmime=0
487     printf "No.\n"
488     errors=$((errors + 1))
489 fi
490
491 # GMime already depends on Glib >= 2.12, but we use at least one Glib
492 # function that only exists as of 2.22, (g_array_unref)
493 printf "Checking for Glib development files (>= 2.22)... "
494 have_glib=0
495 if pkg-config --exists 'glib-2.0 >= 2.22'; then
496     printf "Yes.\n"
497     have_glib=1
498     # these are included in gmime cflags and ldflags
499     # glib_cflags=$(pkg-config --cflags glib-2.0)
500     # glib_ldflags=$(pkg-config --libs glib-2.0)
501 else
502     printf "No.\n"
503     errors=$((errors + 1))
504 fi
505
506 if ! pkg-config --exists zlib; then
507   ${CC} -o compat/gen_zlib_pc "$srcdir"/compat/gen_zlib_pc.c >/dev/null 2>&1 &&
508   compat/gen_zlib_pc > compat/zlib.pc &&
509   PKG_CONFIG_PATH="$PKG_CONFIG_PATH":compat &&
510   export PKG_CONFIG_PATH
511   rm -f compat/gen_zlib_pc
512 fi
513
514 printf "Checking for zlib (>= 1.2.5.2)... "
515 have_zlib=0
516 if pkg-config --atleast-version=1.2.5.2 zlib; then
517     printf "Yes.\n"
518     have_zlib=1
519     zlib_cflags=$(pkg-config --cflags zlib)
520     zlib_ldflags=$(pkg-config --libs zlib)
521 else
522     printf "No.\n"
523     errors=$((errors + 1))
524 fi
525
526 printf "Checking for talloc development files... "
527 if pkg-config --exists talloc; then
528     printf "Yes.\n"
529     have_talloc=1
530     talloc_cflags=$(pkg-config --cflags talloc)
531     talloc_ldflags=$(pkg-config --libs talloc)
532 else
533     printf "No.\n"
534     have_talloc=0
535     talloc_cflags=
536     errors=$((errors + 1))
537 fi
538
539 printf "Checking for python... "
540 have_python=0
541
542 for name in ${PYTHON} python python2 python3; do
543     if command -v $name > /dev/null; then
544         have_python=1
545         python=$name
546         printf "Yes (%s).\n" "$name"
547         break
548     fi
549 done
550
551 if [ $have_python -eq 0 ]; then
552     printf "No.\n"
553     errors=$((errors + 1))
554 fi
555
556 printf "Checking for valgrind development files... "
557 if pkg-config --exists valgrind; then
558     printf "Yes.\n"
559     have_valgrind=1
560     valgrind_cflags=$(pkg-config --cflags valgrind)
561 else
562     printf "No (but that's fine).\n"
563     have_valgrind=0
564     valgrind_cflags=
565 fi
566
567 printf "Checking for bash-completion (>= 1.90)... "
568 if pkg-config --atleast-version=1.90 bash-completion; then
569     printf "Yes.\n"
570 else
571     printf "No (will not install bash completion).\n"
572     WITH_BASH=0
573 fi
574
575 if [ -z "${EMACSLISPDIR-}" ]; then
576     EMACSLISPDIR="\$(prefix)/share/emacs/site-lisp"
577 fi
578
579 if [ -z "${EMACSETCDIR-}" ]; then
580     EMACSETCDIR="\$(prefix)/share/emacs/site-lisp"
581 fi
582
583 printf "Checking if emacs is available... "
584 if emacs --quick --batch > /dev/null 2>&1; then
585     printf "Yes.\n"
586     have_emacs=1
587 else
588     printf "No (so will not byte-compile emacs code)\n"
589     have_emacs=0
590 fi
591
592 have_doxygen=0
593 if [ $WITH_API_DOCS = "1" ] ; then
594     printf "Checking if doxygen is available... "
595     if command -v doxygen > /dev/null; then
596         printf "Yes.\n"
597         have_doxygen=1
598     else
599         printf "No (so will not install api docs)\n"
600     fi
601 fi
602
603 have_ruby_dev=0
604 if [ $WITH_RUBY = "1" ] ; then
605     printf "Checking for ruby development files... "
606     if ruby -e "require 'mkmf'"> /dev/null 2>&1; then
607         printf "Yes.\n"
608         have_ruby_dev=1
609     else
610         printf "No (skipping ruby bindings)\n"
611     fi
612 fi
613
614 have_sphinx=0
615 if [ $WITH_DOCS = "1" ] ; then
616     printf "Checking if sphinx is available and supports nroff output... "
617     if command -v sphinx-build > /dev/null && ${python} -m sphinx.writers.manpage > /dev/null 2>&1 ; then
618         printf "Yes.\n"
619         have_sphinx=1
620     else
621         printf "No (so will not install man pages).\n"
622     fi
623 fi
624
625 if [ $WITH_DESKTOP = "1" ]; then
626     printf "Checking if desktop-file-install is available... "
627     if command -v desktop-file-install > /dev/null; then
628         printf "Yes.\n"
629     else
630         printf "No (so will not install .desktop file).\n"
631         WITH_DESKTOP=0
632     fi
633 fi
634
635 libdir_in_ldconfig=0
636
637 printf "Checking which platform we are on... "
638 uname=$(uname)
639 if [ $uname = "Darwin" ] ; then
640     printf "Mac OS X.\n"
641     platform=MACOSX
642     linker_resolves_library_dependencies=0
643 elif [ $uname = "SunOS" ] ; then
644     printf "Solaris.\n"
645     platform=SOLARIS
646     linker_resolves_library_dependencies=0
647 elif [ $uname = "FreeBSD" ] ; then
648     printf "FreeBSD.\n"
649     platform=FREEBSD
650     linker_resolves_library_dependencies=0
651 elif [ $uname = "OpenBSD" ] ; then
652     printf "OpenBSD.\n"
653     platform=OPENBSD
654     linker_resolves_library_dependencies=0
655 elif [ $uname = "Linux" ] || [ $uname = "GNU" ] ; then
656     printf "%s\n" "$uname"
657     platform="$uname"
658     linker_resolves_library_dependencies=1
659
660     printf "Checking for %s in ldconfig... " "$libdir_expanded"
661     ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
662     # Separate ldconfig_paths only on newline (not on any potential
663     # embedded space characters in any filenames). Note, we use a
664     # literal newline in the source here rather than something like:
665     #
666     #   IFS=$(printf '\n')
667     #
668     # because the shell's command substitution deletes any trailing newlines.
669     IFS="
670 "
671     for path in $ldconfig_paths; do
672         if [ "$path" = "$libdir_expanded" ]; then
673             libdir_in_ldconfig=1
674         fi
675     done
676     IFS=$DEFAULT_IFS
677     if [ "$libdir_in_ldconfig" = '0' ]; then
678         printf "No (will set RPATH)\n"
679     else
680         printf "Yes\n"
681     fi
682 else
683     printf "Unknown.\n"
684     platform="$uname"
685     linker_resolves_library_dependencies=0
686     cat <<EOF
687
688 *** Warning: Unknown platform. Notmuch might or might not build correctly.
689
690 EOF
691 fi
692
693 if [ $errors -gt 0 ]; then
694     cat <<EOF
695
696 *** Error: The dependencies of notmuch could not be satisfied. You will
697 need to install the following packages before being able to compile
698 notmuch:
699
700 EOF
701     if [ $have_python -eq 0 ]; then
702         echo "  python interpreter"
703     fi
704     if [ $have_xapian -eq 0 -o $have_xapian_compact -eq 0 ]; then
705         echo "  Xapian library (>= version 1.2.6, including development files such as headers)"
706         echo "  https://xapian.org/"
707     fi
708     if [ $have_zlib -eq 0 ]; then
709         echo "  zlib library (>= version 1.2.5.2, including development files such as headers)"
710         echo "  http://zlib.net/"
711         echo
712     fi
713     if [ $have_gmime -eq 0 ]; then
714         echo "  GMime 2.6 library >= $GMIME_MINVER"
715         echo "  (including development files such as headers)"
716         echo "  http://spruce.sourceforge.net/gmime/"
717         echo
718     fi
719     if [ $have_glib -eq 0 ]; then
720         echo "  Glib library >= 2.22 (including development files such as headers)"
721         echo "  http://ftp.gnome.org/pub/gnome/sources/glib/"
722         echo
723     fi
724     if [ $have_talloc -eq 0 ]; then
725         echo "  The talloc library (including development files such as headers)"
726         echo "  https://talloc.samba.org/"
727         echo
728     fi
729     cat <<EOF
730 With any luck, you're using a modern, package-based operating system
731 that has all of these packages available in the distribution. In that
732 case a simple command will install everything you need. For example:
733
734 On Debian and similar systems:
735
736         sudo apt-get install libxapian-dev libgmime-2.6-dev libtalloc-dev zlib1g-dev
737
738 Or on Fedora and similar systems:
739
740         sudo yum install xapian-core-devel gmime-devel libtalloc-devel zlib-devel
741
742 On other systems, similar commands can be used, but the details of the
743 package names may be different.
744
745 EOF
746     if [ $have_pkg_config -eq 0 ]; then
747 cat <<EOF
748 Note: the pkg-config program is not available. This configure script
749 uses pkg-config to find the compilation flags required to link against
750 the various libraries needed by notmuch. It's possible you simply need
751 to install pkg-config with a command such as:
752
753         sudo apt-get install pkg-config
754 Or:
755         sudo yum install pkgconfig
756
757 But if pkg-config is not available for your system, then you will need
758 to modify the configure script to manually set the cflags and ldflags
759 variables to the correct values to link against each library in each
760 case that pkg-config could not be used to determine those values.
761
762 EOF
763     fi
764 cat <<EOF
765 When you have installed the necessary dependencies, you can run
766 configure again to ensure the packages can be found, or simply run
767 "make" to compile notmuch.
768
769 EOF
770     exit 1
771 fi
772
773 printf "Checking for canonicalize_file_name... "
774 if ${CC} -o compat/have_canonicalize_file_name "$srcdir"/compat/have_canonicalize_file_name.c > /dev/null 2>&1
775 then
776     printf "Yes.\n"
777     have_canonicalize_file_name=1
778 else
779     printf "No (will use our own instead).\n"
780     have_canonicalize_file_name=0
781 fi
782 rm -f compat/have_canonicalize_file_name
783
784
785 printf "Checking for getline... "
786 if ${CC} -o compat/have_getline "$srcdir"/compat/have_getline.c > /dev/null 2>&1
787 then
788     printf "Yes.\n"
789     have_getline=1
790 else
791     printf "No (will use our own instead).\n"
792     have_getline=0
793 fi
794 rm -f compat/have_getline
795
796 printf "Checking for strcasestr... "
797 if ${CC} -o compat/have_strcasestr "$srcdir"/compat/have_strcasestr.c > /dev/null 2>&1
798 then
799     printf "Yes.\n"
800     have_strcasestr=1
801 else
802     printf "No (will use our own instead).\n"
803     have_strcasestr=0
804 fi
805 rm -f compat/have_strcasestr
806
807 printf "Checking for strsep... "
808 if ${CC} -o compat/have_strsep "$srcdir"/compat/have_strsep.c > /dev/null 2>&1
809 then
810     printf "Yes.\n"
811     have_strsep="1"
812 else
813     printf "No (will use our own instead).\n"
814     have_strsep="0"
815 fi
816 rm -f compat/have_strsep
817
818 printf "Checking for timegm... "
819 if ${CC} -o compat/have_timegm "$srcdir"/compat/have_timegm.c > /dev/null 2>&1
820 then
821     printf "Yes.\n"
822     have_timegm="1"
823 else
824     printf "No (will use our own instead).\n"
825     have_timegm="0"
826 fi
827 rm -f compat/have_timegm
828
829 printf "Checking for dirent.d_type... "
830 if ${CC} -o compat/have_d_type "$srcdir"/compat/have_d_type.c > /dev/null 2>&1
831 then
832     printf "Yes.\n"
833     have_d_type="1"
834 else
835     printf "No (will use stat instead).\n"
836     have_d_type="0"
837 fi
838 rm -f compat/have_d_type
839
840 printf "Checking for standard version of getpwuid_r... "
841 if ${CC} -o compat/check_getpwuid "$srcdir"/compat/check_getpwuid.c > /dev/null 2>&1
842 then
843     printf "Yes.\n"
844     std_getpwuid=1
845 else
846     printf "No (will define _POSIX_PTHREAD_SEMANTICS to get it).\n"
847     std_getpwuid=0
848 fi
849 rm -f compat/check_getpwuid
850
851 printf "Checking for standard version of asctime_r... "
852 if ${CC} -o compat/check_asctime "$srcdir"/compat/check_asctime.c > /dev/null 2>&1
853 then
854     printf "Yes.\n"
855     std_asctime=1
856 else
857     printf "No (will define _POSIX_PTHREAD_SEMANTICS to get it).\n"
858     std_asctime=0
859 fi
860 rm -f compat/check_asctime
861
862 printf "Checking for rpath support... "
863 if ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1
864 then
865     printf "Yes.\n"
866     rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)"
867 else
868     printf "No (nothing to worry about).\n"
869     rpath_ldflags=""
870 fi
871
872 printf "Checking for -Wl,--as-needed... "
873 if ${CC} -Wl,--as-needed -o minimal minimal.c >/dev/null 2>&1
874 then
875     printf "Yes.\n"
876     as_needed_ldflags="-Wl,--as-needed"
877 else
878     printf "No (nothing to worry about).\n"
879     as_needed_ldflags=""
880 fi
881
882 printf "Checking for -Wl,--no-undefined... "
883 if ${CC} -Wl,--no-undefined -o minimal minimal.c >/dev/null 2>&1
884 then
885     printf "Yes.\n"
886     no_undefined_ldflags="-Wl,--no-undefined"
887 else
888     printf "No (nothing to worry about).\n"
889     no_undefined_ldflags=""
890 fi
891
892 WARN_CXXFLAGS=""
893 printf "Checking for available C++ compiler warning flags... "
894 for flag in -Wall -Wextra -Wwrite-strings; do
895     if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
896     then
897         WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
898     fi
899 done
900 printf "\n\t%s\n" "${WARN_CXXFLAGS}"
901
902 WARN_CFLAGS="${WARN_CXXFLAGS}"
903 printf "Checking for available C compiler warning flags... "
904 for flag in -Wmissing-declarations; do
905     if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
906     then
907         WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
908     fi
909 done
910 printf "\n\t%s\n" "${WARN_CFLAGS}"
911
912 rm -f minimal minimal.c _libversion.c _libversion _libversion.sh
913
914 # construct the Makefile.config
915 cat > Makefile.config <<EOF
916 # This Makefile.config was automatically generated by the ./configure
917 # script of notmuch. If the configure script identified anything
918 # incorrectly, then you can edit this file to try to correct things,
919 # but be warned that if configure is run again it will destroy your
920 # changes, (and this could happen by simply calling "make" if the
921 # configure script is updated).
922
923 # The top-level directory for the source, (the directory containing
924 # the configure script). This may be different than the build
925 # directory (the current directory at the time configure was run).
926 srcdir = ${srcdir}
927 NOTMUCH_SRCDIR = ${NOTMUCH_SRCDIR}
928
929 # subdirectories to build
930 subdirs = ${subdirs}
931
932 configure_options = $@
933
934 # We use vpath directives (rather than the VPATH variable) since the
935 # VPATH variable matches targets as well as prerequisites, (which is
936 # not useful since then a target left-over from a srcdir build would
937 # cause a target to not be built in the non-srcdir build).
938 #
939 # Also, we don't use a single "vpath % \$(srcdir)" here because we
940 # don't want the vpath to trigger for our emacs lisp compilation,
941 # (unless we first find a way to convince emacs to build the .elc
942 # target in a directory other than the directory of the .el
943 # prerequisite). In the meantime, we're actually copying in the .el
944 # files, (which is quite ugly).
945 vpath %.c \$(srcdir)
946 vpath %.cc \$(srcdir)
947 vpath Makefile.% \$(srcdir)
948 vpath %.py \$(srcdir)
949 vpath %.rst \$(srcdir)
950
951 # Library versions (used to make SONAME)
952 # The major version of the library interface. This will control the soname.
953 # As such, this number must be incremented for any incompatible change to
954 # the library interface, (such as the deletion of an API or a major
955 # semantic change that breaks formerly functioning code).
956 #
957 LIBNOTMUCH_VERSION_MAJOR = ${libnotmuch_version_major}
958
959 # The minor version of the library interface. This should be incremented at
960 # the time of release for any additions to the library interface,
961 # (and when it is incremented, the release version of the library should
962 #  be reset to 0).
963 LIBNOTMUCH_VERSION_MINOR = ${libnotmuch_version_minor}
964
965 # The release version the library interface. This should be incremented at
966 # the time of release if there have been no changes to the interface, (but
967 # simply compatible changes to the implementation).
968 LIBNOTMUCH_VERSION_RELEASE = ${libnotmuch_version_release}
969
970 # These are derived from the VERSION macros in lib/notmuch.h so
971 # if you have to change them, something is wrong.
972
973 # The C compiler to use
974 CC = ${CC}
975
976 # The C++ compiler to use
977 CXX = ${CXX}
978
979 # Command to execute emacs from Makefiles
980 EMACS = emacs --quick
981
982 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
983 CFLAGS = ${CFLAGS}
984
985 # Default FLAGS for C preprocessor (can be overridden by user such as "make CPPFLAGS=-I/usr/local/include")
986 CPPFLAGS = ${CPPFLAGS}
987
988 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
989 CXXFLAGS = ${CXXFLAGS}
990
991 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
992 LDFLAGS = ${LDFLAGS}
993
994 # Flags to enable warnings when using the C++ compiler
995 WARN_CXXFLAGS=${WARN_CXXFLAGS}
996
997 # Flags to enable warnings when using the C compiler
998 WARN_CFLAGS=${WARN_CFLAGS}
999
1000 # Name of python interpreter
1001 PYTHON = ${python}
1002
1003 # The prefix to which notmuch should be installed
1004 # Note: If you change this value here, be sure to ensure that the
1005 # LIBDIR_IN_LDCONFIG value below is still set correctly.
1006 prefix = ${PREFIX}
1007
1008 # The directory to which libraries should be installed
1009 # Note: If you change this value here, be sure to ensure that the
1010 # LIBDIR_IN_LDCONFIG value below is still set correctly.
1011 libdir = ${LIBDIR:=\$(prefix)/lib}
1012
1013 # Whether libdir is in a path configured into ldconfig
1014 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
1015
1016 # The directory to which header files should be installed
1017 includedir = ${INCLUDEDIR:=\$(prefix)/include}
1018
1019 # The directory to which man pages should be installed
1020 mandir = ${MANDIR:=\$(prefix)/share/man}
1021
1022 # The directory to which read-only (configuration) files should be installed
1023 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
1024
1025 # The directory to which emacs lisp files should be installed
1026 emacslispdir=${EMACSLISPDIR}
1027
1028 # The directory to which emacs miscellaneous (machine-independent) files should
1029 # be installed
1030 emacsetcdir=${EMACSETCDIR}
1031
1032 # Whether there's an emacs binary available for byte-compiling
1033 HAVE_EMACS = ${have_emacs}
1034
1035 # Whether there's a sphinx-build binary available for building documentation
1036 HAVE_SPHINX=${have_sphinx}
1037
1038 # Whether there's a doxygen binary available for building api documentation
1039 HAVE_DOXYGEN=${have_doxygen}
1040
1041 # The directory to which desktop files should be installed
1042 desktop_dir = \$(prefix)/share/applications
1043
1044 # The directory to which bash completions files should be installed
1045 bash_completion_dir = ${BASHCOMPLETIONDIR:=\$(sysconfdir)/bash_completion.d}
1046
1047 # The directory to which zsh completions files should be installed
1048 zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completion/Unix}
1049
1050 # Whether the canonicalize_file_name function is available (if not, then notmuch will
1051 # build its own version)
1052 HAVE_CANONICALIZE_FILE_NAME = ${have_canonicalize_file_name}
1053
1054 # Whether the getline function is available (if not, then notmuch will
1055 # build its own version)
1056 HAVE_GETLINE = ${have_getline}
1057
1058 # Are the ruby development files (and ruby) available? If not skip
1059 # building/testing ruby bindings.
1060 HAVE_RUBY_DEV = ${have_ruby_dev}
1061
1062 # Whether the strcasestr function is available (if not, then notmuch will
1063 # build its own version)
1064 HAVE_STRCASESTR = ${have_strcasestr}
1065
1066 # Whether the strsep function is available (if not, then notmuch will
1067 # build its own version)
1068 HAVE_STRSEP = ${have_strsep}
1069
1070 # Whether the timegm function is available (if not, then notmuch will
1071 # build its own version)
1072 HAVE_TIMEGM = ${have_timegm}
1073
1074 # Whether struct dirent has d_type (if not, then notmuch will use stat)
1075 HAVE_D_TYPE = ${have_d_type}
1076
1077 # Whether the Xapian version in use supports compaction
1078 HAVE_XAPIAN_COMPACT = ${have_xapian_compact}
1079
1080 # Whether the Xapian version in use supports field processors
1081 HAVE_XAPIAN_FIELD_PROCESSOR = ${have_xapian_field_processor}
1082
1083 # Whether the Xapian version in use supports DB_RETRY_LOCK
1084 HAVE_XAPIAN_DB_RETRY_LOCK = ${have_xapian_db_retry_lock}
1085
1086 # Whether the getpwuid_r function is standards-compliant
1087 # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
1088 # to enable the standards-compliant version -- needed for Solaris)
1089 STD_GETPWUID = ${std_getpwuid}
1090
1091 # Whether the asctime_r function is standards-compliant
1092 # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
1093 # to enable the standards-compliant version -- needed for Solaris)
1094 STD_ASCTIME = ${std_asctime}
1095
1096 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS, FREEBSD, OPENBSD
1097 PLATFORM = ${platform}
1098
1099 # Whether the linker will automatically resolve the dependency of one
1100 # library on another (if not, then linking a binary requires linking
1101 # directly against both)
1102 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
1103
1104 # Flags needed to compile and link against Xapian
1105 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
1106 XAPIAN_LDFLAGS = ${xapian_ldflags}
1107
1108 # Which backend will Xapian use by default?
1109 DEFAULT_XAPIAN_BACKEND = ${default_xapian_backend}
1110
1111 # Flags needed to compile and link against GMime
1112 GMIME_CFLAGS = ${gmime_cflags}
1113 GMIME_LDFLAGS = ${gmime_ldflags}
1114
1115 # Flags needed to compile and link against zlib
1116 ZLIB_CFLAGS = ${zlib_cflags}
1117 ZLIB_LDFLAGS = ${zlib_ldflags}
1118
1119 # Flags needed to compile and link against talloc
1120 TALLOC_CFLAGS = ${talloc_cflags}
1121 TALLOC_LDFLAGS = ${talloc_ldflags}
1122
1123 # Flags needed to have linker set rpath attribute
1124 RPATH_LDFLAGS = ${rpath_ldflags}
1125
1126 # Flags needed to have linker link only to necessary libraries
1127 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
1128
1129 # Flags to have the linker flag undefined symbols in object files
1130 NO_UNDEFINED_LDFLAGS = ${no_undefined_ldflags}
1131
1132 # Whether valgrind header files are available
1133 HAVE_VALGRIND = ${have_valgrind}
1134
1135 # And if so, flags needed at compile time for valgrind macros
1136 VALGRIND_CFLAGS = ${valgrind_cflags}
1137
1138 # Support for emacs
1139 WITH_EMACS = ${WITH_EMACS}
1140
1141 # Support for desktop file
1142 WITH_DESKTOP = ${WITH_DESKTOP}
1143
1144 # Support for bash completion
1145 WITH_BASH = ${WITH_BASH}
1146
1147 # Support for zsh completion
1148 WITH_ZSH = ${WITH_ZSH}
1149
1150 # Combined flags for compiling and linking against all of the above
1151 COMMON_CONFIGURE_CFLAGS = \\
1152         \$(GMIME_CFLAGS) \$(TALLOC_CFLAGS) \$(ZLIB_CFLAGS)      \\
1153         -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \$(VALGRIND_CFLAGS)   \\
1154         -DHAVE_GETLINE=\$(HAVE_GETLINE)                         \\
1155         -DHAVE_CANONICALIZE_FILE_NAME=\$(HAVE_CANONICALIZE_FILE_NAME) \\
1156         -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)                   \\
1157         -DHAVE_STRSEP=\$(HAVE_STRSEP)                           \\
1158         -DHAVE_TIMEGM=\$(HAVE_TIMEGM)                           \\
1159         -DHAVE_D_TYPE=\$(HAVE_D_TYPE)                           \\
1160         -DSTD_GETPWUID=\$(STD_GETPWUID)                         \\
1161         -DSTD_ASCTIME=\$(STD_ASCTIME)                           \\
1162         -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)           \\
1163         -DSILENCE_XAPIAN_DEPRECATION_WARNINGS                   \\
1164         -DHAVE_XAPIAN_FIELD_PROCESSOR=\$(HAVE_XAPIAN_FIELD_PROCESSOR) \\
1165         -DHAVE_XAPIAN_DB_RETRY_LOCK=\$(HAVE_XAPIAN_DB_RETRY_LOCK)
1166
1167 CONFIGURE_CFLAGS = \$(COMMON_CONFIGURE_CFLAGS)
1168
1169 CONFIGURE_CXXFLAGS = \$(COMMON_CONFIGURE_CFLAGS) \$(XAPIAN_CXXFLAGS)
1170
1171 CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(ZLIB_LDFLAGS) \$(XAPIAN_LDFLAGS)
1172 EOF
1173
1174 # construct the sh.config
1175 cat > sh.config <<EOF
1176 # This sh.config was automatically generated by the ./configure
1177 # script of notmuch.
1178
1179 NOTMUCH_SRCDIR='${NOTMUCH_SRCDIR}'
1180
1181 # Whether the Xapian version in use supports compaction
1182 NOTMUCH_HAVE_XAPIAN_COMPACT=${have_xapian_compact}
1183
1184 # Whether the Xapian version in use supports field processors
1185 NOTMUCH_HAVE_XAPIAN_FIELD_PROCESSOR=${have_xapian_field_processor}
1186
1187 # Whether the Xapian version in use supports lock retry
1188 NOTMUCH_HAVE_XAPIAN_DB_RETRY_LOCK=${have_xapian_db_retry_lock}
1189
1190 # Which backend will Xapian use by default?
1191 NOTMUCH_DEFAULT_XAPIAN_BACKEND=${default_xapian_backend}
1192
1193 # do we have man pages?
1194 NOTMUCH_HAVE_MAN=$((have_sphinx))
1195
1196 # Name of python interpreter
1197 NOTMUCH_PYTHON=${python}
1198
1199 # Are the ruby development files (and ruby) available? If not skip
1200 # building/testing ruby bindings.
1201 NOTMUCH_HAVE_RUBY_DEV=${have_ruby_dev}
1202
1203 # Platform we are run on
1204 PLATFORM=${platform}
1205 EOF
1206
1207 # Finally, after everything configured, inform the user how to continue.
1208 cat <<EOF
1209
1210 All required packages were found. You may now run the following
1211 commands to compile and install notmuch:
1212
1213         make
1214         sudo make install
1215
1216 EOF