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