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