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