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