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