3 # Store original IFS value so it can be changed (and restored) in many places.
4 readonly DEFAULT_IFS=$IFS
8 # For a non-srcdir configure invocation (such as ../configure), create
9 # the directory structure and copy Makefiles.
10 if [ "$srcdir" != "." ]; then
12 for dir in . $(grep "^subdirs *=" "$srcdir"/Makefile | sed -e "s/subdirs *= *//"); do
14 cp "$srcdir"/"$dir"/Makefile.local "$dir"
15 cp "$srcdir"/"$dir"/Makefile "$dir"
18 # Easiest way to get the test suite to work is to just copy the
19 # whole thing into the build directory.
20 cp -a "$srcdir"/test/* test
22 # Emacs only likes to generate compiled files next to the .el files
23 # by default so copy these as well (which is not ideal0.
24 cp -a "$srcdir"/emacs/*.el emacs
27 # Set several defaults (optionally specified by the user in
28 # environment variables)
32 CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)}
34 XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config}
36 # We don't allow the EMACS or GZIP Makefile variables inherit values
37 # from the environment as we do with CC and CXX above. The reason is
38 # that these names as environment variables have existing uses other
39 # than the program name that we want. (EMACS is set to 't' when a
40 # shell is running within emacs and GZIP specifies arguments to pass
41 # on the gzip command line).
43 # Set the defaults for values the user can specify with command-line
51 GMIME_24_VERSION='gmime-2.4'
52 GMIME_26_VERSION='gmime-2.6 >= 2.6.7'
54 WITH_GMIME_VERSIONS="$GMIME_26_VERSION;$GMIME_24_VERSION"
59 Usage: ./configure [options]...
61 This script configures notmuch to build on your system.
63 It verifies that dependencies are available, determines flags needed
64 to compile and link against various required libraries, and identifies
65 whether various system functions can be used or if locally-provided
66 replacements will be built instead.
68 Finally, it allows you to control various aspects of the build and
71 First, some common variables can specified via environment variables:
73 CC The C compiler to use
74 CFLAGS Flags to pass to the C compiler
75 CXX The C++ compiler to use
76 CXXFLAGS Flags to pass to the C compiler
77 LDFLAGS Flags to pass when linking
79 Each of these values can further be controlled by specifying them
80 later on the "make" command line.
82 Other environment variables can be used to control configure itself,
83 (and for which there is no equivalent build-time control):
85 XAPIAN_CONFIG The program to use to determine flags for
86 compiling and linking against the Xapian
87 library. [$XAPIAN_CONFIG]
89 Additionally, various options can be specified on the configure
92 --prefix=PREFIX Install files in PREFIX [$PREFIX]
94 By default, "make install" will install the resulting program to
95 $PREFIX/bin, documentation to $PREFIX/man, etc. You can
96 specify an installation prefix other than $PREFIX using
97 --prefix, for instance:
99 ./configure --prefix=\$HOME
101 Fine tuning of some installation directories is available:
103 --libdir=DIR Install libraries to DIR [PREFIX/lib]
104 --includedir=DIR Install header files to DIR [PREFIX/include]
105 --mandir=DIR Install man pages to DIR [PREFIX/share/man]
106 --sysconfdir=DIR Read-only single-machine data [PREFIX/etc]
107 --emacslispdir=DIR Emacs code [PREFIX/share/emacs/site-lisp]
108 --emacsetcdir=DIR Emacs miscellaneous files [PREFIX/share/emacs/site-lisp]
109 --bashcompletiondir=DIR Bash completions files [SYSCONFDIR/bash_completion.d]
110 --zshcompletiondir=DIR Zsh completions files [PREFIX/share/zsh/functions/Completion/Unix]
112 Some features can be disabled (--with-feature=no is equivalent to
115 --without-emacs Do not install lisp file
116 --without-bash-completion Do not install bash completions files
117 --without-zsh-completion Do not install zsh completions files
119 Additional options are accepted for compatibility with other
120 configure-script calling conventions, but don't do anything yet:
122 --build=<cpu>-<vendor>-<os> Currently ignored
123 --host=<cpu>-<vendor>-<os> Currently ignored
124 --infodir=DIR Currently ignored
125 --datadir=DIR Currently ignored
126 --localstatedir=DIR Currently ignored
127 --libexecdir=DIR Currently ignored
128 --disable-maintainer-mode Currently ignored
129 --disable-dependency-tracking Currently ignored
134 # Parse command-line options
136 if [ "${option}" = '--help' ] ; then
139 elif [ "${option%%=*}" = '--prefix' ] ; then
140 PREFIX="${option#*=}"
141 elif [ "${option%%=*}" = '--libdir' ] ; then
142 LIBDIR="${option#*=}"
143 elif [ "${option%%=*}" = '--includedir' ] ; then
144 INCLUDEDIR="${option#*=}"
145 elif [ "${option%%=*}" = '--mandir' ] ; then
146 MANDIR="${option#*=}"
147 elif [ "${option%%=*}" = '--sysconfdir' ] ; then
148 SYSCONFDIR="${option#*=}"
149 elif [ "${option%%=*}" = '--emacslispdir' ] ; then
150 EMACSLISPDIR="${option#*=}"
151 elif [ "${option%%=*}" = '--emacsetcdir' ] ; then
152 EMACSETCDIR="${option#*=}"
153 elif [ "${option%%=*}" = '--bashcompletiondir' ] ; then
154 BASHCOMPLETIONDIR="${option#*=}"
155 elif [ "${option%%=*}" = '--zshcompletiondir' ] ; then
156 ZSHCOMLETIONDIR="${option#*=}"
157 elif [ "${option%%=*}" = '--with-emacs' ]; then
158 if [ "${option#*=}" = 'no' ]; then
163 elif [ "${option}" = '--without-emacs' ] ; then
165 elif [ "${option%%=*}" = '--with-bash-completion' ]; then
166 if [ "${option#*=}" = 'no' ]; then
171 elif [ "${option}" = '--without-bash-completion' ] ; then
173 elif [ "${option%%=*}" = '--with-zsh-completion' ]; then
174 if [ "${option#*=}" = 'no' ]; then
179 elif [ "${option}" = '--without-zsh-completion' ] ; then
181 elif [ "${option%%=*}" = '--with-gmime-version' ] ; then
182 if [ "${option#*=}" = '2.4' ]; then
183 WITH_GMIME_VERSIONS=$GMIME_24_VERSION
184 elif [ "${option#*=}" = '2.6' ]; then
185 WITH_GMIME_VERSIONS=$GMIME_26_VERSION
187 elif [ "${option%%=*}" = '--build' ] ; then
189 elif [ "${option%%=*}" = '--host' ] ; then
191 elif [ "${option%%=*}" = '--infodir' ] ; then
193 elif [ "${option%%=*}" = '--datadir' ] ; then
195 elif [ "${option%%=*}" = '--localstatedir' ] ; then
197 elif [ "${option%%=*}" = '--libexecdir' ] ; then
199 elif [ "${option}" = '--disable-maintainer-mode' ] ; then
201 elif [ "${option}" = '--disable-dependency-tracking' ] ; then
204 echo "Unrecognized option: ${option}"
212 # We set this value early, (rather than just while printing the
213 # Makefile.config file later like most values), because we need to
214 # actually investigate this value compared to the ldconfig_paths value
216 libdir_expanded=${LIBDIR:-${PREFIX}/lib}
219 Welcome to Notmuch, a system for indexing, searching and tagging your email.
221 We hope that the process of building and installing notmuch is quick
222 and smooth so that you can soon be reading and processing your email
223 more efficiently than ever.
225 If anything goes wrong in the configure process, you can override any
226 decisions it makes by manually editing the Makefile.config file that
227 it creates. Also please do as much as you can to figure out what could
228 be different on your machine compared to those of the notmuch
229 developers. Then, please email those details to the Notmuch list
230 (notmuch@notmuchmail.org) so that we can hopefully make future
231 versions of notmuch easier for you to use.
233 We'll now investigate your system to verify that all required
234 dependencies are available:
240 if pkg-config --version > /dev/null 2>&1; then
246 printf "Checking for Xapian development files... "
248 for xapian_config in ${XAPIAN_CONFIG}; do
249 if ${xapian_config} --version > /dev/null 2>&1; then
250 printf "Yes (%s).\n" $(${xapian_config} --version | sed -e 's/.* //')
252 xapian_cxxflags=$(${xapian_config} --cxxflags)
253 xapian_ldflags=$(${xapian_config} --libs)
257 if [ ${have_xapian} = "0" ]; then
259 errors=$((errors + 1))
262 # If using GMime 2.6, we need to have a version >= 2.6.5 to avoid a
263 # crypto bug. We need 2.6.7 for permissive "From " header handling.
264 printf "Checking for GMime development files... "
267 for gmimepc in $WITH_GMIME_VERSIONS; do
268 if pkg-config --exists $gmimepc; then
269 printf "Yes ($gmimepc).\n"
271 gmime_cflags=$(pkg-config --cflags $gmimepc)
272 gmime_ldflags=$(pkg-config --libs $gmimepc)
277 if [ "$have_gmime" = "0" ]; then
279 errors=$((errors + 1))
282 # GMime already depends on Glib >= 2.12, but we use at least one Glib
283 # function that only exists as of 2.22, (g_array_unref)
284 printf "Checking for Glib development files (>= 2.22)... "
286 if pkg-config --exists 'glib-2.0 >= 2.22'; then
289 glib_cflags=$(pkg-config --cflags glib-2.0)
290 glib_ldflags=$(pkg-config --libs glib-2.0)
293 errors=$((errors + 1))
296 printf "Checking for talloc development files... "
297 if pkg-config --exists talloc; then
300 talloc_cflags=$(pkg-config --cflags talloc)
301 talloc_ldflags=$(pkg-config --libs talloc)
306 errors=$((errors + 1))
309 printf "Checking for valgrind development files... "
310 if pkg-config --exists valgrind; then
313 valgrind_cflags=$(pkg-config --cflags valgrind)
315 printf "No (but that's fine).\n"
319 if [ -z "${EMACSLISPDIR}" ]; then
320 if pkg-config --exists emacs; then
321 EMACSLISPDIR=$(pkg-config emacs --variable sitepkglispdir)
323 EMACSLISPDIR='$(prefix)/share/emacs/site-lisp'
327 if [ -z "${EMACSETCDIR}" ]; then
328 if pkg-config --exists emacs; then
329 EMACSETCDIR=$(pkg-config emacs --variable sitepkglispdir)
331 EMACSETCDIR='$(prefix)/share/emacs/site-lisp'
335 printf "Checking if emacs is available... "
336 if emacs --quick --batch > /dev/null 2>&1; then
340 printf "No (so will not byte-compile emacs code)\n"
346 printf "Checking which platform we are on... "
348 if [ $uname = "Darwin" ] ; then
351 linker_resolves_library_dependencies=0
352 elif [ $uname = "SunOS" ] ; then
355 linker_resolves_library_dependencies=0
356 elif [ $uname = "Linux" ] || [ $uname = "GNU" ] ; then
359 linker_resolves_library_dependencies=1
361 printf "Checking for $libdir_expanded in ldconfig... "
362 ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
363 # Separate ldconfig_paths only on newline (not on any potential
364 # embedded space characters in any filenames). Note, we use a
365 # literal newline in the source here rather than something like:
369 # because the shell's command substitution deletes any trailing newlines.
372 for path in $ldconfig_paths; do
373 if [ "$path" = "$libdir_expanded" ]; then
378 if [ "$libdir_in_ldconfig" = '0' ]; then
379 printf "No (will set RPATH)\n"
387 *** Warning: Unknown platform. Notmuch might or might not build correctly.
392 if [ $errors -gt 0 ]; then
395 *** Error: The dependencies of notmuch could not be satisfied. You will
396 need to install the following packages before being able to compile
400 if [ $have_xapian -eq 0 ]; then
401 echo " Xapian library (including development files such as headers)"
402 echo " http://xapian.org/"
404 if [ $have_gmime -eq 0 ]; then
405 echo " GMime 2.4 library (including development files such as headers)"
406 echo " http://spruce.sourceforge.net/gmime/"
408 if [ $have_glib -eq 0 ]; then
409 echo " Glib library >= 2.22 (including development files such as headers)"
410 echo " http://ftp.gnome.org/pub/gnome/sources/glib/"
412 if [ $have_talloc -eq 0 ]; then
413 echo " The talloc library (including development files such as headers)"
414 echo " http://talloc.samba.org/"
418 With any luck, you're using a modern, package-based operating system
419 that has all of these packages available in the distribution. In that
420 case a simple command will install everything you need. For example:
422 On Debian and similar systems:
424 sudo apt-get install libxapian-dev libgmime-2.4-dev libtalloc-dev
426 Or on Fedora and similar systems:
428 sudo yum install xapian-core-devel gmime-devel libtalloc-devel
430 On other systems, similar commands can be used, but the details of the
431 package names may be different.
434 if [ $have_pkg_config -eq 0 ]; then
436 Note: the pkg-config program is not available. This configure script
437 uses pkg-config to find the compilation flags required to link against
438 the various libraries needed by notmuch. It's possible you simply need
439 to install pkg-config with a command such as:
441 sudo apt-get install pkg-config
443 sudo yum install pkgconfig
445 But if pkg-config is not available for your system, then you will need
446 to modify the configure script to manually set the cflags and ldflags
447 variables to the correct values to link against each library in each
448 case that pkg-config could not be used to determine those values.
453 When you have installed the necessary dependencies, you can run
454 configure again to ensure the packages can be found, or simply run
455 "make" to compile notmuch.
461 printf "Checking for getline... "
462 if ${CC} -o compat/have_getline "$srcdir"/compat/have_getline.c > /dev/null 2>&1
467 printf "No (will use our own instead).\n"
470 rm -f compat/have_getline
472 printf "Checking for strcasestr... "
473 if ${CC} -o compat/have_strcasestr "$srcdir"/compat/have_strcasestr.c > /dev/null 2>&1
478 printf "No (will use our own instead).\n"
481 rm -f compat/have_strcasestr
483 printf "int main(void){return 0;}\n" > minimal.c
485 printf "Checking for rpath support... "
486 if ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1
489 rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)"
491 printf "No (nothing to worry about).\n"
495 printf "Checking for -Wl,--as-needed... "
496 if ${CC} -Wl,--as-needed -o minimal minimal.c >/dev/null 2>&1
499 as_needed_ldflags="-Wl,--as-needed"
501 printf "No (nothing to worry about).\n"
506 printf "Checking for available C++ compiler warning flags... "
507 for flag in -Wall -Wextra -Wwrite-strings -Wswitch-enum; do
508 if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
510 WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
513 printf "\n\t${WARN_CXXFLAGS}\n"
515 WARN_CFLAGS="${WARN_CXXFLAGS}"
516 printf "Checking for available C compiler warning flags... "
517 for flag in -Wmissing-declarations; do
518 if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
520 WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
523 printf "\n\t${WARN_CFLAGS}\n"
525 rm -f minimal minimal.c
529 All required packages were found. You may now run the following
530 commands to compile and install notmuch:
537 # construct the Makefile.config
538 cat > Makefile.config <<EOF
539 # This Makefile.config was automatically generated by the ./configure
540 # script of notmuch. If the configure script identified anything
541 # incorrectly, then you can edit this file to try to correct things,
542 # but be warned that if configure is run again it will destroy your
543 # changes, (and this could happen by simply calling "make" if the
544 # configure script is updated).
546 # The top-level directory for the source, (the directory containing
547 # the configure script). This may be different than the build
548 # directory (the current directory at the time configure was run).
551 configure_options = $@
553 # We use vpath directives (rather than the VPATH variable) since the
554 # VPATH variable matches targets as well as prerequisites, (which is
555 # not useful since then a target left-over from a srcdir build would
556 # cause a target to not be built in the non-srcdir build).
558 # Also, we don't use a single "vpath % \$(srcdir)" here because we
559 # don't want the vpath to trigger for our emacs lisp compilation,
560 # (unless we first find a way to convince emacs to build the .elc
561 # target in a directory other than the directory of the .el
562 # prerequisite). In the meantime, we're actually copying in the .el
563 # files, (which is quite ugly).
565 vpath %.cc \$(srcdir)
567 vpath Makefile.% \$(srcdir)
569 # The C compiler to use
572 # The C++ compiler to use
575 # Command to execute emacs from Makefiles
576 EMACS = emacs --quick
578 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
581 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
582 CXXFLAGS = ${CXXFLAGS}
584 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
587 # Flags to enable warnings when using the C++ compiler
588 WARN_CXXFLAGS=${WARN_CXXFLAGS}
590 # Flags to enable warnings when using the C compiler
591 WARN_CFLAGS=${WARN_CFLAGS}
593 # The prefix to which notmuch should be installed
594 # Note: If you change this value here, be sure to ensure that the
595 # LIBDIR_IN_LDCONFIG value below is still set correctly.
598 # The directory to which libraries should be installed
599 # Note: If you change this value here, be sure to ensure that the
600 # LIBDIR_IN_LDCONFIG value below is still set correctly.
601 libdir = ${LIBDIR:=\$(prefix)/lib}
603 # Whether libdir is in a path configured into ldconfig
604 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
606 # The directory to which header files should be installed
607 includedir = ${INCLUDEDIR:=\$(prefix)/include}
609 # The directory to which man pages should be installed
610 mandir = ${MANDIR:=\$(prefix)/share/man}
612 # The directory to which read-only (configuration) files should be installed
613 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
615 # The directory to which emacs lisp files should be installed
616 emacslispdir=${EMACSLISPDIR}
618 # The directory to which emacs miscellaneous (machine-independent) files should
620 emacsetcdir=${EMACSETCDIR}
622 # Whether there's an emacs binary available for byte-compiling
623 HAVE_EMACS = ${have_emacs}
625 # The directory to which desktop files should be installed
626 desktop_dir = \$(prefix)/share/applications
628 # The directory to which bash completions files should be installed
629 bash_completion_dir = ${BASHCOMPLETIONDIR:=\$(sysconfdir)/bash_completion.d}
631 # The directory to which zsh completions files should be installed
632 zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completion/Unix}
634 # Whether the getline function is available (if not, then notmuch will
635 # build its own version)
636 HAVE_GETLINE = ${have_getline}
638 # Whether the strcasestr function is available (if not, then notmuch will
639 # build its own version)
640 HAVE_STRCASESTR = ${have_strcasestr}
642 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS
643 PLATFORM = ${platform}
645 # Whether the linker will automatically resolve the dependency of one
646 # library on another (if not, then linking a binary requires linking
647 # directly against both)
648 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
650 # Flags needed to compile and link against Xapian
651 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
652 XAPIAN_LDFLAGS = ${xapian_ldflags}
654 # Flags needed to compile and link against GMime-2.4
655 GMIME_CFLAGS = ${gmime_cflags}
656 GMIME_LDFLAGS = ${gmime_ldflags}
658 # Flags needed to compile and link against talloc
659 TALLOC_CFLAGS = ${talloc_cflags}
660 TALLOC_LDFLAGS = ${talloc_ldflags}
662 # Flags needed to have linker set rpath attribute
663 RPATH_LDFLAGS = ${rpath_ldflags}
665 # Flags needed to have linker link only to necessary libraries
666 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
668 # Whether valgrind header files are available
669 HAVE_VALGRIND = ${have_valgrind}
671 # And if so, flags needed at compile time for valgrind macros
672 VALGRIND_CFLAGS = ${valgrind_cflags}
675 WITH_EMACS = ${WITH_EMACS}
677 # Support for bash completion
678 WITH_BASH = ${WITH_BASH}
680 # Support for zsh completion
681 WITH_ZSH = ${WITH_ZSH}
683 # Combined flags for compiling and linking against all of the above
684 CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
685 \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
686 \$(VALGRIND_CFLAGS) -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
687 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
688 \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
689 \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS) \\
690 -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
691 CONFIGURE_LDFLAGS = \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS)