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