]> git.notmuchmail.org Git - notmuch/blob - configure
crypto: make crypto ctx initialization an array
[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 usage ()
75 {
76     cat <<EOF
77 Usage: ./configure [options]...
78
79 This script configures notmuch to build on your system.
80
81 It verifies that dependencies are available, determines flags needed
82 to compile and link against various required libraries, and identifies
83 whether various system functions can be used or if locally-provided
84 replacements will be built instead.
85
86 Finally, it allows you to control various aspects of the build and
87 installation process.
88
89 First, some common variables can specified via environment variables:
90
91         CC              The C compiler to use
92         CFLAGS          Flags to pass to the C compiler
93         CPPFLAGS        Flags to pass to the C preprocessor
94         CXX             The C++ compiler to use
95         CXXFLAGS        Flags to pass to the C compiler
96         LDFLAGS         Flags to pass when linking
97
98 Each of these values can further be controlled by specifying them
99 later on the "make" command line.
100
101 Other environment variables can be used to control configure itself,
102 (and for which there is no equivalent build-time control):
103
104         XAPIAN_CONFIG   The program to use to determine flags for
105                         compiling and linking against the Xapian
106                         library. [$XAPIAN_CONFIG]
107         PYTHON          Name of python command to use in
108                         configure and the test suite.
109
110 Additionally, various options can be specified on the configure
111 command line.
112
113         --prefix=PREFIX Install files in PREFIX [$PREFIX]
114
115 By default, "make install" will install the resulting program to
116 $PREFIX/bin, documentation to $PREFIX/man, etc. You can
117 specify an installation prefix other than $PREFIX using
118 --prefix, for instance:
119
120         ./configure --prefix=\$HOME
121
122 Fine tuning of some installation directories is available:
123
124         --libdir=DIR            Install libraries to DIR [PREFIX/lib]
125         --includedir=DIR        Install header files to DIR [PREFIX/include]
126         --mandir=DIR            Install man pages to DIR [PREFIX/share/man]
127         --sysconfdir=DIR        Read-only single-machine data [PREFIX/etc]
128         --emacslispdir=DIR      Emacs code [PREFIX/share/emacs/site-lisp]
129         --emacsetcdir=DIR       Emacs miscellaneous files [PREFIX/share/emacs/site-lisp]
130         --bashcompletiondir=DIR Bash completions files [SYSCONFDIR/bash_completion.d]
131         --zshcompletiondir=DIR  Zsh completions files [PREFIX/share/zsh/functions/Completion/Unix]
132
133 Some features can be disabled (--with-feature=no is equivalent to
134 --without-feature) :
135
136         --without-bash-completion       Do not install bash completions files
137         --without-docs                  Do not install documentation and man pages
138         --without-emacs                 Do not install lisp file
139         --without-ruby                  Do not install ruby bindings
140         --without-zsh-completion        Do not install zsh completions files
141
142 Additional options are accepted for compatibility with other
143 configure-script calling conventions, but don't do anything yet:
144
145         --build=<cpu>-<vendor>-<os>     Currently ignored
146         --host=<cpu>-<vendor>-<os>      Currently ignored
147         --infodir=DIR                   Currently ignored
148         --datadir=DIR                   Currently ignored
149         --localstatedir=DIR             Currently ignored
150         --libexecdir=DIR                Currently ignored
151         --disable-maintainer-mode       Currently ignored
152         --disable-dependency-tracking   Currently ignored
153
154 EOF
155 }
156
157 # Parse command-line options
158 for option; do
159     if [ "${option}" = '--help' ] ; then
160         usage
161         exit 0
162     elif [ "${option%%=*}" = '--prefix' ] ; then
163         PREFIX="${option#*=}"
164     elif [ "${option%%=*}" = '--libdir' ] ; then
165         LIBDIR="${option#*=}"
166     elif [ "${option%%=*}" = '--includedir' ] ; then
167         INCLUDEDIR="${option#*=}"
168     elif [ "${option%%=*}" = '--mandir' ] ; then
169         MANDIR="${option#*=}"
170     elif [ "${option%%=*}" = '--sysconfdir' ] ; then
171         SYSCONFDIR="${option#*=}"
172     elif [ "${option%%=*}" = '--emacslispdir' ] ; then
173         EMACSLISPDIR="${option#*=}"
174     elif [ "${option%%=*}" = '--emacsetcdir' ] ; then
175         EMACSETCDIR="${option#*=}"
176     elif [ "${option%%=*}" = '--bashcompletiondir' ] ; then
177         BASHCOMPLETIONDIR="${option#*=}"
178     elif [ "${option%%=*}" = '--zshcompletiondir' ] ; then
179         ZSHCOMLETIONDIR="${option#*=}"
180     elif [ "${option%%=*}" = '--with-docs' ]; then
181         if [ "${option#*=}" = 'no' ]; then
182             WITH_DOCS=0
183         else
184             WITH_DOCS=1
185         fi
186     elif [ "${option}" = '--without-docs' ] ; then
187         WITH_DOCS=0
188     elif [ "${option%%=*}" = '--with-emacs' ]; then
189         if [ "${option#*=}" = 'no' ]; then
190             WITH_EMACS=0
191         else
192             WITH_EMACS=1
193         fi
194     elif [ "${option}" = '--without-emacs' ] ; then
195         WITH_EMACS=0
196     elif [ "${option%%=*}" = '--with-bash-completion' ]; then
197         if [ "${option#*=}" = 'no' ]; then
198             WITH_BASH=0
199         else
200             WITH_BASH=1
201         fi
202     elif [ "${option}" = '--without-bash-completion' ] ; then
203         WITH_BASH=0
204     elif [ "${option%%=*}" = '--with-ruby' ]; then
205         if [ "${option#*=}" = 'no' ]; then
206             WITH_RUBY=0
207         else
208             WITH_RUBY=1
209         fi
210     elif [ "${option}" = '--without-ruby' ] ; then
211         WITH_RUBY=0
212     elif [ "${option%%=*}" = '--with-zsh-completion' ]; then
213         if [ "${option#*=}" = 'no' ]; then
214             WITH_ZSH=0
215         else
216             WITH_ZSH=1
217         fi
218     elif [ "${option}" = '--without-zsh-completion' ] ; then
219         WITH_ZSH=0
220     elif [ "${option%%=*}" = '--build' ] ; then
221         true
222     elif [ "${option%%=*}" = '--host' ] ; then
223         true
224     elif [ "${option%%=*}" = '--infodir' ] ; then
225         true
226     elif [ "${option%%=*}" = '--datadir' ] ; then
227         true
228     elif [ "${option%%=*}" = '--localstatedir' ] ; then
229         true
230     elif [ "${option%%=*}" = '--libexecdir' ] ; then
231         true
232     elif [ "${option}" = '--disable-maintainer-mode' ] ; then
233         true
234     elif [ "${option}" = '--disable-dependency-tracking' ] ; then
235         true
236     else
237         echo "Unrecognized option: ${option}"
238         echo "See:"
239         echo "  $0 --help"
240         echo ""
241         exit 1
242     fi
243 done
244
245 # We set this value early, (rather than just while printing the
246 # Makefile.config file later like most values), because we need to
247 # actually investigate this value compared to the ldconfig_paths value
248 # below.
249 if [ -z "$LIBDIR" ] ; then
250     libdir_expanded="${PREFIX}/lib"
251 else
252     # very non-general variable expansion
253     libdir_expanded=`echo "$LIBDIR" | sed "s|\\${prefix}|${PREFIX}|g; s|\\$prefix/|${PREFIX}/|; s|//*|/|g"`
254 fi
255
256 cat <<EOF
257 Welcome to Notmuch, a system for indexing, searching and tagging your email.
258
259 We hope that the process of building and installing notmuch is quick
260 and smooth so that you can soon be reading and processing your email
261 more efficiently than ever.
262
263 If anything goes wrong in the configure process, you can override any
264 decisions it makes by manually editing the Makefile.config file that
265 it creates. Also please do as much as you can to figure out what could
266 be different on your machine compared to those of the notmuch
267 developers. Then, please email those details to the Notmuch list
268 (notmuch@notmuchmail.org) so that we can hopefully make future
269 versions of notmuch easier for you to use.
270
271 We'll now investigate your system to verify that all required
272 dependencies are available:
273
274 EOF
275
276 errors=0
277 printf "int main(void){return 0;}\n" > minimal.c
278
279 printf "Sanity checking C compilation environment... "
280 if ${CC} ${CFLAGS} ${CPPFLAGS} minimal.c ${LDFLAGS} -o minimal > /dev/null 2>&1
281 then
282     printf "OK.\n"
283 else
284     printf "Fail.\n"
285     errors=$((errors + 1))
286 fi
287
288 printf "Sanity checking C++ compilation environment... "
289 if ${CXX} ${CXXFLAGS_for_sh} ${CPPFLAGS} minimal.c ${LDFLAGS} -o minimal > /dev/null 2>&1
290 then
291     printf "OK.\n"
292 else
293     printf "Fail.\n"
294     errors=$((errors + 1))
295 fi
296
297 if [ $errors -gt 0 ]; then
298     cat <<EOF
299 *** Error: Initial sanity checking of environment failed.  Please try
300 running configure in a clean environment, and if the problem persists,
301 report a bug.
302 EOF
303     rm -f minimal minimal.c
304     exit 1
305 fi
306
307 printf "Reading libnotmuch version from source... "
308 cat > _libversion.c <<EOF
309 #include <stdio.h>
310 #include "lib/notmuch.h"
311 int main(void) {
312     printf("libnotmuch_version_major=%d\n",
313                 LIBNOTMUCH_MAJOR_VERSION);
314     printf("libnotmuch_version_minor=%d\n",
315                 LIBNOTMUCH_MINOR_VERSION);
316     printf("libnotmuch_version_release=%d\n",
317                 LIBNOTMUCH_MICRO_VERSION);
318     return 0;
319 }
320 EOF
321 if ${CC} ${CFLAGS} _libversion.c -o _libversion > /dev/null 2>&1 && \
322        ./_libversion > _libversion.sh && . ./_libversion.sh
323 then
324     printf "OK.\n"
325 else
326     cat <<EOF
327
328 *** Error: Reading lib/notmuch.h failed.
329 Please try running configure again in a clean environment, and if the
330 problem persists, report a bug.
331 EOF
332     rm -f _libversion _libversion.c _libversion.sh
333     exit 1
334 fi
335
336 if pkg-config --version > /dev/null 2>&1; then
337     have_pkg_config=1
338 else
339     have_pkg_config=0
340 fi
341
342 printf "Checking for Xapian development files... "
343 have_xapian=0
344 for xapian_config in ${XAPIAN_CONFIG}; do
345     if ${xapian_config} --version > /dev/null 2>&1; then
346         xapian_version=$(${xapian_config} --version | sed -e 's/.* //')
347         printf "Yes (%s).\n" ${xapian_version}
348         have_xapian=1
349         xapian_cxxflags=$(${xapian_config} --cxxflags)
350         xapian_ldflags=$(${xapian_config} --libs)
351         break
352     fi
353 done
354 if [ ${have_xapian} = "0" ]; then
355     printf "No.\n"
356     errors=$((errors + 1))
357 fi
358
359 # Compaction is only supported on Xapian > 1.2.6
360 have_xapian_compact=0
361 if [ ${have_xapian} = "1" ]; then
362     printf "Checking for Xapian compaction support... "
363     case "${xapian_version}" in
364         0.*|1.[01].*|1.2.[0-5])
365             printf "No (only available with Xapian > 1.2.6).\n" ;;
366         [1-9]*.[0-9]*.[0-9]*)
367             have_xapian_compact=1
368             printf "Yes.\n" ;;
369         *)
370             printf "Unknown version.\n" ;;
371     esac
372 fi
373
374
375 # we need to have a version >= 2.6.5 to avoid a crypto bug. We need
376 # 2.6.7 for permissive "From " header handling.
377 GMIME_MINVER=2.6.7
378
379 printf "Checking for GMime development files... "
380 if pkg-config --exists "gmime-2.6 >= $GMIME_MINVER"; then
381     printf "Yes.\n"
382     have_gmime=1
383     gmime_cflags=$(pkg-config --cflags gmime-2.6)
384     gmime_ldflags=$(pkg-config --libs gmime-2.6)
385 else
386     have_gmime=0
387     printf "No.\n"
388     errors=$((errors + 1))
389 fi
390
391 # GMime already depends on Glib >= 2.12, but we use at least one Glib
392 # function that only exists as of 2.22, (g_array_unref)
393 printf "Checking for Glib development files (>= 2.22)... "
394 have_glib=0
395 if pkg-config --exists 'glib-2.0 >= 2.22'; then
396     printf "Yes.\n"
397     have_glib=1
398     glib_cflags=$(pkg-config --cflags glib-2.0)
399     glib_ldflags=$(pkg-config --libs glib-2.0)
400 else
401     printf "No.\n"
402     errors=$((errors + 1))
403 fi
404
405 if ! pkg-config --exists zlib; then
406   ${CC} ${zlib_cflags} -o compat/gen_zlib_pc \
407           "$srcdir"/compat/gen_zlib_pc.c ${zlib_ldflags} > /dev/null 2>&1 &&
408   compat/gen_zlib_pc > compat/zlib.pc &&
409   PKG_CONFIG_PATH="$PKG_CONFIG_PATH":compat &&
410   export PKG_CONFIG_PATH
411   rm -f compat/gen_zlib_pc
412 fi
413
414 printf "Checking for zlib (>= 1.2.5.2)... "
415 have_zlib=0
416 if pkg-config --atleast-version=1.2.5.2 zlib; then
417     printf "Yes.\n"
418     have_zlib=1
419     zlib_cflags=$(pkg-config --cflags zlib)
420     zlib_ldflags=$(pkg-config --libs zlib)
421 else
422     printf "No.\n"
423     errors=$((errors + 1))
424 fi
425
426 printf "Checking for talloc development files... "
427 if pkg-config --exists talloc; then
428     printf "Yes.\n"
429     have_talloc=1
430     talloc_cflags=$(pkg-config --cflags talloc)
431     talloc_ldflags=$(pkg-config --libs talloc)
432 else
433     printf "No.\n"
434     have_talloc=0
435     talloc_cflags=
436     errors=$((errors + 1))
437 fi
438
439 printf "Checking for python... "
440 have_python=0
441
442 for name in ${PYTHON} python python2 python3; do
443     if command -v $name > /dev/null; then
444         have_python=1
445         python=$name
446         printf "Yes ($name).\n"
447         break
448     fi
449 done
450
451 if [ $have_python -eq 0 ]; then
452     printf "No.\n"
453     errors=$((errors + 1))
454 fi
455
456 printf "Checking for valgrind development files... "
457 if pkg-config --exists valgrind; then
458     printf "Yes.\n"
459     have_valgrind=1
460     valgrind_cflags=$(pkg-config --cflags valgrind)
461 else
462     printf "No (but that's fine).\n"
463     have_valgrind=0
464 fi
465
466 printf "Checking for bash-completion (>= 1.90)... "
467 if pkg-config --atleast-version=1.90 bash-completion; then
468     printf "Yes.\n"
469 else
470     printf "No (will not install bash completion).\n"
471     WITH_BASH=0
472 fi
473
474 if [ -z "${EMACSLISPDIR}" ]; then
475     EMACSLISPDIR='$(prefix)/share/emacs/site-lisp'
476 fi
477
478 if [ -z "${EMACSETCDIR}" ]; then
479     EMACSETCDIR='$(prefix)/share/emacs/site-lisp'
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 "  GMime 2.6 library >= $GMIME_MINVER"
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 _libversion.c _libversion _libversion.sh
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 # Library versions (used to make SONAME)
851 # The major version of the library interface. This will control the soname.
852 # As such, this number must be incremented for any incompatible change to
853 # the library interface, (such as the deletion of an API or a major
854 # semantic change that breaks formerly functioning code).
855 #
856 LIBNOTMUCH_VERSION_MAJOR = ${libnotmuch_version_major}
857
858 # The minor version of the library interface. This should be incremented at
859 # the time of release for any additions to the library interface,
860 # (and when it is incremented, the release version of the library should
861 #  be reset to 0).
862 LIBNOTMUCH_VERSION_MINOR = ${libnotmuch_version_minor}
863
864 # The release version the library interface. This should be incremented at
865 # the time of release if there have been no changes to the interface, (but
866 # simply compatible changes to the implementation).
867 LIBNOTMUCH_VERSION_RELEASE = ${libnotmuch_version_release}
868
869 # These are derived from the VERSION macros in lib/notmuch.h so
870 # if you have to change them, something is wrong.
871
872 # The C compiler to use
873 CC = ${CC}
874
875 # The C++ compiler to use
876 CXX = ${CXX}
877
878 # Command to execute emacs from Makefiles
879 EMACS = emacs --quick
880
881 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
882 CFLAGS = ${CFLAGS}
883
884 # Default FLAGS for C preprocessor (can be overridden by user such as "make CPPFLAGS=-I/usr/local/include")
885 CPPFLAGS = ${CPPFLAGS}
886
887 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
888 CXXFLAGS = ${CXXFLAGS}
889
890 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
891 LDFLAGS = ${LDFLAGS}
892
893 # Flags to enable warnings when using the C++ compiler
894 WARN_CXXFLAGS=${WARN_CXXFLAGS}
895
896 # Flags to enable warnings when using the C compiler
897 WARN_CFLAGS=${WARN_CFLAGS}
898
899 # Name of python interpreter
900 PYTHON = ${python}
901
902 # The prefix to which notmuch should be installed
903 # Note: If you change this value here, be sure to ensure that the
904 # LIBDIR_IN_LDCONFIG value below is still set correctly.
905 prefix = ${PREFIX}
906
907 # The directory to which libraries should be installed
908 # Note: If you change this value here, be sure to ensure that the
909 # LIBDIR_IN_LDCONFIG value below is still set correctly.
910 libdir = ${LIBDIR:=\$(prefix)/lib}
911
912 # byte order within a 32 bit word. 1234 = little, 4321 = big, 0 = guess
913 UTIL_BYTE_ORDER = ${util_byte_order}
914
915 # Whether libdir is in a path configured into ldconfig
916 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
917
918 # The directory to which header files should be installed
919 includedir = ${INCLUDEDIR:=\$(prefix)/include}
920
921 # The directory to which man pages should be installed
922 mandir = ${MANDIR:=\$(prefix)/share/man}
923
924 # The directory to which read-only (configuration) files should be installed
925 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
926
927 # The directory to which emacs lisp files should be installed
928 emacslispdir=${EMACSLISPDIR}
929
930 # The directory to which emacs miscellaneous (machine-independent) files should
931 # be installed
932 emacsetcdir=${EMACSETCDIR}
933
934 # Whether there's an emacs binary available for byte-compiling
935 HAVE_EMACS = ${have_emacs}
936
937 # Whether there's a sphinx-build binary available for building documentation
938 HAVE_SPHINX=${have_sphinx}
939
940 # Whether there's a doxygen binary available for building api documentation
941 HAVE_DOXYGEN=${have_doxygen}
942
943 # The directory to which desktop files should be installed
944 desktop_dir = \$(prefix)/share/applications
945
946 # The directory to which bash completions files should be installed
947 bash_completion_dir = ${BASHCOMPLETIONDIR:=\$(sysconfdir)/bash_completion.d}
948
949 # The directory to which zsh completions files should be installed
950 zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completion/Unix}
951
952 # Whether the canonicalize_file_name function is available (if not, then notmuch will
953 # build its own version)
954 HAVE_CANONICALIZE_FILE_NAME = ${have_canonicalize_file_name}
955
956 # Whether the getline function is available (if not, then notmuch will
957 # build its own version)
958 HAVE_GETLINE = ${have_getline}
959
960 # Are the ruby development files (and ruby) available? If not skip
961 # building/testing ruby bindings.
962 HAVE_RUBY_DEV = ${have_ruby_dev}
963
964 # Whether the strcasestr function is available (if not, then notmuch will
965 # build its own version)
966 HAVE_STRCASESTR = ${have_strcasestr}
967
968 # Whether the strsep function is available (if not, then notmuch will
969 # build its own version)
970 HAVE_STRSEP = ${have_strsep}
971
972 # Whether struct dirent has d_type (if not, then notmuch will use stat)
973 HAVE_D_TYPE = ${have_d_type}
974
975 # Whether the Xapian version in use supports compaction
976 HAVE_XAPIAN_COMPACT = ${have_xapian_compact}
977
978 # Whether the getpwuid_r function is standards-compliant
979 # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
980 # to enable the standards-compliant version -- needed for Solaris)
981 STD_GETPWUID = ${std_getpwuid}
982
983 # Whether the asctime_r function is standards-compliant
984 # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
985 # to enable the standards-compliant version -- needed for Solaris)
986 STD_ASCTIME = ${std_asctime}
987
988 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS, FREEBSD, OPENBSD
989 PLATFORM = ${platform}
990
991 # Whether the linker will automatically resolve the dependency of one
992 # library on another (if not, then linking a binary requires linking
993 # directly against both)
994 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
995
996 # Flags needed to compile and link against Xapian
997 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
998 XAPIAN_LDFLAGS = ${xapian_ldflags}
999
1000 # Flags needed to compile and link against GMime
1001 GMIME_CFLAGS = ${gmime_cflags}
1002 GMIME_LDFLAGS = ${gmime_ldflags}
1003
1004 # Flags needed to compile and link against zlib
1005 ZLIB_CFLAGS = ${zlib_cflags}
1006 ZLIB_LDFLAGS = ${zlib_ldflags}
1007
1008 # Flags needed to compile and link against talloc
1009 TALLOC_CFLAGS = ${talloc_cflags}
1010 TALLOC_LDFLAGS = ${talloc_ldflags}
1011
1012 # Flags needed to have linker set rpath attribute
1013 RPATH_LDFLAGS = ${rpath_ldflags}
1014
1015 # Flags needed to have linker link only to necessary libraries
1016 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
1017
1018 # Flags to have the linker flag undefined symbols in object files
1019 NO_UNDEFINED_LDFLAGS = ${no_undefined_ldflags}
1020
1021 # Whether valgrind header files are available
1022 HAVE_VALGRIND = ${have_valgrind}
1023
1024 # And if so, flags needed at compile time for valgrind macros
1025 VALGRIND_CFLAGS = ${valgrind_cflags}
1026
1027 # Support for emacs
1028 WITH_EMACS = ${WITH_EMACS}
1029
1030 # Support for bash completion
1031 WITH_BASH = ${WITH_BASH}
1032
1033 # Support for zsh completion
1034 WITH_ZSH = ${WITH_ZSH}
1035
1036 # Combined flags for compiling and linking against all of the above
1037 CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)      \\
1038                    -DHAVE_CANONICALIZE_FILE_NAME=\$(HAVE_CANONICALIZE_FILE_NAME) \\
1039                    \$(ZLIB_CFLAGS)                                       \\
1040                    \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND)   \\
1041                    \$(VALGRIND_CFLAGS)                                   \\
1042                    -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)                 \\
1043                    -DHAVE_STRSEP=\$(HAVE_STRSEP)                         \\
1044                    -DHAVE_D_TYPE=\$(HAVE_D_TYPE)                         \\
1045                    -DSTD_GETPWUID=\$(STD_GETPWUID)                       \\
1046                    -DSTD_ASCTIME=\$(STD_ASCTIME)                         \\
1047                    -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)         \\
1048                    -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)
1049
1050 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)    \\
1051                      -DHAVE_CANONICALIZE_FILE_NAME=\$(HAVE_CANONICALIZE_FILE_NAME) \\
1052                      \$(ZLIB_CFLAGS)                                     \\
1053                      \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
1054                      \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS)             \\
1055                      -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)               \\
1056                      -DHAVE_STRSEP=\$(HAVE_STRSEP)                       \\
1057                      -DHAVE_D_TYPE=\$(HAVE_D_TYPE)                       \\
1058                      -DSTD_GETPWUID=\$(STD_GETPWUID)                     \\
1059                      -DSTD_ASCTIME=\$(STD_ASCTIME)                       \\
1060                      -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)       \\
1061                      -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)
1062
1063 CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(ZLIB_LDFLAGS) \$(XAPIAN_LDFLAGS)
1064 EOF
1065
1066 # construct the sh.config
1067 cat > sh.config <<EOF
1068 # This sh.config was automatically generated by the ./configure
1069 # script of notmuch.
1070
1071 # Whether the Xapian version in use supports compaction
1072 NOTMUCH_HAVE_XAPIAN_COMPACT=${have_xapian_compact}
1073
1074 # do we have man pages?
1075 NOTMUCH_HAVE_MAN=$((have_sphinx))
1076
1077 # Name of python interpreter
1078 NOTMUCH_PYTHON=${python}
1079
1080 # Are the ruby development files (and ruby) available? If not skip
1081 # building/testing ruby bindings.
1082 NOTMUCH_HAVE_RUBY_DEV=${have_ruby_dev}
1083 EOF
1084
1085 # Finally, after everything configured, inform the user how to continue.
1086 cat <<EOF
1087
1088 All required packages were found. You may now run the following
1089 commands to compile and install notmuch:
1090
1091         make
1092         sudo make install
1093
1094 EOF