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