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