cc6746c10bae638701c582fdcba07386e517aae8
[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     fi
398
399     rm -f _compact.o _compact.cc
400
401     printf "Checking for Xapian FieldProcessor API... "
402     cat>_field_processor.cc<<EOF
403 #include <xapian.h>
404 class TitleFieldProcessor : public Xapian::FieldProcessor { };
405 EOF
406     if ${CXX} ${CXXFLAGS_for_sh} ${xapian_cxxflags} -c _field_processor.cc -o _field_processor.o > /dev/null 2>&1
407     then
408         have_xapian_field_processor=1
409         printf "Yes.\n"
410     else
411         printf "No. (optional)\n"
412     fi
413
414     rm -f _field_processor.o _field_processor.cc
415
416     default_xapian_backend=""
417     # DB_RETRY_LOCK is only supported on Xapian > 1.3.2
418     have_xapian_db_retry_lock=0
419     if [ $WITH_RETRY_LOCK = "1" ]; then
420         printf "Checking for Xapian lock retry support... "
421         cat>_retry.cc<<EOF
422 #include <xapian.h>
423 int flag = Xapian::DB_RETRY_LOCK;
424 EOF
425         if ${CXX} ${CXXFLAGS_for_sh} ${xapian_cxxflags} -c _retry.cc -o _retry.o > /dev/null 2>&1
426         then
427             have_xapian_db_retry_lock=1
428             printf "Yes.\n"
429         else
430             printf "No. (optional)\n"
431         fi
432         rm -f _retry.o _retry.cc
433     fi
434
435     printf "Testing default Xapian backend... "
436     cat >_default_backend.cc <<EOF
437 #include <xapian.h>
438 int main(int argc, char** argv) {
439    Xapian::WritableDatabase db("test.db",Xapian::DB_CREATE_OR_OPEN);
440 }
441 EOF
442     ${CXX} ${CXXFLAGS_for_sh} ${xapian_cxxflags} _default_backend.cc -o _default_backend ${xapian_ldflags}
443     ./_default_backend
444     if [ -f test.db/iamglass ]; then
445         default_xapian_backend=glass
446     else
447         default_xapian_backend=chert
448     fi
449     printf "%s\n" "${default_xapian_backend}";
450     rm -rf test.db _default_backend _default_backend.cc
451 fi
452
453 # we need to have a version >= 2.6.5 to avoid a crypto bug. We need
454 # 2.6.7 for permissive "From " header handling.
455 GMIME_MINVER=2.6.7
456
457 printf "Checking for GMime development files... "
458 if pkg-config --exists "gmime-2.6 >= $GMIME_MINVER"; then
459     printf "Yes.\n"
460     have_gmime=1
461     gmime_cflags=$(pkg-config --cflags gmime-2.6)
462     gmime_ldflags=$(pkg-config --libs gmime-2.6)
463 else
464     have_gmime=0
465     printf "No.\n"
466     errors=$((errors + 1))
467 fi
468
469 # GMime already depends on Glib >= 2.12, but we use at least one Glib
470 # function that only exists as of 2.22, (g_array_unref)
471 printf "Checking for Glib development files (>= 2.22)... "
472 have_glib=0
473 if pkg-config --exists 'glib-2.0 >= 2.22'; then
474     printf "Yes.\n"
475     have_glib=1
476     # these are included in gmime cflags and ldflags
477     # glib_cflags=$(pkg-config --cflags glib-2.0)
478     # glib_ldflags=$(pkg-config --libs glib-2.0)
479 else
480     printf "No.\n"
481     errors=$((errors + 1))
482 fi
483
484 if ! pkg-config --exists zlib; then
485   ${CC} ${zlib_cflags} -o compat/gen_zlib_pc \
486           "$srcdir"/compat/gen_zlib_pc.c ${zlib_ldflags} > /dev/null 2>&1 &&
487   compat/gen_zlib_pc > compat/zlib.pc &&
488   PKG_CONFIG_PATH="$PKG_CONFIG_PATH":compat &&
489   export PKG_CONFIG_PATH
490   rm -f compat/gen_zlib_pc
491 fi
492
493 printf "Checking for zlib (>= 1.2.5.2)... "
494 have_zlib=0
495 if pkg-config --atleast-version=1.2.5.2 zlib; then
496     printf "Yes.\n"
497     have_zlib=1
498     zlib_cflags=$(pkg-config --cflags zlib)
499     zlib_ldflags=$(pkg-config --libs zlib)
500 else
501     printf "No.\n"
502     errors=$((errors + 1))
503 fi
504
505 printf "Checking for talloc development files... "
506 if pkg-config --exists talloc; then
507     printf "Yes.\n"
508     have_talloc=1
509     talloc_cflags=$(pkg-config --cflags talloc)
510     talloc_ldflags=$(pkg-config --libs talloc)
511 else
512     printf "No.\n"
513     have_talloc=0
514     talloc_cflags=
515     errors=$((errors + 1))
516 fi
517
518 printf "Checking for python... "
519 have_python=0
520
521 for name in ${PYTHON} python python2 python3; do
522     if command -v $name > /dev/null; then
523         have_python=1
524         python=$name
525         printf "Yes (%s).\n" "$name"
526         break
527     fi
528 done
529
530 if [ $have_python -eq 0 ]; then
531     printf "No.\n"
532     errors=$((errors + 1))
533 fi
534
535 printf "Checking for valgrind development files... "
536 if pkg-config --exists valgrind; then
537     printf "Yes.\n"
538     have_valgrind=1
539     valgrind_cflags=$(pkg-config --cflags valgrind)
540 else
541     printf "No (but that's fine).\n"
542     have_valgrind=0
543     valgrind_cflags=
544 fi
545
546 printf "Checking for bash-completion (>= 1.90)... "
547 if pkg-config --atleast-version=1.90 bash-completion; then
548     printf "Yes.\n"
549 else
550     printf "No (will not install bash completion).\n"
551     WITH_BASH=0
552 fi
553
554 if [ -z "${EMACSLISPDIR-}" ]; then
555     EMACSLISPDIR="\$(prefix)/share/emacs/site-lisp"
556 fi
557
558 if [ -z "${EMACSETCDIR-}" ]; then
559     EMACSETCDIR="\$(prefix)/share/emacs/site-lisp"
560 fi
561
562 printf "Checking if emacs is available... "
563 if emacs --quick --batch > /dev/null 2>&1; then
564     printf "Yes.\n"
565     have_emacs=1
566 else
567     printf "No (so will not byte-compile emacs code)\n"
568     have_emacs=0
569 fi
570
571 have_doxygen=0
572 if [ $WITH_API_DOCS = "1" ] ; then
573     printf "Checking if doxygen is available... "
574     if command -v doxygen > /dev/null; then
575         printf "Yes.\n"
576         have_doxygen=1
577     else
578         printf "No (so will not install api docs)\n"
579     fi
580 fi
581
582 have_ruby_dev=0
583 if [ $WITH_RUBY = "1" ] ; then
584     printf "Checking for ruby development files... "
585     if ruby -e "require 'mkmf'"> /dev/null 2>&1; then
586         printf "Yes.\n"
587         have_ruby_dev=1
588     else
589         printf "No (skipping ruby bindings)\n"
590     fi
591 fi
592
593 have_sphinx=0
594 if [ $WITH_DOCS = "1" ] ; then
595     printf "Checking if sphinx is available and supports nroff output... "
596     if command -v sphinx-build > /dev/null && ${python} -m sphinx.writers.manpage > /dev/null 2>&1 ; then
597         printf "Yes.\n"
598         have_sphinx=1
599     else
600         printf "No (so will not install man pages).\n"
601     fi
602 fi
603
604 libdir_in_ldconfig=0
605
606 printf "Checking which platform we are on... "
607 uname=$(uname)
608 if [ $uname = "Darwin" ] ; then
609     printf "Mac OS X.\n"
610     platform=MACOSX
611     linker_resolves_library_dependencies=0
612 elif [ $uname = "SunOS" ] ; then
613     printf "Solaris.\n"
614     platform=SOLARIS
615     linker_resolves_library_dependencies=0
616 elif [ $uname = "FreeBSD" ] ; then
617     printf "FreeBSD.\n"
618     platform=FREEBSD
619     linker_resolves_library_dependencies=0
620 elif [ $uname = "OpenBSD" ] ; then
621     printf "OpenBSD.\n"
622     platform=OPENBSD
623     linker_resolves_library_dependencies=0
624 elif [ $uname = "Linux" ] || [ $uname = "GNU" ] ; then
625     printf "%s\n" "$uname"
626     platform="$uname"
627     linker_resolves_library_dependencies=1
628
629     printf "Checking for %s in ldconfig... " "$libdir_expanded"
630     ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
631     # Separate ldconfig_paths only on newline (not on any potential
632     # embedded space characters in any filenames). Note, we use a
633     # literal newline in the source here rather than something like:
634     #
635     #   IFS=$(printf '\n')
636     #
637     # because the shell's command substitution deletes any trailing newlines.
638     IFS="
639 "
640     for path in $ldconfig_paths; do
641         if [ "$path" = "$libdir_expanded" ]; then
642             libdir_in_ldconfig=1
643         fi
644     done
645     IFS=$DEFAULT_IFS
646     if [ "$libdir_in_ldconfig" = '0' ]; then
647         printf "No (will set RPATH)\n"
648     else
649         printf "Yes\n"
650     fi
651 else
652     printf "Unknown.\n"
653     platform="$uname"
654     linker_resolves_library_dependencies=0
655     cat <<EOF
656
657 *** Warning: Unknown platform. Notmuch might or might not build correctly.
658
659 EOF
660 fi
661
662 printf "Checking byte order... "
663 cat> _byteorder.c <<EOF
664 #include <stdio.h>
665 #include <stdint.h>
666 uint32_t test = 0x34333231;
667 int main() { printf("%.4s\n", (const char*)&test); return 0; }
668 EOF
669 ${CC} ${CFLAGS} _byteorder.c -o _byteorder > /dev/null 2>&1
670 util_byte_order=$(./_byteorder)
671 echo $util_byte_order
672
673 rm -f _byteorder _byteorder.c
674
675 if [ $errors -gt 0 ]; then
676     cat <<EOF
677
678 *** Error: The dependencies of notmuch could not be satisfied. You will
679 need to install the following packages before being able to compile
680 notmuch:
681
682 EOF
683     if [ $have_python -eq 0 ]; then
684         echo "  python interpreter"
685     fi
686     if [ $have_xapian -eq 0 ]; then
687         echo "  Xapian library (including development files such as headers)"
688         echo "  https://xapian.org/"
689     fi
690     if [ $have_zlib -eq 0 ]; then
691         echo "  zlib library (>= version 1.2.5.2, including development files such as headers)"
692         echo "  http://zlib.net/"
693         echo
694     fi
695     if [ $have_gmime -eq 0 ]; then
696         echo "  GMime 2.6 library >= $GMIME_MINVER"
697         echo "  (including development files such as headers)"
698         echo "  http://spruce.sourceforge.net/gmime/"
699         echo
700     fi
701     if [ $have_glib -eq 0 ]; then
702         echo "  Glib library >= 2.22 (including development files such as headers)"
703         echo "  http://ftp.gnome.org/pub/gnome/sources/glib/"
704         echo
705     fi
706     if [ $have_talloc -eq 0 ]; then
707         echo "  The talloc library (including development files such as headers)"
708         echo "  https://talloc.samba.org/"
709         echo
710     fi
711     cat <<EOF
712 With any luck, you're using a modern, package-based operating system
713 that has all of these packages available in the distribution. In that
714 case a simple command will install everything you need. For example:
715
716 On Debian and similar systems:
717
718         sudo apt-get install libxapian-dev libgmime-2.6-dev libtalloc-dev zlib1g-dev
719
720 Or on Fedora and similar systems:
721
722         sudo yum install xapian-core-devel gmime-devel libtalloc-devel zlib-devel
723
724 On other systems, similar commands can be used, but the details of the
725 package names may be different.
726
727 EOF
728     if [ $have_pkg_config -eq 0 ]; then
729 cat <<EOF
730 Note: the pkg-config program is not available. This configure script
731 uses pkg-config to find the compilation flags required to link against
732 the various libraries needed by notmuch. It's possible you simply need
733 to install pkg-config with a command such as:
734
735         sudo apt-get install pkg-config
736 Or:
737         sudo yum install pkgconfig
738
739 But if pkg-config is not available for your system, then you will need
740 to modify the configure script to manually set the cflags and ldflags
741 variables to the correct values to link against each library in each
742 case that pkg-config could not be used to determine those values.
743
744 EOF
745     fi
746 cat <<EOF
747 When you have installed the necessary dependencies, you can run
748 configure again to ensure the packages can be found, or simply run
749 "make" to compile notmuch.
750
751 EOF
752     exit 1
753 fi
754
755 printf "Checking for canonicalize_file_name... "
756 if ${CC} -o compat/have_canonicalize_file_name "$srcdir"/compat/have_canonicalize_file_name.c > /dev/null 2>&1
757 then
758     printf "Yes.\n"
759     have_canonicalize_file_name=1
760 else
761     printf "No (will use our own instead).\n"
762     have_canonicalize_file_name=0
763 fi
764 rm -f compat/have_canonicalize_file_name
765
766
767 printf "Checking for getline... "
768 if ${CC} -o compat/have_getline "$srcdir"/compat/have_getline.c > /dev/null 2>&1
769 then
770     printf "Yes.\n"
771     have_getline=1
772 else
773     printf "No (will use our own instead).\n"
774     have_getline=0
775 fi
776 rm -f compat/have_getline
777
778 printf "Checking for strcasestr... "
779 if ${CC} -o compat/have_strcasestr "$srcdir"/compat/have_strcasestr.c > /dev/null 2>&1
780 then
781     printf "Yes.\n"
782     have_strcasestr=1
783 else
784     printf "No (will use our own instead).\n"
785     have_strcasestr=0
786 fi
787 rm -f compat/have_strcasestr
788
789 printf "Checking for strsep... "
790 if ${CC} -o compat/have_strsep "$srcdir"/compat/have_strsep.c > /dev/null 2>&1
791 then
792     printf "Yes.\n"
793     have_strsep="1"
794 else
795     printf "No (will use our own instead).\n"
796     have_strsep="0"
797 fi
798 rm -f compat/have_strsep
799
800 printf "Checking for timegm... "
801 if ${CC} -o compat/have_timegm "$srcdir"/compat/have_timegm.c > /dev/null 2>&1
802 then
803     printf "Yes.\n"
804     have_timegm="1"
805 else
806     printf "No (will use our own instead).\n"
807     have_timegm="0"
808 fi
809 rm -f compat/have_timegm
810
811 printf "Checking for dirent.d_type... "
812 if ${CC} -o compat/have_d_type "$srcdir"/compat/have_d_type.c > /dev/null 2>&1
813 then
814     printf "Yes.\n"
815     have_d_type="1"
816 else
817     printf "No (will use stat instead).\n"
818     have_d_type="0"
819 fi
820 rm -f compat/have_d_type
821
822 printf "Checking for standard version of getpwuid_r... "
823 if ${CC} -o compat/check_getpwuid "$srcdir"/compat/check_getpwuid.c > /dev/null 2>&1
824 then
825     printf "Yes.\n"
826     std_getpwuid=1
827 else
828     printf "No (will define _POSIX_PTHREAD_SEMANTICS to get it).\n"
829     std_getpwuid=0
830 fi
831 rm -f compat/check_getpwuid
832
833 printf "Checking for standard version of asctime_r... "
834 if ${CC} -o compat/check_asctime "$srcdir"/compat/check_asctime.c > /dev/null 2>&1
835 then
836     printf "Yes.\n"
837     std_asctime=1
838 else
839     printf "No (will define _POSIX_PTHREAD_SEMANTICS to get it).\n"
840     std_asctime=0
841 fi
842 rm -f compat/check_asctime
843
844 printf "Checking for rpath support... "
845 if ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1
846 then
847     printf "Yes.\n"
848     rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)"
849 else
850     printf "No (nothing to worry about).\n"
851     rpath_ldflags=""
852 fi
853
854 printf "Checking for -Wl,--as-needed... "
855 if ${CC} -Wl,--as-needed -o minimal minimal.c >/dev/null 2>&1
856 then
857     printf "Yes.\n"
858     as_needed_ldflags="-Wl,--as-needed"
859 else
860     printf "No (nothing to worry about).\n"
861     as_needed_ldflags=""
862 fi
863
864 printf "Checking for -Wl,--no-undefined... "
865 if ${CC} -Wl,--no-undefined -o minimal minimal.c >/dev/null 2>&1
866 then
867     printf "Yes.\n"
868     no_undefined_ldflags="-Wl,--no-undefined"
869 else
870     printf "No (nothing to worry about).\n"
871     no_undefined_ldflags=""
872 fi
873
874 WARN_CXXFLAGS=""
875 printf "Checking for available C++ compiler warning flags... "
876 for flag in -Wall -Wextra -Wwrite-strings; do
877     if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
878     then
879         WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
880     fi
881 done
882 printf "\n\t%s\n" "${WARN_CXXFLAGS}"
883
884 WARN_CFLAGS="${WARN_CXXFLAGS}"
885 printf "Checking for available C compiler warning flags... "
886 for flag in -Wmissing-declarations; do
887     if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
888     then
889         WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
890     fi
891 done
892 printf "\n\t%s\n" "${WARN_CFLAGS}"
893
894 rm -f minimal minimal.c _libversion.c _libversion _libversion.sh
895
896 # construct the Makefile.config
897 cat > Makefile.config <<EOF
898 # This Makefile.config was automatically generated by the ./configure
899 # script of notmuch. If the configure script identified anything
900 # incorrectly, then you can edit this file to try to correct things,
901 # but be warned that if configure is run again it will destroy your
902 # changes, (and this could happen by simply calling "make" if the
903 # configure script is updated).
904
905 # The top-level directory for the source, (the directory containing
906 # the configure script). This may be different than the build
907 # directory (the current directory at the time configure was run).
908 srcdir = ${srcdir}
909
910 # subdirectories to build
911 subdirs = ${subdirs}
912
913 configure_options = $@
914
915 # We use vpath directives (rather than the VPATH variable) since the
916 # VPATH variable matches targets as well as prerequisites, (which is
917 # not useful since then a target left-over from a srcdir build would
918 # cause a target to not be built in the non-srcdir build).
919 #
920 # Also, we don't use a single "vpath % \$(srcdir)" here because we
921 # don't want the vpath to trigger for our emacs lisp compilation,
922 # (unless we first find a way to convince emacs to build the .elc
923 # target in a directory other than the directory of the .el
924 # prerequisite). In the meantime, we're actually copying in the .el
925 # files, (which is quite ugly).
926 vpath %.c \$(srcdir)
927 vpath %.cc \$(srcdir)
928 vpath Makefile.% \$(srcdir)
929 vpath %.py \$(srcdir)
930 vpath %.rst \$(srcdir)
931
932 # Library versions (used to make SONAME)
933 # The major version of the library interface. This will control the soname.
934 # As such, this number must be incremented for any incompatible change to
935 # the library interface, (such as the deletion of an API or a major
936 # semantic change that breaks formerly functioning code).
937 #
938 LIBNOTMUCH_VERSION_MAJOR = ${libnotmuch_version_major}
939
940 # The minor version of the library interface. This should be incremented at
941 # the time of release for any additions to the library interface,
942 # (and when it is incremented, the release version of the library should
943 #  be reset to 0).
944 LIBNOTMUCH_VERSION_MINOR = ${libnotmuch_version_minor}
945
946 # The release version the library interface. This should be incremented at
947 # the time of release if there have been no changes to the interface, (but
948 # simply compatible changes to the implementation).
949 LIBNOTMUCH_VERSION_RELEASE = ${libnotmuch_version_release}
950
951 # These are derived from the VERSION macros in lib/notmuch.h so
952 # if you have to change them, something is wrong.
953
954 # The C compiler to use
955 CC = ${CC}
956
957 # The C++ compiler to use
958 CXX = ${CXX}
959
960 # Command to execute emacs from Makefiles
961 EMACS = emacs --quick
962
963 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
964 CFLAGS = ${CFLAGS}
965
966 # Default FLAGS for C preprocessor (can be overridden by user such as "make CPPFLAGS=-I/usr/local/include")
967 CPPFLAGS = ${CPPFLAGS}
968
969 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
970 CXXFLAGS = ${CXXFLAGS}
971
972 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
973 LDFLAGS = ${LDFLAGS}
974
975 # Flags to enable warnings when using the C++ compiler
976 WARN_CXXFLAGS=${WARN_CXXFLAGS}
977
978 # Flags to enable warnings when using the C compiler
979 WARN_CFLAGS=${WARN_CFLAGS}
980
981 # Name of python interpreter
982 PYTHON = ${python}
983
984 # The prefix to which notmuch should be installed
985 # Note: If you change this value here, be sure to ensure that the
986 # LIBDIR_IN_LDCONFIG value below is still set correctly.
987 prefix = ${PREFIX}
988
989 # The directory to which libraries should be installed
990 # Note: If you change this value here, be sure to ensure that the
991 # LIBDIR_IN_LDCONFIG value below is still set correctly.
992 libdir = ${LIBDIR:=\$(prefix)/lib}
993
994 # byte order within a 32 bit word. 1234 = little, 4321 = big, 0 = guess
995 UTIL_BYTE_ORDER = ${util_byte_order}
996
997 # Whether libdir is in a path configured into ldconfig
998 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
999
1000 # The directory to which header files should be installed
1001 includedir = ${INCLUDEDIR:=\$(prefix)/include}
1002
1003 # The directory to which man pages should be installed
1004 mandir = ${MANDIR:=\$(prefix)/share/man}
1005
1006 # The directory to which read-only (configuration) files should be installed
1007 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
1008
1009 # The directory to which emacs lisp files should be installed
1010 emacslispdir=${EMACSLISPDIR}
1011
1012 # The directory to which emacs miscellaneous (machine-independent) files should
1013 # be installed
1014 emacsetcdir=${EMACSETCDIR}
1015
1016 # Whether there's an emacs binary available for byte-compiling
1017 HAVE_EMACS = ${have_emacs}
1018
1019 # Whether there's a sphinx-build binary available for building documentation
1020 HAVE_SPHINX=${have_sphinx}
1021
1022 # Whether there's a doxygen binary available for building api documentation
1023 HAVE_DOXYGEN=${have_doxygen}
1024
1025 # The directory to which desktop files should be installed
1026 desktop_dir = \$(prefix)/share/applications
1027
1028 # The directory to which bash completions files should be installed
1029 bash_completion_dir = ${BASHCOMPLETIONDIR:=\$(sysconfdir)/bash_completion.d}
1030
1031 # The directory to which zsh completions files should be installed
1032 zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completion/Unix}
1033
1034 # Whether the canonicalize_file_name function is available (if not, then notmuch will
1035 # build its own version)
1036 HAVE_CANONICALIZE_FILE_NAME = ${have_canonicalize_file_name}
1037
1038 # Whether the getline function is available (if not, then notmuch will
1039 # build its own version)
1040 HAVE_GETLINE = ${have_getline}
1041
1042 # Are the ruby development files (and ruby) available? If not skip
1043 # building/testing ruby bindings.
1044 HAVE_RUBY_DEV = ${have_ruby_dev}
1045
1046 # Whether the strcasestr function is available (if not, then notmuch will
1047 # build its own version)
1048 HAVE_STRCASESTR = ${have_strcasestr}
1049
1050 # Whether the strsep function is available (if not, then notmuch will
1051 # build its own version)
1052 HAVE_STRSEP = ${have_strsep}
1053
1054 # Whether the timegm function is available (if not, then notmuch will
1055 # build its own version)
1056 HAVE_TIMEGM = ${have_timegm}
1057
1058 # Whether struct dirent has d_type (if not, then notmuch will use stat)
1059 HAVE_D_TYPE = ${have_d_type}
1060
1061 # Whether the Xapian version in use supports compaction
1062 HAVE_XAPIAN_COMPACT = ${have_xapian_compact}
1063
1064 # Whether the Xapian version in use supports field processors
1065 HAVE_XAPIAN_FIELD_PROCESSOR = ${have_xapian_field_processor}
1066
1067 # Whether the Xapian version in use supports DB_RETRY_LOCK
1068 HAVE_XAPIAN_DB_RETRY_LOCK = ${have_xapian_db_retry_lock}
1069
1070 # Whether the getpwuid_r function is standards-compliant
1071 # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
1072 # to enable the standards-compliant version -- needed for Solaris)
1073 STD_GETPWUID = ${std_getpwuid}
1074
1075 # Whether the asctime_r function is standards-compliant
1076 # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
1077 # to enable the standards-compliant version -- needed for Solaris)
1078 STD_ASCTIME = ${std_asctime}
1079
1080 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS, FREEBSD, OPENBSD
1081 PLATFORM = ${platform}
1082
1083 # Whether the linker will automatically resolve the dependency of one
1084 # library on another (if not, then linking a binary requires linking
1085 # directly against both)
1086 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
1087
1088 # Flags needed to compile and link against Xapian
1089 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
1090 XAPIAN_LDFLAGS = ${xapian_ldflags}
1091
1092 # Which backend will Xapian use by default?
1093 DEFAULT_XAPIAN_BACKEND = ${default_xapian_backend}
1094
1095 # Flags needed to compile and link against GMime
1096 GMIME_CFLAGS = ${gmime_cflags}
1097 GMIME_LDFLAGS = ${gmime_ldflags}
1098
1099 # Flags needed to compile and link against zlib
1100 ZLIB_CFLAGS = ${zlib_cflags}
1101 ZLIB_LDFLAGS = ${zlib_ldflags}
1102
1103 # Flags needed to compile and link against talloc
1104 TALLOC_CFLAGS = ${talloc_cflags}
1105 TALLOC_LDFLAGS = ${talloc_ldflags}
1106
1107 # Flags needed to have linker set rpath attribute
1108 RPATH_LDFLAGS = ${rpath_ldflags}
1109
1110 # Flags needed to have linker link only to necessary libraries
1111 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
1112
1113 # Flags to have the linker flag undefined symbols in object files
1114 NO_UNDEFINED_LDFLAGS = ${no_undefined_ldflags}
1115
1116 # Whether valgrind header files are available
1117 HAVE_VALGRIND = ${have_valgrind}
1118
1119 # And if so, flags needed at compile time for valgrind macros
1120 VALGRIND_CFLAGS = ${valgrind_cflags}
1121
1122 # Support for emacs
1123 WITH_EMACS = ${WITH_EMACS}
1124
1125 # Support for bash completion
1126 WITH_BASH = ${WITH_BASH}
1127
1128 # Support for zsh completion
1129 WITH_ZSH = ${WITH_ZSH}
1130
1131 # Combined flags for compiling and linking against all of the above
1132 COMMON_CONFIGURE_CFLAGS = \\
1133         \$(GMIME_CFLAGS) \$(TALLOC_CFLAGS) \$(ZLIB_CFLAGS)      \\
1134         -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \$(VALGRIND_CFLAGS)   \\
1135         -DHAVE_GETLINE=\$(HAVE_GETLINE)                         \\
1136         -DHAVE_CANONICALIZE_FILE_NAME=\$(HAVE_CANONICALIZE_FILE_NAME) \\
1137         -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)                   \\
1138         -DHAVE_STRSEP=\$(HAVE_STRSEP)                           \\
1139         -DHAVE_TIMEGM=\$(HAVE_TIMEGM)                           \\
1140         -DHAVE_D_TYPE=\$(HAVE_D_TYPE)                           \\
1141         -DSTD_GETPWUID=\$(STD_GETPWUID)                         \\
1142         -DSTD_ASCTIME=\$(STD_ASCTIME)                           \\
1143         -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)           \\
1144         -DHAVE_XAPIAN_FIELD_PROCESSOR=\$(HAVE_XAPIAN_FIELD_PROCESSOR) \\
1145         -DHAVE_XAPIAN_DB_RETRY_LOCK=\$(HAVE_XAPIAN_DB_RETRY_LOCK) \\
1146         -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)
1147
1148 CONFIGURE_CFLAGS = \$(COMMON_CONFIGURE_CFLAGS)
1149
1150 CONFIGURE_CXXFLAGS = \$(COMMON_CONFIGURE_CFLAGS) \$(XAPIAN_CXXFLAGS)
1151
1152 CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(ZLIB_LDFLAGS) \$(XAPIAN_LDFLAGS)
1153 EOF
1154
1155 # construct the sh.config
1156 cat > sh.config <<EOF
1157 # This sh.config was automatically generated by the ./configure
1158 # script of notmuch.
1159
1160 # Whether the Xapian version in use supports compaction
1161 NOTMUCH_HAVE_XAPIAN_COMPACT=${have_xapian_compact}
1162
1163 # Whether the Xapian version in use supports field processors
1164 NOTMUCH_HAVE_XAPIAN_FIELD_PROCESSOR=${have_xapian_field_processor}
1165
1166 # Whether the Xapian version in use supports lock retry
1167 NOTMUCH_HAVE_XAPIAN_DB_RETRY_LOCK=${have_xapian_db_retry_lock}
1168
1169 # Which backend will Xapian use by default?
1170 NOTMUCH_DEFAULT_XAPIAN_BACKEND=${default_xapian_backend}
1171
1172 # do we have man pages?
1173 NOTMUCH_HAVE_MAN=$((have_sphinx))
1174
1175 # Name of python interpreter
1176 NOTMUCH_PYTHON=${python}
1177
1178 # Are the ruby development files (and ruby) available? If not skip
1179 # building/testing ruby bindings.
1180 NOTMUCH_HAVE_RUBY_DEV=${have_ruby_dev}
1181 EOF
1182
1183 # Finally, after everything configured, inform the user how to continue.
1184 cat <<EOF
1185
1186 All required packages were found. You may now run the following
1187 commands to compile and install notmuch:
1188
1189         make
1190         sudo make install
1191
1192 EOF