#! /bin/bash # Store original IFS value so it can be changed (and restored) in many places. readonly DEFAULT_IFS=$IFS srcdir=$(dirname "$0") # For a non-srcdir configure invocation (such as ../configure), create # the directory structure and copy Makefiles. if [ "$srcdir" != "." ]; then for dir in . $(grep "^subdirs *=" "$srcdir"/Makefile | sed -e "s/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 # environment variables) CC=${CC:-gcc} CXX=${CXX:-g++} CFLAGS=${CFLAGS:--O2} CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)} 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= 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 () { cat <-- 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 } # Parse command-line options for option; do if [ "${option}" = '--help' ] ; then usage exit 0 elif [ "${option%%=*}" = '--prefix' ] ; then 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 "See:" echo " $0 --help" echo "" exit 1 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. libdir_expanded=${LIBDIR:-${PREFIX}/lib} cat < /dev/null 2>&1; then have_pkg_config=1 else have_pkg_config=0 fi 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 printf "Yes (%s).\n" $(${xapian_config} --version | sed -e 's/.* //') have_xapian=1 xapian_cxxflags=$(${xapian_config} --cxxflags) xapian_ldflags=$(${xapian_config} --libs) break fi done if [ ${have_xapian} = "0" ]; then printf "No.\n" errors=$((errors + 1)) 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 talloc development files... " if pkg-config --exists talloc; then printf "Yes.\n" have_talloc=1 talloc_cflags=$(pkg-config --cflags talloc) talloc_ldflags=$(pkg-config --libs talloc) else printf "No.\n" have_talloc=0 talloc_cflags= errors=$((errors + 1)) fi printf "Checking for valgrind development files... " if pkg-config --exists valgrind; then printf "Yes.\n" have_valgrind=1 valgrind_cflags=$(pkg-config --cflags valgrind) else printf "No (but that's fine).\n" have_valgrind=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 printf "No (so will not byte-compile emacs code)\n" have_emacs=0 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 = "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 <= 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_getline=1 else printf "No (will use our own instead).\n" have_getline=0 fi 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 "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 -Wswitch-enum; 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 <