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