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