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