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