3 # Test whether this shell is capable of parameter substring processing.
4 ( option='a/b'; : ${option#*/} ) 2>/dev/null || {
6 The shell interpreting '$0' is lacking some required features.
8 To work around this problem you may try to execute:
17 # Store original IFS value so it can be changed (and restored) in many places.
18 readonly DEFAULT_IFS="$IFS"
20 srcdir=$(dirname "$0")
22 # For a non-srcdir configure invocation (such as ../configure), create
23 # the directory structure and copy Makefiles.
24 if [ "$srcdir" != "." ]; then
26 for dir in . $(grep "^subdirs *=" "$srcdir"/Makefile | sed -e "s/subdirs *= *//"); do
28 cp "$srcdir"/"$dir"/Makefile.local "$dir"
29 cp "$srcdir"/"$dir"/Makefile "$dir"
32 # Easiest way to get the test suite to work is to just copy the
33 # whole thing into the build directory.
34 cp -a "$srcdir"/test/* test
36 # Emacs only likes to generate compiled files next to the .el files
37 # by default so copy these as well (which is not ideal0.
38 cp -a "$srcdir"/emacs/*.el emacs
41 # Set several defaults (optionally specified by the user in
42 # environment variables)
46 CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)}
48 XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config}
50 # We don't allow the EMACS or GZIP Makefile variables inherit values
51 # from the environment as we do with CC and CXX above. The reason is
52 # that these names as environment variables have existing uses other
53 # than the program name that we want. (EMACS is set to 't' when a
54 # shell is running within emacs and GZIP specifies arguments to pass
55 # on the gzip command line).
57 # Set the defaults for values the user can specify with command-line
65 # Compatible GMime versions (with constraints).
66 # If using GMime 2.6, we need to have a version >= 2.6.5 to avoid a
67 # crypto bug. We need 2.6.7 for permissive "From " header handling.
68 GMIME_24_VERSION_CTR=''
69 GMIME_24_VERSION="gmime-2.4 $GMIME_24_VERSION_CTR"
70 GMIME_26_VERSION_CTR='>= 2.6.7'
71 GMIME_26_VERSION="gmime-2.6 $GMIME_26_VERSION_CTR"
73 WITH_GMIME_VERSIONS="$GMIME_26_VERSION;$GMIME_24_VERSION"
78 Usage: ./configure [options]...
80 This script configures notmuch to build on your system.
82 It verifies that dependencies are available, determines flags needed
83 to compile and link against various required libraries, and identifies
84 whether various system functions can be used or if locally-provided
85 replacements will be built instead.
87 Finally, it allows you to control various aspects of the build and
90 First, some common variables can specified via environment variables:
92 CC The C compiler to use
93 CFLAGS Flags to pass to the C compiler
94 CXX The C++ compiler to use
95 CXXFLAGS Flags to pass to the C compiler
96 LDFLAGS Flags to pass when linking
98 Each of these values can further be controlled by specifying them
99 later on the "make" command line.
101 Other environment variables can be used to control configure itself,
102 (and for which there is no equivalent build-time control):
104 XAPIAN_CONFIG The program to use to determine flags for
105 compiling and linking against the Xapian
106 library. [$XAPIAN_CONFIG]
108 Additionally, various options can be specified on the configure
111 --prefix=PREFIX Install files in PREFIX [$PREFIX]
113 By default, "make install" will install the resulting program to
114 $PREFIX/bin, documentation to $PREFIX/man, etc. You can
115 specify an installation prefix other than $PREFIX using
116 --prefix, for instance:
118 ./configure --prefix=\$HOME
120 Fine tuning of some installation directories is available:
122 --libdir=DIR Install libraries to DIR [PREFIX/lib]
123 --includedir=DIR Install header files to DIR [PREFIX/include]
124 --mandir=DIR Install man pages to DIR [PREFIX/share/man]
125 --sysconfdir=DIR Read-only single-machine data [PREFIX/etc]
126 --emacslispdir=DIR Emacs code [PREFIX/share/emacs/site-lisp]
127 --emacsetcdir=DIR Emacs miscellaneous files [PREFIX/share/emacs/site-lisp]
128 --bashcompletiondir=DIR Bash completions files [SYSCONFDIR/bash_completion.d]
129 --zshcompletiondir=DIR Zsh completions files [PREFIX/share/zsh/functions/Completion/Unix]
131 Some specific library versions can be specified (auto-detected otherwise):
133 --with-gmime-version=VERS Specify GMIME version (2.4 or 2.6)
135 Some features can be disabled (--with-feature=no is equivalent to
138 --without-emacs Do not install lisp file
139 --without-bash-completion Do not install bash completions files
140 --without-zsh-completion Do not install zsh completions files
142 Additional options are accepted for compatibility with other
143 configure-script calling conventions, but don't do anything yet:
145 --build=<cpu>-<vendor>-<os> Currently ignored
146 --host=<cpu>-<vendor>-<os> Currently ignored
147 --infodir=DIR Currently ignored
148 --datadir=DIR Currently ignored
149 --localstatedir=DIR Currently ignored
150 --libexecdir=DIR Currently ignored
151 --disable-maintainer-mode Currently ignored
152 --disable-dependency-tracking Currently ignored
157 # Parse command-line options
159 if [ "${option}" = '--help' ] ; then
162 elif [ "${option%%=*}" = '--prefix' ] ; then
163 PREFIX="${option#*=}"
164 elif [ "${option%%=*}" = '--libdir' ] ; then
165 LIBDIR="${option#*=}"
166 elif [ "${option%%=*}" = '--includedir' ] ; then
167 INCLUDEDIR="${option#*=}"
168 elif [ "${option%%=*}" = '--mandir' ] ; then
169 MANDIR="${option#*=}"
170 elif [ "${option%%=*}" = '--sysconfdir' ] ; then
171 SYSCONFDIR="${option#*=}"
172 elif [ "${option%%=*}" = '--emacslispdir' ] ; then
173 EMACSLISPDIR="${option#*=}"
174 elif [ "${option%%=*}" = '--emacsetcdir' ] ; then
175 EMACSETCDIR="${option#*=}"
176 elif [ "${option%%=*}" = '--bashcompletiondir' ] ; then
177 BASHCOMPLETIONDIR="${option#*=}"
178 elif [ "${option%%=*}" = '--zshcompletiondir' ] ; then
179 ZSHCOMLETIONDIR="${option#*=}"
180 elif [ "${option%%=*}" = '--with-emacs' ]; then
181 if [ "${option#*=}" = 'no' ]; then
186 elif [ "${option}" = '--without-emacs' ] ; then
188 elif [ "${option%%=*}" = '--with-bash-completion' ]; then
189 if [ "${option#*=}" = 'no' ]; then
194 elif [ "${option}" = '--without-bash-completion' ] ; then
196 elif [ "${option%%=*}" = '--with-zsh-completion' ]; then
197 if [ "${option#*=}" = 'no' ]; then
202 elif [ "${option}" = '--without-zsh-completion' ] ; then
204 elif [ "${option%%=*}" = '--with-gmime-version' ] ; then
205 if [ "${option#*=}" = '2.4' ]; then
206 WITH_GMIME_VERSIONS=$GMIME_24_VERSION
207 elif [ "${option#*=}" = '2.6' ]; then
208 WITH_GMIME_VERSIONS=$GMIME_26_VERSION
210 elif [ "${option%%=*}" = '--build' ] ; then
212 elif [ "${option%%=*}" = '--host' ] ; then
214 elif [ "${option%%=*}" = '--infodir' ] ; then
216 elif [ "${option%%=*}" = '--datadir' ] ; then
218 elif [ "${option%%=*}" = '--localstatedir' ] ; then
220 elif [ "${option%%=*}" = '--libexecdir' ] ; then
222 elif [ "${option}" = '--disable-maintainer-mode' ] ; then
224 elif [ "${option}" = '--disable-dependency-tracking' ] ; then
227 echo "Unrecognized option: ${option}"
235 # We set this value early, (rather than just while printing the
236 # Makefile.config file later like most values), because we need to
237 # actually investigate this value compared to the ldconfig_paths value
239 if [ -z "$LIBDIR" ] ; then
240 libdir_expanded="${PREFIX}/lib"
242 # very non-general variable expansion
243 libdir_expanded=`echo "$LIBDIR" | sed "s|\\${prefix}|${PREFIX}|g; s|\\$prefix/|${PREFIX}/|; s|//*|/|g"`
247 Welcome to Notmuch, a system for indexing, searching and tagging your email.
249 We hope that the process of building and installing notmuch is quick
250 and smooth so that you can soon be reading and processing your email
251 more efficiently than ever.
253 If anything goes wrong in the configure process, you can override any
254 decisions it makes by manually editing the Makefile.config file that
255 it creates. Also please do as much as you can to figure out what could
256 be different on your machine compared to those of the notmuch
257 developers. Then, please email those details to the Notmuch list
258 (notmuch@notmuchmail.org) so that we can hopefully make future
259 versions of notmuch easier for you to use.
261 We'll now investigate your system to verify that all required
262 dependencies are available:
268 if pkg-config --version > /dev/null 2>&1; then
274 printf "Checking for Xapian development files... "
276 for xapian_config in ${XAPIAN_CONFIG}; do
277 if ${xapian_config} --version > /dev/null 2>&1; then
278 printf "Yes (%s).\n" $(${xapian_config} --version | sed -e 's/.* //')
280 xapian_cxxflags=$(${xapian_config} --cxxflags)
281 xapian_ldflags=$(${xapian_config} --libs)
285 if [ ${have_xapian} = "0" ]; then
287 errors=$((errors + 1))
290 printf "Checking for GMime development files... "
293 for gmimepc in $WITH_GMIME_VERSIONS; do
294 if pkg-config --exists $gmimepc; then
295 printf "Yes ($gmimepc).\n"
297 gmime_cflags=$(pkg-config --cflags $gmimepc)
298 gmime_ldflags=$(pkg-config --libs $gmimepc)
303 if [ "$have_gmime" = "0" ]; then
305 errors=$((errors + 1))
308 # GMime already depends on Glib >= 2.12, but we use at least one Glib
309 # function that only exists as of 2.22, (g_array_unref)
310 printf "Checking for Glib development files (>= 2.22)... "
312 if pkg-config --exists 'glib-2.0 >= 2.22'; then
315 glib_cflags=$(pkg-config --cflags glib-2.0)
316 glib_ldflags=$(pkg-config --libs glib-2.0)
319 errors=$((errors + 1))
322 printf "Checking for talloc development files... "
323 if pkg-config --exists talloc; then
326 talloc_cflags=$(pkg-config --cflags talloc)
327 talloc_ldflags=$(pkg-config --libs talloc)
332 errors=$((errors + 1))
335 printf "Checking for valgrind development files... "
336 if pkg-config --exists valgrind; then
339 valgrind_cflags=$(pkg-config --cflags valgrind)
341 printf "No (but that's fine).\n"
345 if [ -z "${EMACSLISPDIR}" ]; then
346 if pkg-config --exists emacs; then
347 EMACSLISPDIR=$(pkg-config emacs --variable sitepkglispdir)
349 EMACSLISPDIR='$(prefix)/share/emacs/site-lisp'
353 if [ -z "${EMACSETCDIR}" ]; then
354 if pkg-config --exists emacs; then
355 EMACSETCDIR=$(pkg-config emacs --variable sitepkglispdir)
357 EMACSETCDIR='$(prefix)/share/emacs/site-lisp'
361 printf "Checking if emacs is available... "
362 if emacs --quick --batch > /dev/null 2>&1; then
366 printf "No (so will not byte-compile emacs code)\n"
372 printf "Checking which platform we are on... "
374 if [ $uname = "Darwin" ] ; then
377 linker_resolves_library_dependencies=0
378 elif [ $uname = "SunOS" ] ; then
381 linker_resolves_library_dependencies=0
382 elif [ $uname = "FreeBSD" ] ; then
385 linker_resolves_library_dependencies=0
386 elif [ $uname = "OpenBSD" ] ; then
389 linker_resolves_library_dependencies=0
390 elif [ $uname = "Linux" ] || [ $uname = "GNU" ] ; then
393 linker_resolves_library_dependencies=1
395 printf "Checking for $libdir_expanded in ldconfig... "
396 ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
397 # Separate ldconfig_paths only on newline (not on any potential
398 # embedded space characters in any filenames). Note, we use a
399 # literal newline in the source here rather than something like:
403 # because the shell's command substitution deletes any trailing newlines.
406 for path in $ldconfig_paths; do
407 if [ "$path" = "$libdir_expanded" ]; then
412 if [ "$libdir_in_ldconfig" = '0' ]; then
413 printf "No (will set RPATH)\n"
421 *** Warning: Unknown platform. Notmuch might or might not build correctly.
426 if [ $errors -gt 0 ]; then
429 *** Error: The dependencies of notmuch could not be satisfied. You will
430 need to install the following packages before being able to compile
434 if [ $have_xapian -eq 0 ]; then
435 echo " Xapian library (including development files such as headers)"
436 echo " http://xapian.org/"
438 if [ $have_gmime -eq 0 ]; then
439 echo " Either GMime 2.4 library" $GMIME_24_VERSION_CTR "or GMime 2.6 library" $GMIME_26_VERSION_CTR
440 echo " (including development files such as headers)"
441 echo " http://spruce.sourceforge.net/gmime/"
444 if [ $have_glib -eq 0 ]; then
445 echo " Glib library >= 2.22 (including development files such as headers)"
446 echo " http://ftp.gnome.org/pub/gnome/sources/glib/"
449 if [ $have_talloc -eq 0 ]; then
450 echo " The talloc library (including development files such as headers)"
451 echo " http://talloc.samba.org/"
455 With any luck, you're using a modern, package-based operating system
456 that has all of these packages available in the distribution. In that
457 case a simple command will install everything you need. For example:
459 On Debian and similar systems:
461 sudo apt-get install libxapian-dev libgmime-2.6-dev libtalloc-dev
463 Or on Fedora and similar systems:
465 sudo yum install xapian-core-devel gmime-devel libtalloc-devel
467 On other systems, similar commands can be used, but the details of the
468 package names may be different.
471 if [ $have_pkg_config -eq 0 ]; then
473 Note: the pkg-config program is not available. This configure script
474 uses pkg-config to find the compilation flags required to link against
475 the various libraries needed by notmuch. It's possible you simply need
476 to install pkg-config with a command such as:
478 sudo apt-get install pkg-config
480 sudo yum install pkgconfig
482 But if pkg-config is not available for your system, then you will need
483 to modify the configure script to manually set the cflags and ldflags
484 variables to the correct values to link against each library in each
485 case that pkg-config could not be used to determine those values.
490 When you have installed the necessary dependencies, you can run
491 configure again to ensure the packages can be found, or simply run
492 "make" to compile notmuch.
498 printf "Checking for getline... "
499 if ${CC} -o compat/have_getline "$srcdir"/compat/have_getline.c > /dev/null 2>&1
504 printf "No (will use our own instead).\n"
507 rm -f compat/have_getline
509 printf "Checking for strcasestr... "
510 if ${CC} -o compat/have_strcasestr "$srcdir"/compat/have_strcasestr.c > /dev/null 2>&1
515 printf "No (will use our own instead).\n"
518 rm -f compat/have_strcasestr
520 printf "int main(void){return 0;}\n" > minimal.c
522 printf "Checking for rpath support... "
523 if ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1
526 rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)"
528 printf "No (nothing to worry about).\n"
532 printf "Checking for -Wl,--as-needed... "
533 if ${CC} -Wl,--as-needed -o minimal minimal.c >/dev/null 2>&1
536 as_needed_ldflags="-Wl,--as-needed"
538 printf "No (nothing to worry about).\n"
543 printf "Checking for available C++ compiler warning flags... "
544 for flag in -Wall -Wextra -Wwrite-strings; do
545 if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
547 WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
550 printf "\n\t${WARN_CXXFLAGS}\n"
552 WARN_CFLAGS="${WARN_CXXFLAGS}"
553 printf "Checking for available C compiler warning flags... "
554 for flag in -Wmissing-declarations; do
555 if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
557 WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
560 printf "\n\t${WARN_CFLAGS}\n"
562 rm -f minimal minimal.c
566 All required packages were found. You may now run the following
567 commands to compile and install notmuch:
574 # construct the Makefile.config
575 cat > Makefile.config <<EOF
576 # This Makefile.config was automatically generated by the ./configure
577 # script of notmuch. If the configure script identified anything
578 # incorrectly, then you can edit this file to try to correct things,
579 # but be warned that if configure is run again it will destroy your
580 # changes, (and this could happen by simply calling "make" if the
581 # configure script is updated).
583 # The top-level directory for the source, (the directory containing
584 # the configure script). This may be different than the build
585 # directory (the current directory at the time configure was run).
588 configure_options = $@
590 # We use vpath directives (rather than the VPATH variable) since the
591 # VPATH variable matches targets as well as prerequisites, (which is
592 # not useful since then a target left-over from a srcdir build would
593 # cause a target to not be built in the non-srcdir build).
595 # Also, we don't use a single "vpath % \$(srcdir)" here because we
596 # don't want the vpath to trigger for our emacs lisp compilation,
597 # (unless we first find a way to convince emacs to build the .elc
598 # target in a directory other than the directory of the .el
599 # prerequisite). In the meantime, we're actually copying in the .el
600 # files, (which is quite ugly).
602 vpath %.cc \$(srcdir)
604 vpath Makefile.% \$(srcdir)
606 # The C compiler to use
609 # The C++ compiler to use
612 # Command to execute emacs from Makefiles
613 EMACS = emacs --quick
615 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
618 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
619 CXXFLAGS = ${CXXFLAGS}
621 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
624 # Flags to enable warnings when using the C++ compiler
625 WARN_CXXFLAGS=${WARN_CXXFLAGS}
627 # Flags to enable warnings when using the C compiler
628 WARN_CFLAGS=${WARN_CFLAGS}
630 # The prefix to which notmuch should be installed
631 # Note: If you change this value here, be sure to ensure that the
632 # LIBDIR_IN_LDCONFIG value below is still set correctly.
635 # The directory to which libraries should be installed
636 # Note: If you change this value here, be sure to ensure that the
637 # LIBDIR_IN_LDCONFIG value below is still set correctly.
638 libdir = ${LIBDIR:=\$(prefix)/lib}
640 # Whether libdir is in a path configured into ldconfig
641 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
643 # The directory to which header files should be installed
644 includedir = ${INCLUDEDIR:=\$(prefix)/include}
646 # The directory to which man pages should be installed
647 mandir = ${MANDIR:=\$(prefix)/share/man}
649 # The directory to which read-only (configuration) files should be installed
650 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
652 # The directory to which emacs lisp files should be installed
653 emacslispdir=${EMACSLISPDIR}
655 # The directory to which emacs miscellaneous (machine-independent) files should
657 emacsetcdir=${EMACSETCDIR}
659 # Whether there's an emacs binary available for byte-compiling
660 HAVE_EMACS = ${have_emacs}
662 # The directory to which desktop files should be installed
663 desktop_dir = \$(prefix)/share/applications
665 # The directory to which bash completions files should be installed
666 bash_completion_dir = ${BASHCOMPLETIONDIR:=\$(sysconfdir)/bash_completion.d}
668 # The directory to which zsh completions files should be installed
669 zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completion/Unix}
671 # Whether the getline function is available (if not, then notmuch will
672 # build its own version)
673 HAVE_GETLINE = ${have_getline}
675 # Whether the strcasestr function is available (if not, then notmuch will
676 # build its own version)
677 HAVE_STRCASESTR = ${have_strcasestr}
679 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS, FREEBSD, OPENBSD
680 PLATFORM = ${platform}
682 # Whether the linker will automatically resolve the dependency of one
683 # library on another (if not, then linking a binary requires linking
684 # directly against both)
685 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
687 # Flags needed to compile and link against Xapian
688 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
689 XAPIAN_LDFLAGS = ${xapian_ldflags}
691 # Flags needed to compile and link against GMime-2.4
692 GMIME_CFLAGS = ${gmime_cflags}
693 GMIME_LDFLAGS = ${gmime_ldflags}
695 # Flags needed to compile and link against talloc
696 TALLOC_CFLAGS = ${talloc_cflags}
697 TALLOC_LDFLAGS = ${talloc_ldflags}
699 # Flags needed to have linker set rpath attribute
700 RPATH_LDFLAGS = ${rpath_ldflags}
702 # Flags needed to have linker link only to necessary libraries
703 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
705 # Whether valgrind header files are available
706 HAVE_VALGRIND = ${have_valgrind}
708 # And if so, flags needed at compile time for valgrind macros
709 VALGRIND_CFLAGS = ${valgrind_cflags}
712 WITH_EMACS = ${WITH_EMACS}
714 # Support for bash completion
715 WITH_BASH = ${WITH_BASH}
717 # Support for zsh completion
718 WITH_ZSH = ${WITH_ZSH}
720 # Combined flags for compiling and linking against all of the above
721 CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
722 \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
723 \$(VALGRIND_CFLAGS) -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
724 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
725 \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
726 \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS) \\
727 -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
728 CONFIGURE_LDFLAGS = \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS)