]> git.notmuchmail.org Git - notmuch/blobdiff - configure
test: use the python interpreter in sh.config
[notmuch] / configure
index 40538e14eec0f3aa9263eeb4b0d1b84282837429..20fbed620e14883651091a473805ca21edbf24db 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,13 +1,58 @@
 #! /bin/sh
 
 #! /bin/sh
 
+# Test whether this shell is capable of parameter substring processing.
+( option='a/b'; : ${option#*/} ) 2>/dev/null || {
+    echo "
+The shell interpreting '$0' is lacking some required features.
+
+To work around this problem you may try to execute:
+
+    ksh $0 $*
+ or
+    bash $0 $*
+"
+    exit 1
+}
+
+# Store original IFS value so it can be changed (and restored) in many places.
+readonly DEFAULT_IFS="$IFS"
+
+srcdir=$(dirname "$0")
+
+subdirs="util compat lib parse-time-string completion doc emacs"
+subdirs="${subdirs} performance-test test test/test-databases"
+subdirs="${subdirs} bindings"
+
+# For a non-srcdir configure invocation (such as ../configure), create
+# the directory structure and copy Makefiles.
+if [ "$srcdir" != "." ]; then
+
+    for dir in . ${subdirs}; do
+       mkdir -p "$dir"
+       cp "$srcdir"/"$dir"/Makefile.local "$dir"
+       cp "$srcdir"/"$dir"/Makefile "$dir"
+    done
+
+    # Easiest way to get the test suite to work is to just copy the
+    # whole thing into the build directory.
+    cp -a "$srcdir"/test/* test
+
+    # Emacs only likes to generate compiled files next to the .el files
+    # by default so copy these as well (which is not ideal).
+    cp -a "$srcdir"/emacs/*.el emacs
+fi
+
 # Set several defaults (optionally specified by the user in
 # Set several defaults (optionally specified by the user in
-# environemnt variables)
-CC=${CC:-gcc}
-CXX=${CXX:-g++}
-CFLAGS=${CFLAGS:--O2}
+# environment variables)
+CC=${CC:-cc}
+CXX=${CXX:-c++}
+CFLAGS=${CFLAGS:--g -O2}
+CPPFLAGS=${CPPFLAGS:-}
+CXXFLAGS_for_sh=${CXXFLAGS:-${CFLAGS}}
 CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)}
 LDFLAGS=${LDFLAGS:-}
 CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)}
 LDFLAGS=${LDFLAGS:-}
-XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config-1.1 xapian-config}
+XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config}
+PYTHON=${PYTHON:-}
 
 # We don't allow the EMACS or GZIP Makefile variables inherit values
 # from the environment as we do with CC and CXX above. The reason is
 
 # We don't allow the EMACS or GZIP Makefile variables inherit values
 # from the environment as we do with CC and CXX above. The reason is
@@ -20,6 +65,21 @@ XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config-1.1 xapian-config}
 # options.
 PREFIX=/usr/local
 LIBDIR=
 # options.
 PREFIX=/usr/local
 LIBDIR=
+WITH_DOCS=1
+WITH_EMACS=1
+WITH_BASH=1
+WITH_RUBY=1
+WITH_ZSH=1
+
+# Compatible GMime versions (with constraints).
+# If using GMime 2.6, we need to have a version >= 2.6.5 to avoid a
+# crypto bug. We need 2.6.7 for permissive "From " header handling.
+GMIME_24_VERSION_CTR=''
+GMIME_24_VERSION="gmime-2.4 $GMIME_24_VERSION_CTR"
+GMIME_26_VERSION_CTR='>= 2.6.7'
+GMIME_26_VERSION="gmime-2.6 $GMIME_26_VERSION_CTR"
+
+WITH_GMIME_VERSIONS="$GMIME_26_VERSION;$GMIME_24_VERSION"
 
 usage ()
 {
 
 usage ()
 {
@@ -40,6 +100,7 @@ First, some common variables can specified via environment variables:
 
        CC              The C compiler to use
        CFLAGS          Flags to pass to the C compiler
 
        CC              The C compiler to use
        CFLAGS          Flags to pass to the C compiler
+       CPPFLAGS        Flags to pass to the C preprocessor
        CXX             The C++ compiler to use
        CXXFLAGS        Flags to pass to the C compiler
        LDFLAGS         Flags to pass when linking
        CXX             The C++ compiler to use
        CXXFLAGS        Flags to pass to the C compiler
        LDFLAGS         Flags to pass when linking
@@ -53,6 +114,8 @@ Other environment variables can be used to control configure itself,
        XAPIAN_CONFIG   The program to use to determine flags for
                        compiling and linking against the Xapian
                        library. [$XAPIAN_CONFIG]
        XAPIAN_CONFIG   The program to use to determine flags for
                        compiling and linking against the Xapian
                        library. [$XAPIAN_CONFIG]
+       PYTHON          Name of python command to use in
+                       configure and the test suite.
 
 Additionally, various options can be specified on the configure
 command line.
 
 Additionally, various options can be specified on the configure
 command line.
@@ -73,6 +136,22 @@ Fine tuning of some installation directories is available:
        --mandir=DIR            Install man pages to DIR [PREFIX/share/man]
        --sysconfdir=DIR        Read-only single-machine data [PREFIX/etc]
        --emacslispdir=DIR      Emacs code [PREFIX/share/emacs/site-lisp]
        --mandir=DIR            Install man pages to DIR [PREFIX/share/man]
        --sysconfdir=DIR        Read-only single-machine data [PREFIX/etc]
        --emacslispdir=DIR      Emacs code [PREFIX/share/emacs/site-lisp]
+       --emacsetcdir=DIR       Emacs miscellaneous files [PREFIX/share/emacs/site-lisp]
+       --bashcompletiondir=DIR Bash completions files [SYSCONFDIR/bash_completion.d]
+       --zshcompletiondir=DIR  Zsh completions files [PREFIX/share/zsh/functions/Completion/Unix]
+
+Some specific library versions can be specified (auto-detected otherwise):
+
+       --with-gmime-version=VERS       Specify GMIME version (2.4 or 2.6)
+
+Some features can be disabled (--with-feature=no is equivalent to
+--without-feature) :
+
+       --without-bash-completion       Do not install bash completions files
+       --without-docs                  Do not install documentation and man pages
+       --without-emacs                 Do not install lisp file
+       --without-ruby                  Do not install ruby bindings
+       --without-zsh-completion        Do not install zsh completions files
 
 Additional options are accepted for compatibility with other
 configure-script calling conventions, but don't do anything yet:
 
 Additional options are accepted for compatibility with other
 configure-script calling conventions, but don't do anything yet:
@@ -106,38 +185,62 @@ for option; do
        SYSCONFDIR="${option#*=}"
     elif [ "${option%%=*}" = '--emacslispdir' ] ; then
        EMACSLISPDIR="${option#*=}"
        SYSCONFDIR="${option#*=}"
     elif [ "${option%%=*}" = '--emacslispdir' ] ; then
        EMACSLISPDIR="${option#*=}"
+    elif [ "${option%%=*}" = '--emacsetcdir' ] ; then
+       EMACSETCDIR="${option#*=}"
+    elif [ "${option%%=*}" = '--bashcompletiondir' ] ; then
+       BASHCOMPLETIONDIR="${option#*=}"
+    elif [ "${option%%=*}" = '--zshcompletiondir' ] ; then
+       ZSHCOMLETIONDIR="${option#*=}"
+    elif [ "${option%%=*}" = '--with-docs' ]; then
+       if [ "${option#*=}" = 'no' ]; then
+           WITH_DOCS=0
+       else
+           WITH_DOCS=1
+       fi
+    elif [ "${option}" = '--without-docs' ] ; then
+       WITH_DOCS=0
+    elif [ "${option%%=*}" = '--with-emacs' ]; then
+       if [ "${option#*=}" = 'no' ]; then
+           WITH_EMACS=0
+       else
+           WITH_EMACS=1
+       fi
+    elif [ "${option}" = '--without-emacs' ] ; then
+       WITH_EMACS=0
+    elif [ "${option%%=*}" = '--with-bash-completion' ]; then
+       if [ "${option#*=}" = 'no' ]; then
+           WITH_BASH=0
+       else
+           WITH_BASH=1
+       fi
+    elif [ "${option}" = '--without-bash-completion' ] ; then
+       WITH_BASH=0
+    elif [ "${option%%=*}" = '--with-ruby' ]; then
+       if [ "${option#*=}" = 'no' ]; then
+           WITH_RUBY=0
+       else
+           WITH_RUBY=1
+       fi
+    elif [ "${option}" = '--without-ruby' ] ; then
+       WITH_RUBY=0
+    elif [ "${option%%=*}" = '--with-zsh-completion' ]; then
+       if [ "${option#*=}" = 'no' ]; then
+           WITH_ZSH=0
+       else
+           WITH_ZSH=1
+       fi
+    elif [ "${option}" = '--without-zsh-completion' ] ; then
+       WITH_ZSH=0
+    elif [ "${option%%=*}" = '--with-gmime-version' ] ; then
+       if [ "${option#*=}" = '2.4' ]; then
+            WITH_GMIME_VERSIONS=$GMIME_24_VERSION
+        elif [ "${option#*=}" = '2.6' ]; then
+            WITH_GMIME_VERSIONS=$GMIME_26_VERSION
+       fi
     elif [ "${option%%=*}" = '--build' ] ; then
     elif [ "${option%%=*}" = '--build' ] ; then
-       build_option="${option#*=}"
-       case ${build_option} in
-           *-*-*) ;;
-           *)
-               echo "Unrecognized value for --build option: ${build_option}"
-               echo "Should be: <cpu>-<vendor>-<os>"
-               echo "See:"
-               echo "  $0 --help"
-               echo ""
-               exit 1
-       esac
-       build_cpu=${build_option%%-*}
-       build_option=${build_option#*-}
-       build_vendor=${build_option%%-*}
-       build_os=${build_option#*-}
+       true
     elif [ "${option%%=*}" = '--host' ] ; then
     elif [ "${option%%=*}" = '--host' ] ; then
-       host_option="${option#*=}"
-       case ${host_option} in
-           *-*-*) ;;
-           *)
-               echo "Unrecognized value for --host option: ${host_option}"
-               echo "Should be: <cpu>-<vendor>-<os>"
-               echo "See:"
-               echo "  $0 --help"
-               echo ""
-               exit 1
-       esac
-       host_cpu=${host_option%%-*}
-       host_option=${host_option#*-}
-       host_vendor=${host_option%%-*}
-       host_os=${host_option#*-}
+       true
     elif [ "${option%%=*}" = '--infodir' ] ; then
        true
     elif [ "${option%%=*}" = '--datadir' ] ; then
     elif [ "${option%%=*}" = '--infodir' ] ; then
        true
     elif [ "${option%%=*}" = '--datadir' ] ; then
@@ -159,6 +262,17 @@ for option; do
     fi
 done
 
     fi
 done
 
+# We set this value early, (rather than just while printing the
+# Makefile.config file later like most values), because we need to
+# actually investigate this value compared to the ldconfig_paths value
+# below.
+if [ -z "$LIBDIR" ] ; then
+    libdir_expanded="${PREFIX}/lib"
+else
+    # very non-general variable expansion
+    libdir_expanded=`echo "$LIBDIR" | sed "s|\\${prefix}|${PREFIX}|g; s|\\$prefix/|${PREFIX}/|; s|//*|/|g"`
+fi
+
 cat <<EOF
 Welcome to Notmuch, a system for indexing, searching and tagging your email.
 
 cat <<EOF
 Welcome to Notmuch, a system for indexing, searching and tagging your email.
 
@@ -180,6 +294,35 @@ dependencies are available:
 EOF
 
 errors=0
 EOF
 
 errors=0
+printf "int main(void){return 0;}\n" > minimal.c
+
+printf "Sanity checking C compilation environment... "
+if ${CC} ${CFLAGS} ${CPPFLAGS} minimal.c ${LDFLAGS} -o minimal > /dev/null 2>&1
+then
+    printf "OK.\n"
+else
+    printf "Fail.\n"
+    errors=$((errors + 1))
+fi
+
+printf "Sanity checking C++ compilation environment... "
+if ${CXX} ${CXXFLAGS_for_sh} ${CPPFLAGS} minimal.c ${LDFLAGS} -o minimal > /dev/null 2>&1
+then
+    printf "OK.\n"
+else
+    printf "Fail.\n"
+    errors=$((errors + 1))
+fi
+
+if [ $errors -gt 0 ]; then
+    cat <<EOF
+*** Error: Initial sanity checking of environment failed.  Please try
+running configure in a clean environment, and if the problem persists,
+report a bug.
+EOF
+    rm -f minimal minimal.c
+    exit 1
+fi
 
 if pkg-config --version > /dev/null 2>&1; then
     have_pkg_config=1
 
 if pkg-config --version > /dev/null 2>&1; then
     have_pkg_config=1
@@ -191,7 +334,8 @@ printf "Checking for Xapian development files... "
 have_xapian=0
 for xapian_config in ${XAPIAN_CONFIG}; do
     if ${xapian_config} --version > /dev/null 2>&1; then
 have_xapian=0
 for xapian_config in ${XAPIAN_CONFIG}; do
     if ${xapian_config} --version > /dev/null 2>&1; then
-       printf "Yes (%s).\n" $(${xapian_config} --version | sed -e 's/.* //')
+       xapian_version=$(${xapian_config} --version | sed -e 's/.* //')
+       printf "Yes (%s).\n" ${xapian_version}
        have_xapian=1
        xapian_cxxflags=$(${xapian_config} --cxxflags)
        xapian_ldflags=$(${xapian_config} --libs)
        have_xapian=1
        xapian_cxxflags=$(${xapian_config} --cxxflags)
        xapian_ldflags=$(${xapian_config} --libs)
@@ -203,23 +347,76 @@ if [ ${have_xapian} = "0" ]; then
     errors=$((errors + 1))
 fi
 
     errors=$((errors + 1))
 fi
 
+# Compaction is only supported on Xapian > 1.2.6
+have_xapian_compact=0
+if [ ${have_xapian} = "1" ]; then
+    printf "Checking for Xapian compaction support... "
+    case "${xapian_version}" in
+       0.*|1.[01].*|1.2.[0-5])
+           printf "No (only available with Xapian > 1.2.6).\n" ;;
+       [1-9]*.[0-9]*.[0-9]*)
+           have_xapian_compact=1
+           printf "Yes.\n" ;;
+       *)
+           printf "Unknown version.\n" ;;
+    esac
+fi
+
 printf "Checking for GMime development files... "
 have_gmime=0
 printf "Checking for GMime development files... "
 have_gmime=0
-for gmimepc in gmime-2.6 gmime-2.4; do
-    if pkg-config --modversion $gmimepc > /dev/null 2>&1; then
+IFS=';'
+for gmimepc in $WITH_GMIME_VERSIONS; do
+    if pkg-config --exists $gmimepc; then
        printf "Yes ($gmimepc).\n"
        have_gmime=1
        gmime_cflags=$(pkg-config --cflags $gmimepc)
        gmime_ldflags=$(pkg-config --libs $gmimepc)
        printf "Yes ($gmimepc).\n"
        have_gmime=1
        gmime_cflags=$(pkg-config --cflags $gmimepc)
        gmime_ldflags=$(pkg-config --libs $gmimepc)
+       break
     fi
 done
     fi
 done
+IFS=$DEFAULT_IFS
 if [ "$have_gmime" = "0" ]; then
     printf "No.\n"
     errors=$((errors + 1))
 fi
 
 if [ "$have_gmime" = "0" ]; then
     printf "No.\n"
     errors=$((errors + 1))
 fi
 
+# GMime already depends on Glib >= 2.12, but we use at least one Glib
+# function that only exists as of 2.22, (g_array_unref)
+printf "Checking for Glib development files (>= 2.22)... "
+have_glib=0
+if pkg-config --exists 'glib-2.0 >= 2.22'; then
+    printf "Yes.\n"
+    have_glib=1
+    glib_cflags=$(pkg-config --cflags glib-2.0)
+    glib_ldflags=$(pkg-config --libs glib-2.0)
+else
+    printf "No.\n"
+    errors=$((errors + 1))
+fi
+
+if ! pkg-config --exists zlib; then
+  ${CC} ${zlib_cflags} -o compat/gen_zlib_pc \
+         "$srcdir"/compat/gen_zlib_pc.c ${zlib_ldflags} > /dev/null 2>&1 &&
+  compat/gen_zlib_pc > compat/zlib.pc &&
+  PKG_CONFIG_PATH="$PKG_CONFIG_PATH":compat &&
+  export PKG_CONFIG_PATH
+  rm -f compat/gen_zlib_pc
+fi
+
+printf "Checking for zlib (>= 1.2.5.2)... "
+have_zlib=0
+if pkg-config --atleast-version=1.2.5.2 zlib; then
+    printf "Yes.\n"
+    have_zlib=1
+    zlib_cflags=$(pkg-config --cflags zlib)
+    zlib_ldflags=$(pkg-config --libs zlib)
+else
+    printf "No.\n"
+    errors=$((errors + 1))
+fi
+
 printf "Checking for talloc development files... "
 printf "Checking for talloc development files... "
-if pkg-config --modversion talloc > /dev/null 2>&1; then
+if pkg-config --exists talloc; then
     printf "Yes.\n"
     have_talloc=1
     talloc_cflags=$(pkg-config --cflags talloc)
     printf "Yes.\n"
     have_talloc=1
     talloc_cflags=$(pkg-config --cflags talloc)
@@ -231,8 +428,25 @@ else
     errors=$((errors + 1))
 fi
 
     errors=$((errors + 1))
 fi
 
+printf "Checking for python... "
+have_python=0
+
+for name in ${PYTHON} python python2 python3; do
+    if command -v $name > /dev/null; then
+       have_python=1
+       python=$name
+       printf "Yes ($name).\n"
+       break
+    fi
+done
+
+if [ $have_python -eq 0 ]; then
+    printf "No.\n"
+    errors=$((errors + 1))
+fi
+
 printf "Checking for valgrind development files... "
 printf "Checking for valgrind development files... "
-if pkg-config --modversion valgrind > /dev/null 2>&1; then
+if pkg-config --exists valgrind; then
     printf "Yes.\n"
     have_valgrind=1
     valgrind_cflags=$(pkg-config --cflags valgrind)
     printf "Yes.\n"
     have_valgrind=1
     valgrind_cflags=$(pkg-config --cflags valgrind)
@@ -241,14 +455,30 @@ else
     have_valgrind=0
 fi
 
     have_valgrind=0
 fi
 
+printf "Checking for bash-completion (>= 1.90)... "
+if pkg-config --atleast-version=1.90 bash-completion; then
+    printf "Yes.\n"
+else
+    printf "No (will not install bash completion).\n"
+    WITH_BASH=0
+fi
+
 if [ -z "${EMACSLISPDIR}" ]; then
 if [ -z "${EMACSLISPDIR}" ]; then
-    if pkg-config --modversion emacs > /dev/null 2>&1; then
+    if pkg-config --exists emacs; then
        EMACSLISPDIR=$(pkg-config emacs --variable sitepkglispdir)
     else
        EMACSLISPDIR='$(prefix)/share/emacs/site-lisp'
     fi
 fi
 
        EMACSLISPDIR=$(pkg-config emacs --variable sitepkglispdir)
     else
        EMACSLISPDIR='$(prefix)/share/emacs/site-lisp'
     fi
 fi
 
+if [ -z "${EMACSETCDIR}" ]; then
+    if pkg-config --exists emacs; then
+       EMACSETCDIR=$(pkg-config emacs --variable sitepkglispdir)
+    else
+       EMACSETCDIR='$(prefix)/share/emacs/site-lisp'
+    fi
+fi
+
 printf "Checking if emacs is available... "
 if emacs --quick --batch > /dev/null 2>&1; then
     printf "Yes.\n"
 printf "Checking if emacs is available... "
 if emacs --quick --batch > /dev/null 2>&1; then
     printf "Yes.\n"
@@ -258,19 +488,86 @@ else
     have_emacs=0
 fi
 
     have_emacs=0
 fi
 
+have_doxygen=0
+if [ $WITH_DOCS = "1" ] ; then
+    printf "Checking if doxygen is available... "
+    if command -v doxygen > /dev/null; then
+       printf "Yes.\n"
+       have_doxygen=1
+    else
+       printf "No (so will not install api docs)\n"
+    fi
+fi
+
+have_ruby_dev=0
+if [ $WITH_RUBY = "1" ] ; then
+    printf "Checking for ruby development files... "
+    if ruby -e "require 'mkmf'"> /dev/null 2>&1; then
+       printf "Yes.\n"
+       have_ruby_dev=1
+    else
+       printf "No (skipping ruby bindings)\n"
+    fi
+fi
+
+have_sphinx=0
+if [ $WITH_DOCS = "1" ] ; then
+    printf "Checking if sphinx is available and supports nroff output... "
+    if command -v sphinx-build > /dev/null && ${python} -m sphinx.writers.manpage > /dev/null 2>&1 ; then
+       printf "Yes.\n"
+       have_sphinx=1
+    else
+       printf "No (so will not install man pages).\n"
+    fi
+fi
+
+libdir_in_ldconfig=0
+
 printf "Checking which platform we are on... "
 printf "Checking which platform we are on... "
-if [ `uname` = "Darwin" ] ; then
+uname=`uname`
+if [ $uname = "Darwin" ] ; then
     printf "Mac OS X.\n"
     platform=MACOSX
     linker_resolves_library_dependencies=0
     printf "Mac OS X.\n"
     platform=MACOSX
     linker_resolves_library_dependencies=0
-elif [ `uname` = "SunOS" ] ; then
+elif [ $uname = "SunOS" ] ; then
     printf "Solaris.\n"
     platform=SOLARIS
     linker_resolves_library_dependencies=0
     printf "Solaris.\n"
     platform=SOLARIS
     linker_resolves_library_dependencies=0
-elif [ `uname` = "Linux" ] ; then
-    printf "Linux\n"
-    platform=LINUX
+elif [ $uname = "FreeBSD" ] ; then
+    printf "FreeBSD.\n"
+    platform=FREEBSD
+    linker_resolves_library_dependencies=0
+elif [ $uname = "OpenBSD" ] ; then
+    printf "OpenBSD.\n"
+    platform=OPENBSD
+    linker_resolves_library_dependencies=0
+elif [ $uname = "Linux" ] || [ $uname = "GNU" ] ; then
+    printf "$uname\n"
+    platform="$uname"
     linker_resolves_library_dependencies=1
     linker_resolves_library_dependencies=1
+
+    printf "Checking for $libdir_expanded in ldconfig... "
+    ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
+    # Separate ldconfig_paths only on newline (not on any potential
+    # embedded space characters in any filenames). Note, we use a
+    # literal newline in the source here rather than something like:
+    #
+    #  IFS=$(printf '\n')
+    #
+    # because the shell's command substitution deletes any trailing newlines.
+    IFS="
+"
+    for path in $ldconfig_paths; do
+       if [ "$path" = "$libdir_expanded" ]; then
+           libdir_in_ldconfig=1
+       fi
+    done
+    IFS=$DEFAULT_IFS
+    if [ "$libdir_in_ldconfig" = '0' ]; then
+       printf "No (will set RPATH)\n"
+    else
+       printf "Yes\n"
+    fi
 else
     printf "Unknown.\n"
     cat <<EOF
 else
     printf "Unknown.\n"
     cat <<EOF
@@ -280,6 +577,19 @@ else
 EOF
 fi
 
 EOF
 fi
 
+printf "Checking byte order... "
+cat> _byteorder.c <<EOF
+#include <stdio.h>
+#include <stdint.h>
+uint32_t test = 0x34333231;
+int main() { printf("%.4s\n", (const char*)&test); return 0; }
+EOF
+${CC} ${CFLAGS} _byteorder.c -o _byteorder > /dev/null 2>&1
+util_byte_order=$(./_byteorder)
+echo $util_byte_order
+
+rm -f _byteorder _byteorder.c
+
 if [ $errors -gt 0 ]; then
     cat <<EOF
 
 if [ $errors -gt 0 ]; then
     cat <<EOF
 
@@ -288,31 +598,46 @@ need to install the following packages before being able to compile
 notmuch:
 
 EOF
 notmuch:
 
 EOF
+    if [ $have_python -eq 0 ]; then
+       echo "  python interpreter"
+    fi
     if [ $have_xapian -eq 0 ]; then
        echo "  Xapian library (including development files such as headers)"
        echo "  http://xapian.org/"
     fi
     if [ $have_xapian -eq 0 ]; then
        echo "  Xapian library (including development files such as headers)"
        echo "  http://xapian.org/"
     fi
+    if [ $have_zlib -eq 0 ]; then
+       echo "  zlib library (>= version 1.2.5.2, including development files such as headers)"
+       echo "  http://zlib.net/"
+       echo
+    fi
     if [ $have_gmime -eq 0 ]; then
     if [ $have_gmime -eq 0 ]; then
-       echo "  GMime 2.4 library (including development files such as headers)"
+       echo "  Either GMime 2.4 library" $GMIME_24_VERSION_CTR "or GMime 2.6 library" $GMIME_26_VERSION_CTR
+       echo "  (including development files such as headers)"
        echo "  http://spruce.sourceforge.net/gmime/"
        echo "  http://spruce.sourceforge.net/gmime/"
+       echo
+    fi
+    if [ $have_glib -eq 0 ]; then
+       echo "  Glib library >= 2.22 (including development files such as headers)"
+       echo "  http://ftp.gnome.org/pub/gnome/sources/glib/"
+       echo
     fi
     if [ $have_talloc -eq 0 ]; then
        echo "  The talloc library (including development files such as headers)"
        echo "  http://talloc.samba.org/"
     fi
     if [ $have_talloc -eq 0 ]; then
        echo "  The talloc library (including development files such as headers)"
        echo "  http://talloc.samba.org/"
+       echo
     fi
     cat <<EOF
     fi
     cat <<EOF
-
 With any luck, you're using a modern, package-based operating system
 that has all of these packages available in the distribution. In that
 case a simple command will install everything you need. For example:
 
 On Debian and similar systems:
 
 With any luck, you're using a modern, package-based operating system
 that has all of these packages available in the distribution. In that
 case a simple command will install everything you need. For example:
 
 On Debian and similar systems:
 
-       sudo apt-get install libxapian-dev libgmime-2.4-dev libtalloc-dev
+       sudo apt-get install libxapian-dev libgmime-2.6-dev libtalloc-dev zlib1g-dev
 
 Or on Fedora and similar systems:
 
 
 Or on Fedora and similar systems:
 
-       sudo yum install xapian-core-devel gmime-devel libtalloc-devel
+       sudo yum install xapian-core-devel gmime-devel libtalloc-devel zlib-devel
 
 On other systems, similar commands can be used, but the details of the
 package names may be different.
 
 On other systems, similar commands can be used, but the details of the
 package names may be different.
@@ -345,8 +670,20 @@ EOF
     exit 1
 fi
 
     exit 1
 fi
 
+printf "Checking for canonicalize_file_name... "
+if ${CC} -o compat/have_canonicalize_file_name "$srcdir"/compat/have_canonicalize_file_name.c > /dev/null 2>&1
+then
+    printf "Yes.\n"
+    have_canonicalize_file_name=1
+else
+    printf "No (will use our own instead).\n"
+    have_canonicalize_file_name=0
+fi
+rm -f compat/have_canonicalize_file_name
+
+
 printf "Checking for getline... "
 printf "Checking for getline... "
-if ${CC} -o compat/have_getline compat/have_getline.c > /dev/null 2>&1
+if ${CC} -o compat/have_getline "$srcdir"/compat/have_getline.c > /dev/null 2>&1
 then
     printf "Yes.\n"
     have_getline=1
 then
     printf "Yes.\n"
     have_getline=1
@@ -357,7 +694,7 @@ fi
 rm -f compat/have_getline
 
 printf "Checking for strcasestr... "
 rm -f compat/have_getline
 
 printf "Checking for strcasestr... "
-if ${CC} -o compat/have_strcasestr compat/have_strcasestr.c > /dev/null 2>&1
+if ${CC} -o compat/have_strcasestr "$srcdir"/compat/have_strcasestr.c > /dev/null 2>&1
 then
     printf "Yes.\n"
     have_strcasestr=1
 then
     printf "Yes.\n"
     have_strcasestr=1
@@ -367,15 +704,112 @@ else
 fi
 rm -f compat/have_strcasestr
 
 fi
 rm -f compat/have_strcasestr
 
-cat <<EOF
+printf "Checking for strsep... "
+if ${CC} -o compat/have_strsep "$srcdir"/compat/have_strsep.c > /dev/null 2>&1
+then
+    printf "Yes.\n"
+    have_strsep="1"
+else
+    printf "No (will use our own instead).\n"
+    have_strsep="0"
+fi
+rm -f compat/have_strsep
 
 
-All required packages were found. You may now run the following
-commands to compile and install notmuch:
+printf "Checking for timegm... "
+if ${CC} -o compat/have_timegm "$srcdir"/compat/have_timegm.c > /dev/null 2>&1
+then
+    printf "Yes.\n"
+    have_timegm="1"
+else
+    printf "No (will use our own instead).\n"
+    have_timegm="0"
+fi
+rm -f compat/have_timegm
 
 
-       make
-       sudo make install
+printf "Checking for dirent.d_type... "
+if ${CC} -o compat/have_d_type "$srcdir"/compat/have_d_type.c > /dev/null 2>&1
+then
+    printf "Yes.\n"
+    have_d_type="1"
+else
+    printf "No (will use stat instead).\n"
+    have_d_type="0"
+fi
+rm -f compat/have_d_type
 
 
-EOF
+printf "Checking for standard version of getpwuid_r... "
+if ${CC} -o compat/check_getpwuid "$srcdir"/compat/check_getpwuid.c > /dev/null 2>&1
+then
+    printf "Yes.\n"
+    std_getpwuid=1
+else
+    printf "No (will define _POSIX_PTHREAD_SEMANTICS to get it).\n"
+    std_getpwuid=0
+fi
+rm -f compat/check_getpwuid
+
+printf "Checking for standard version of asctime_r... "
+if ${CC} -o compat/check_asctime "$srcdir"/compat/check_asctime.c > /dev/null 2>&1
+then
+    printf "Yes.\n"
+    std_asctime=1
+else
+    printf "No (will define _POSIX_PTHREAD_SEMANTICS to get it).\n"
+    std_asctime=0
+fi
+rm -f compat/check_asctime
+
+printf "Checking for rpath support... "
+if ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1
+then
+    printf "Yes.\n"
+    rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)"
+else
+    printf "No (nothing to worry about).\n"
+    rpath_ldflags=""
+fi
+
+printf "Checking for -Wl,--as-needed... "
+if ${CC} -Wl,--as-needed -o minimal minimal.c >/dev/null 2>&1
+then
+    printf "Yes.\n"
+    as_needed_ldflags="-Wl,--as-needed"
+else
+    printf "No (nothing to worry about).\n"
+    as_needed_ldflags=""
+fi
+
+printf "Checking for -Wl,--no-undefined... "
+if ${CC} -Wl,--no-undefined -o minimal minimal.c >/dev/null 2>&1
+then
+    printf "Yes.\n"
+    no_undefined_ldflags="-Wl,--no-undefined"
+else
+    printf "No (nothing to worry about).\n"
+    no_undefined_ldflags=""
+fi
+
+WARN_CXXFLAGS=""
+printf "Checking for available C++ compiler warning flags... "
+for flag in -Wall -Wextra -Wwrite-strings; do
+    if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
+    then
+       WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
+    fi
+done
+printf "\n\t${WARN_CXXFLAGS}\n"
+
+WARN_CFLAGS="${WARN_CXXFLAGS}"
+printf "Checking for available C compiler warning flags... "
+for flag in -Wmissing-declarations; do
+    if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
+    then
+       WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
+    fi
+done
+printf "\n\t${WARN_CFLAGS}\n"
+
+rm -f minimal minimal.c
 
 # construct the Makefile.config
 cat > Makefile.config <<EOF
 
 # construct the Makefile.config
 cat > Makefile.config <<EOF
@@ -386,6 +820,33 @@ cat > Makefile.config <<EOF
 # changes, (and this could happen by simply calling "make" if the
 # configure script is updated).
 
 # changes, (and this could happen by simply calling "make" if the
 # configure script is updated).
 
+# The top-level directory for the source, (the directory containing
+# the configure script). This may be different than the build
+# directory (the current directory at the time configure was run).
+srcdir = ${srcdir}
+
+# subdirectories to build
+subdirs = ${subdirs}
+
+configure_options = $@
+
+# We use vpath directives (rather than the VPATH variable) since the
+# VPATH variable matches targets as well as prerequisites, (which is
+# not useful since then a target left-over from a srcdir build would
+# cause a target to not be built in the non-srcdir build).
+#
+# Also, we don't use a single "vpath % \$(srcdir)" here because we
+# don't want the vpath to trigger for our emacs lisp compilation,
+# (unless we first find a way to convince emacs to build the .elc
+# target in a directory other than the directory of the .el
+# prerequisite). In the meantime, we're actually copying in the .el
+# files, (which is quite ugly).
+vpath %.c \$(srcdir)
+vpath %.cc \$(srcdir)
+vpath Makefile.% \$(srcdir)
+vpath %.py \$(srcdir)
+vpath %.rst \$(srcdir)
+
 # The C compiler to use
 CC = ${CC}
 
 # The C compiler to use
 CC = ${CC}
 
@@ -398,6 +859,9 @@ EMACS = emacs --quick
 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
 CFLAGS = ${CFLAGS}
 
 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
 CFLAGS = ${CFLAGS}
 
+# Default FLAGS for C preprocessor (can be overridden by user such as "make CPPFLAGS=-I/usr/local/include")
+CPPFLAGS = ${CPPFLAGS}
+
 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
 CXXFLAGS = ${CXXFLAGS}
 
 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
 CXXFLAGS = ${CXXFLAGS}
 
@@ -405,50 +869,101 @@ CXXFLAGS = ${CXXFLAGS}
 LDFLAGS = ${LDFLAGS}
 
 # Flags to enable warnings when using the C++ compiler
 LDFLAGS = ${LDFLAGS}
 
 # Flags to enable warnings when using the C++ compiler
-WARN_CXXFLAGS=-Wall -Wextra -Wwrite-strings -Wswitch-enum
+WARN_CXXFLAGS=${WARN_CXXFLAGS}
 
 # Flags to enable warnings when using the C compiler
 
 # Flags to enable warnings when using the C compiler
-WARN_CFLAGS=\$(WARN_CXXFLAGS) -Wmissing-declarations
+WARN_CFLAGS=${WARN_CFLAGS}
+
+# Name of python interpreter
+PYTHON = ${python}
 
 # The prefix to which notmuch should be installed
 
 # The prefix to which notmuch should be installed
+# Note: If you change this value here, be sure to ensure that the
+# LIBDIR_IN_LDCONFIG value below is still set correctly.
 prefix = ${PREFIX}
 
 # The directory to which libraries should be installed
 prefix = ${PREFIX}
 
 # The directory to which libraries should be installed
+# Note: If you change this value here, be sure to ensure that the
+# LIBDIR_IN_LDCONFIG value below is still set correctly.
 libdir = ${LIBDIR:=\$(prefix)/lib}
 
 libdir = ${LIBDIR:=\$(prefix)/lib}
 
+# byte order within a 32 bit word. 1234 = little, 4321 = big, 0 = guess
+UTIL_BYTE_ORDER = ${util_byte_order}
+
+# Whether libdir is in a path configured into ldconfig
+LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
+
 # The directory to which header files should be installed
 includedir = ${INCLUDEDIR:=\$(prefix)/include}
 
 # The directory to which man pages should be installed
 mandir = ${MANDIR:=\$(prefix)/share/man}
 
 # The directory to which header files should be installed
 includedir = ${INCLUDEDIR:=\$(prefix)/include}
 
 # The directory to which man pages should be installed
 mandir = ${MANDIR:=\$(prefix)/share/man}
 
-# The directory to which read-only (configuration) filesshould be installed
+# The directory to which read-only (configuration) files should be installed
 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
 
 # The directory to which emacs lisp files should be installed
 emacslispdir=${EMACSLISPDIR}
 
 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
 
 # The directory to which emacs lisp files should be installed
 emacslispdir=${EMACSLISPDIR}
 
+# The directory to which emacs miscellaneous (machine-independent) files should
+# be installed
+emacsetcdir=${EMACSETCDIR}
+
 # Whether there's an emacs binary available for byte-compiling
 HAVE_EMACS = ${have_emacs}
 
 # Whether there's an emacs binary available for byte-compiling
 HAVE_EMACS = ${have_emacs}
 
+# Whether there's a sphinx-build binary available for building documentation
+HAVE_SPHINX=${have_sphinx}
+
+# Whether there's a doxygen binary available for building api documentation
+HAVE_DOXYGEN=${have_doxygen}
+
 # The directory to which desktop files should be installed
 desktop_dir = \$(prefix)/share/applications
 
 # The directory to which bash completions files should be installed
 # The directory to which desktop files should be installed
 desktop_dir = \$(prefix)/share/applications
 
 # The directory to which bash completions files should be installed
-bash_completion_dir = \$(sysconfdir)/bash_completion.d
+bash_completion_dir = ${BASHCOMPLETIONDIR:=\$(sysconfdir)/bash_completion.d}
 
 # The directory to which zsh completions files should be installed
 
 # The directory to which zsh completions files should be installed
-zsh_completion_dir = \$(prefix)/share/zsh/functions/Completion/Unix
+zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completion/Unix}
+
+# Whether the canonicalize_file_name function is available (if not, then notmuch will
+# build its own version)
+HAVE_CANONICALIZE_FILE_NAME = ${have_canonicalize_file_name}
 
 # Whether the getline function is available (if not, then notmuch will
 # build its own version)
 HAVE_GETLINE = ${have_getline}
 
 
 # Whether the getline function is available (if not, then notmuch will
 # build its own version)
 HAVE_GETLINE = ${have_getline}
 
+# Are the ruby development files (and ruby) available? If not skip
+# building/testing ruby bindings.
+HAVE_RUBY_DEV = ${have_ruby_dev}
+
 # Whether the strcasestr function is available (if not, then notmuch will
 # build its own version)
 HAVE_STRCASESTR = ${have_strcasestr}
 
 # Whether the strcasestr function is available (if not, then notmuch will
 # build its own version)
 HAVE_STRCASESTR = ${have_strcasestr}
 
-# Supported platforms (so far) are: LINUX, MACOSX, SOLARIS
+# Whether the strsep function is available (if not, then notmuch will
+# build its own version)
+HAVE_STRSEP = ${have_strsep}
+
+# Whether struct dirent has d_type (if not, then notmuch will use stat)
+HAVE_D_TYPE = ${have_d_type}
+
+# Whether the Xapian version in use supports compaction
+HAVE_XAPIAN_COMPACT = ${have_xapian_compact}
+
+# Whether the getpwuid_r function is standards-compliant
+# (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
+# to enable the standards-compliant version -- needed for Solaris)
+STD_GETPWUID = ${std_getpwuid}
+
+# Whether the asctime_r function is standards-compliant
+# (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
+# to enable the standards-compliant version -- needed for Solaris)
+STD_ASCTIME = ${std_asctime}
+
+# Supported platforms (so far) are: LINUX, MACOSX, SOLARIS, FREEBSD, OPENBSD
 PLATFORM = ${platform}
 
 # Whether the linker will automatically resolve the dependency of one
 PLATFORM = ${platform}
 
 # Whether the linker will automatically resolve the dependency of one
@@ -464,23 +979,94 @@ XAPIAN_LDFLAGS = ${xapian_ldflags}
 GMIME_CFLAGS = ${gmime_cflags}
 GMIME_LDFLAGS = ${gmime_ldflags}
 
 GMIME_CFLAGS = ${gmime_cflags}
 GMIME_LDFLAGS = ${gmime_ldflags}
 
+# Flags needed to compile and link against zlib
+ZLIB_CFLAGS = ${zlib_cflags}
+ZLIB_LDFLAGS = ${zlib_ldflags}
+
 # Flags needed to compile and link against talloc
 TALLOC_CFLAGS = ${talloc_cflags}
 TALLOC_LDFLAGS = ${talloc_ldflags}
 
 # Flags needed to compile and link against talloc
 TALLOC_CFLAGS = ${talloc_cflags}
 TALLOC_LDFLAGS = ${talloc_ldflags}
 
+# Flags needed to have linker set rpath attribute
+RPATH_LDFLAGS = ${rpath_ldflags}
+
+# Flags needed to have linker link only to necessary libraries
+AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
+
+# Flags to have the linker flag undefined symbols in object files
+NO_UNDEFINED_LDFLAGS = ${no_undefined_ldflags}
+
 # Whether valgrind header files are available
 HAVE_VALGRIND = ${have_valgrind}
 
 # And if so, flags needed at compile time for valgrind macros
 VALGRIND_CFLAGS = ${valgrind_cflags}
 
 # Whether valgrind header files are available
 HAVE_VALGRIND = ${have_valgrind}
 
 # And if so, flags needed at compile time for valgrind macros
 VALGRIND_CFLAGS = ${valgrind_cflags}
 
+# Support for emacs
+WITH_EMACS = ${WITH_EMACS}
+
+# Support for bash completion
+WITH_BASH = ${WITH_BASH}
+
+# Support for zsh completion
+WITH_ZSH = ${WITH_ZSH}
+
 # Combined flags for compiling and linking against all of the above
 CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)      \\
 # Combined flags for compiling and linking against all of the above
 CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)      \\
+                  -DHAVE_CANONICALIZE_FILE_NAME=\$(HAVE_CANONICALIZE_FILE_NAME) \\
+                  \$(ZLIB_CFLAGS)                                       \\
                   \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND)   \\
                   \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND)   \\
-                  \$(VALGRIND_CFLAGS) -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
+                  \$(VALGRIND_CFLAGS)                                   \\
+                  -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)                 \\
+                  -DHAVE_STRSEP=\$(HAVE_STRSEP)                         \\
+                  -DHAVE_D_TYPE=\$(HAVE_D_TYPE)                         \\
+                  -DSTD_GETPWUID=\$(STD_GETPWUID)                       \\
+                  -DSTD_ASCTIME=\$(STD_ASCTIME)                         \\
+                  -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)         \\
+                  -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)
+
 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)    \\
 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)    \\
+                    -DHAVE_CANONICALIZE_FILE_NAME=\$(HAVE_CANONICALIZE_FILE_NAME) \\
+                    \$(ZLIB_CFLAGS)                                     \\
                     \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
                     \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS)             \\
                     \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
                     \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS)             \\
-                     -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
-CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS)
+                    -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)               \\
+                    -DHAVE_STRSEP=\$(HAVE_STRSEP)                       \\
+                    -DHAVE_D_TYPE=\$(HAVE_D_TYPE)                       \\
+                    -DSTD_GETPWUID=\$(STD_GETPWUID)                     \\
+                    -DSTD_ASCTIME=\$(STD_ASCTIME)                       \\
+                    -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)       \\
+                    -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)
+
+CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(ZLIB_LDFLAGS) \$(XAPIAN_LDFLAGS)
+EOF
+
+# construct the sh.config
+cat > sh.config <<EOF
+# This sh.config was automatically generated by the ./configure
+# script of notmuch.
+
+# Whether the Xapian version in use supports compaction
+NOTMUCH_HAVE_XAPIAN_COMPACT=${have_xapian_compact}
+
+# do we have man pages?
+NOTMUCH_HAVE_MAN=$((have_sphinx))
+
+# Name of python interpreter
+NOTMUCH_PYTHON=${python}
+
+# Are the ruby development files (and ruby) available? If not skip
+# building/testing ruby bindings.
+NOTMUCH_HAVE_RUBY_DEV=${have_ruby_dev}
+EOF
+
+# Finally, after everything configured, inform the user how to continue.
+cat <<EOF
+
+All required packages were found. You may now run the following
+commands to compile and install notmuch:
+
+       make
+       sudo make install
+
 EOF
 EOF