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