X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=configure;h=b8a3ce768bc1ef44c4a4b56d5408879b2a42eab5;hp=1caff940471ea6ed32b1188364e181b2eff920fb;hb=3c13bc0321baaf340663779d6fce2b1f34c1c2c3;hpb=acaff279e241a2cedb7c07a5dbf3e942fec74aea diff --git a/configure b/configure index 1caff940..b8a3ce76 100755 --- a/configure +++ b/configure @@ -1,17 +1,80 @@ #! /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" + +# 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 ideal0. + cp -a "$srcdir"/emacs/*.el emacs +fi + # Set several defaults (optionally specified by the user in -# environemnt variables) +# environment variables) CC=${CC:-gcc} CXX=${CXX:-g++} CFLAGS=${CFLAGS:--O2} +CPPFLAGS=${CPPFLAGS:-} CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)} -XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config-1.1 xapian-config} +LDFLAGS=${LDFLAGS:-} +XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config} + +# 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 +# that these names as environment variables have existing uses other +# than the program name that we want. (EMACS is set to 't' when a +# shell is running within emacs and GZIP specifies arguments to pass +# on the gzip command line). # Set the defaults for values the user can specify with command-line # options. PREFIX=/usr/local -LIBDIR=${PREFIX}/lib +LIBDIR= +WITH_EMACS=1 +WITH_BASH=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 () { @@ -32,6 +95,7 @@ First, some common variables can specified via environment variables: 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 @@ -50,15 +114,48 @@ Additionally, various options can be specified on the configure command line. --prefix=PREFIX Install files in PREFIX [$PREFIX] - --libdir=LIBDIR Install libraries in LIBDIR [$LIBDIR] By default, "make install" will install the resulting program to -$PREFIX/bin, documentation to $PREFIX/share, etc. You can +$PREFIX/bin, documentation to $PREFIX/man, etc. You can specify an installation prefix other than $PREFIX using --prefix, for instance: ./configure --prefix=\$HOME +Fine tuning of some installation directories is available: + + --libdir=DIR Install libraries to DIR [PREFIX/lib] + --includedir=DIR Install header files to DIR [PREFIX/include] + --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-emacs Do not install lisp file + --without-bash-completion Do not install bash completions files + --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: + + --build=-- Currently ignored + --host=-- Currently ignored + --infodir=DIR Currently ignored + --datadir=DIR Currently ignored + --localstatedir=DIR Currently ignored + --libexecdir=DIR Currently ignored + --disable-maintainer-mode Currently ignored + --disable-dependency-tracking Currently ignored + EOF } @@ -71,8 +168,68 @@ for option; do PREFIX="${option#*=}" elif [ "${option%%=*}" = '--libdir' ] ; then LIBDIR="${option#*=}" + elif [ "${option%%=*}" = '--includedir' ] ; then + INCLUDEDIR="${option#*=}" + elif [ "${option%%=*}" = '--mandir' ] ; then + MANDIR="${option#*=}" + elif [ "${option%%=*}" = '--sysconfdir' ] ; then + 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-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-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 + true + elif [ "${option%%=*}" = '--host' ] ; then + true + elif [ "${option%%=*}" = '--infodir' ] ; then + true + elif [ "${option%%=*}" = '--datadir' ] ; then + true + elif [ "${option%%=*}" = '--localstatedir' ] ; then + true + elif [ "${option%%=*}" = '--libexecdir' ] ; then + true + elif [ "${option}" = '--disable-maintainer-mode' ] ; then + true + elif [ "${option}" = '--disable-dependency-tracking' ] ; then + true else - echo "Unrecognized option: ${option}." + echo "Unrecognized option: ${option}" echo "See:" echo " $0 --help" echo "" @@ -80,6 +237,17 @@ for option; do 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 < /dev/null 2>&1; then - printf "Yes.\n" + 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) @@ -124,20 +293,67 @@ if [ ${have_xapian} = "0" ]; then errors=$((errors + 1)) fi -printf "Checking for GMime 2.4 development files... " -if pkg-config --modversion gmime-2.4 > /dev/null 2>&1; then +# 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 +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) + break + fi +done +IFS=$DEFAULT_IFS +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 + +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_gmime=1 - gmime_cflags=$(pkg-config --cflags gmime-2.4) - gmime_ldflags=$(pkg-config --libs gmime-2.4) + have_zlib=1 + zlib_cflags=$(pkg-config --cflags zlib) + zlib_ldflags=$(pkg-config --libs zlib) else printf "No.\n" - have_gmime=0 errors=$((errors + 1)) fi 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) @@ -150,7 +366,7 @@ else fi 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) @@ -159,12 +375,127 @@ else have_valgrind=0 fi -if pkg-config --modversion emacs > /dev/null 2>&1; then - emacs_lispdir=$(pkg-config emacs --variable sitepkglispdir) +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 pkg-config --exists emacs; then + 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" + have_emacs=1 else - emacs_lispdir='$(prefix)/share/emacs/site-lisp' + printf "No (so will not byte-compile emacs code)\n" + have_emacs=0 fi +printf "Checking if sphinx is available and supports nroff output... " +if hash sphinx-build > /dev/null 2>&1 && python -m sphinx.writers.manpage > /dev/null 2>&1 ; then + printf "Yes.\n" + have_sphinx=1 + have_rst2man=0 +else + printf "No (falling back to rst2man).\n" + have_sphinx=0 + + printf "Checking if rst2man is available... " + if rst2man -V > /dev/null 2>&1; then + printf "Yes.\n" + have_rst2man=1 + else + printf "No (so will not install man pages).\n" + have_rst2man=0 + fi +fi + +libdir_in_ldconfig=0 + +printf "Checking which platform we are on... " +uname=`uname` +if [ $uname = "Darwin" ] ; then + printf "Mac OS X.\n" + platform=MACOSX + linker_resolves_library_dependencies=0 +elif [ $uname = "SunOS" ] ; then + printf "Solaris.\n" + platform=SOLARIS + linker_resolves_library_dependencies=0 +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 + + 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 < _byteorder.c < +#include +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 <= version 1.2.5.2, including development files such as headers)" + echo " http://zlib.net/" + echo + fi 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 + 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/" + echo fi cat < /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... " -if ${CC} -o config/have_getline config/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 @@ -239,7 +594,117 @@ else printf "No (will use our own instead).\n" have_getline=0 fi -rm -f config/have_getline +rm -f compat/have_getline + +printf "Checking for strcasestr... " +if ${CC} -o compat/have_strcasestr "$srcdir"/compat/have_strcasestr.c > /dev/null 2>&1 +then + printf "Yes.\n" + have_strcasestr=1 +else + printf "No (will use our own instead).\n" + have_strcasestr=0 +fi +rm -f compat/have_strcasestr + +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 + +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 + +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 + +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 "int main(void){return 0;}\n" > minimal.c + +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 + +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 cat < Makefile.config <