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
54 Usage: ./configure [options]...
56 This script configures notmuch to build on your system.
58 It verifies that dependencies are available, determines flags needed
59 to compile and link against various required libraries, and identifies
60 whether various system functions can be used or if locally-provided
61 replacements will be built instead.
63 Finally, it allows you to control various aspects of the build and
66 First, some common variables can specified via environment variables:
68 CC The C compiler to use
69 CFLAGS Flags to pass to the C compiler
70 CXX The C++ compiler to use
71 CXXFLAGS Flags to pass to the C compiler
72 LDFLAGS Flags to pass when linking
74 Each of these values can further be controlled by specifying them
75 later on the "make" command line.
77 Other environment variables can be used to control configure itself,
78 (and for which there is no equivalent build-time control):
80 XAPIAN_CONFIG The program to use to determine flags for
81 compiling and linking against the Xapian
82 library. [$XAPIAN_CONFIG]
84 Additionally, various options can be specified on the configure
87 --prefix=PREFIX Install files in PREFIX [$PREFIX]
89 By default, "make install" will install the resulting program to
90 $PREFIX/bin, documentation to $PREFIX/man, etc. You can
91 specify an installation prefix other than $PREFIX using
92 --prefix, for instance:
94 ./configure --prefix=\$HOME
96 Fine tuning of some installation directories is available:
98 --libdir=DIR Install libraries to DIR [PREFIX/lib]
99 --includedir=DIR Install header files to DIR [PREFIX/include]
100 --mandir=DIR Install man pages to DIR [PREFIX/share/man]
101 --sysconfdir=DIR Read-only single-machine data [PREFIX/etc]
102 --emacslispdir=DIR Emacs code [PREFIX/share/emacs/site-lisp]
103 --emacsetcdir=DIR Emacs miscellaneous files [PREFIX/share/emacs/site-lisp]
104 --bashcompletiondir=DIR Bash completions files [SYSCONFDIR/bash_completion.d]
105 --zshcompletiondir=DIR Zsh completions files [PREFIX/share/zsh/functions/Completion/Unix]
107 Some features can be disabled (--with-feature=no is equivalent to
110 --without-emacs Do not install lisp file
111 --without-bash-completion Do not install bash completions files
112 --without-zsh-completion Do not install zsh completions files
114 Additional options are accepted for compatibility with other
115 configure-script calling conventions, but don't do anything yet:
117 --build=<cpu>-<vendor>-<os> Currently ignored
118 --host=<cpu>-<vendor>-<os> Currently ignored
119 --infodir=DIR Currently ignored
120 --datadir=DIR Currently ignored
121 --localstatedir=DIR Currently ignored
122 --libexecdir=DIR Currently ignored
123 --disable-maintainer-mode Currently ignored
124 --disable-dependency-tracking Currently ignored
129 # Parse command-line options
131 if [ "${option}" = '--help' ] ; then
134 elif [ "${option%%=*}" = '--prefix' ] ; then
135 PREFIX="${option#*=}"
136 elif [ "${option%%=*}" = '--libdir' ] ; then
137 LIBDIR="${option#*=}"
138 elif [ "${option%%=*}" = '--includedir' ] ; then
139 INCLUDEDIR="${option#*=}"
140 elif [ "${option%%=*}" = '--mandir' ] ; then
141 MANDIR="${option#*=}"
142 elif [ "${option%%=*}" = '--sysconfdir' ] ; then
143 SYSCONFDIR="${option#*=}"
144 elif [ "${option%%=*}" = '--emacslispdir' ] ; then
145 EMACSLISPDIR="${option#*=}"
146 elif [ "${option%%=*}" = '--emacsetcdir' ] ; then
147 EMACSETCDIR="${option#*=}"
148 elif [ "${option%%=*}" = '--bashcompletiondir' ] ; then
149 BASHCOMPLETIONDIR="${option#*=}"
150 elif [ "${option%%=*}" = '--zshcompletiondir' ] ; then
151 ZSHCOMLETIONDIR="${option#*=}"
152 elif [ "${option%%=*}" = '--with-emacs' ]; then
153 if [ "${option#*=}" = 'no' ]; then
158 elif [ "${option}" = '--without-emacs' ] ; then
160 elif [ "${option%%=*}" = '--with-bash-completion' ]; then
161 if [ "${option#*=}" = 'no' ]; then
166 elif [ "${option}" = '--without-bash-completion' ] ; then
168 elif [ "${option%%=*}" = '--with-zsh-completion' ]; then
169 if [ "${option#*=}" = 'no' ]; then
174 elif [ "${option}" = '--without-zsh-completion' ] ; then
176 elif [ "${option%%=*}" = '--build' ] ; then
178 elif [ "${option%%=*}" = '--host' ] ; then
180 elif [ "${option%%=*}" = '--infodir' ] ; then
182 elif [ "${option%%=*}" = '--datadir' ] ; then
184 elif [ "${option%%=*}" = '--localstatedir' ] ; then
186 elif [ "${option%%=*}" = '--libexecdir' ] ; then
188 elif [ "${option}" = '--disable-maintainer-mode' ] ; then
190 elif [ "${option}" = '--disable-dependency-tracking' ] ; then
193 echo "Unrecognized option: ${option}"
201 # We set this value early, (rather than just while printing the
202 # Makefile.config file later like most values), because we need to
203 # actually investigate this value compared to the ldconfig_paths value
205 libdir_expanded=${LIBDIR:-${PREFIX}/lib}
208 Welcome to Notmuch, a system for indexing, searching and tagging your email.
210 We hope that the process of building and installing notmuch is quick
211 and smooth so that you can soon be reading and processing your email
212 more efficiently than ever.
214 If anything goes wrong in the configure process, you can override any
215 decisions it makes by manually editing the Makefile.config file that
216 it creates. Also please do as much as you can to figure out what could
217 be different on your machine compared to those of the notmuch
218 developers. Then, please email those details to the Notmuch list
219 (notmuch@notmuchmail.org) so that we can hopefully make future
220 versions of notmuch easier for you to use.
222 We'll now investigate your system to verify that all required
223 dependencies are available:
229 if pkg-config --version > /dev/null 2>&1; then
235 printf "Checking for Xapian development files... "
237 for xapian_config in ${XAPIAN_CONFIG}; do
238 if ${xapian_config} --version > /dev/null 2>&1; then
239 printf "Yes (%s).\n" $(${xapian_config} --version | sed -e 's/.* //')
241 xapian_cxxflags=$(${xapian_config} --cxxflags)
242 xapian_ldflags=$(${xapian_config} --libs)
246 if [ ${have_xapian} = "0" ]; then
248 errors=$((errors + 1))
251 # If using GMime 2.6, we need to have a version >= 2.6.5 to avoid a
252 # crypto bug. We need 2.6.7 for permissive "From " header handling.
253 printf "Checking for GMime development files... "
255 for gmimepc in 'gmime-2.6 >= 2.6.7' gmime-2.4; do
256 if pkg-config --exists $gmimepc; then
257 printf "Yes ($gmimepc).\n"
259 gmime_cflags=$(pkg-config --cflags $gmimepc)
260 gmime_ldflags=$(pkg-config --libs $gmimepc)
264 if [ "$have_gmime" = "0" ]; then
266 errors=$((errors + 1))
269 # GMime already depends on Glib >= 2.12, but we use at least one Glib
270 # function that only exists as of 2.22, (g_array_unref)
271 printf "Checking for Glib development files (>= 2.22)... "
273 if pkg-config --exists 'glib-2.0 >= 2.22'; then
276 glib_cflags=$(pkg-config --cflags glib-2.0)
277 glib_ldflags=$(pkg-config --libs glib-2.0)
280 errors=$((errors + 1))
283 printf "Checking for talloc development files... "
284 if pkg-config --exists talloc; then
287 talloc_cflags=$(pkg-config --cflags talloc)
288 talloc_ldflags=$(pkg-config --libs talloc)
293 errors=$((errors + 1))
296 printf "Checking for valgrind development files... "
297 if pkg-config --exists valgrind; then
300 valgrind_cflags=$(pkg-config --cflags valgrind)
302 printf "No (but that's fine).\n"
306 if [ -z "${EMACSLISPDIR}" ]; then
307 if pkg-config --exists emacs; then
308 EMACSLISPDIR=$(pkg-config emacs --variable sitepkglispdir)
310 EMACSLISPDIR='$(prefix)/share/emacs/site-lisp'
314 if [ -z "${EMACSETCDIR}" ]; then
315 if pkg-config --exists emacs; then
316 EMACSETCDIR=$(pkg-config emacs --variable sitepkglispdir)
318 EMACSETCDIR='$(prefix)/share/emacs/site-lisp'
322 printf "Checking if emacs is available... "
323 if emacs --quick --batch > /dev/null 2>&1; then
327 printf "No (so will not byte-compile emacs code)\n"
333 printf "Checking which platform we are on... "
335 if [ $uname = "Darwin" ] ; then
338 linker_resolves_library_dependencies=0
339 elif [ $uname = "SunOS" ] ; then
342 linker_resolves_library_dependencies=0
343 elif [ $uname = "Linux" ] || [ $uname = "GNU" ] ; then
346 linker_resolves_library_dependencies=1
348 printf "Checking for $libdir_expanded in ldconfig... "
349 ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
350 # Separate ldconfig_paths only on newline (not on any potential
351 # embedded space characters in any filenames). Note, we use a
352 # literal newline in the source here rather than something like:
356 # because the shell's command substitution deletes any trailing newlines.
359 for path in $ldconfig_paths; do
360 if [ "$path" = "$libdir_expanded" ]; then
365 if [ "$libdir_in_ldconfig" = '0' ]; then
366 printf "No (will set RPATH)\n"
374 *** Warning: Unknown platform. Notmuch might or might not build correctly.
379 if [ $errors -gt 0 ]; then
382 *** Error: The dependencies of notmuch could not be satisfied. You will
383 need to install the following packages before being able to compile
387 if [ $have_xapian -eq 0 ]; then
388 echo " Xapian library (including development files such as headers)"
389 echo " http://xapian.org/"
391 if [ $have_gmime -eq 0 ]; then
392 echo " GMime 2.4 library (including development files such as headers)"
393 echo " http://spruce.sourceforge.net/gmime/"
395 if [ $have_glib -eq 0 ]; then
396 echo " Glib library >= 2.22 (including development files such as headers)"
397 echo " http://ftp.gnome.org/pub/gnome/sources/glib/"
399 if [ $have_talloc -eq 0 ]; then
400 echo " The talloc library (including development files such as headers)"
401 echo " http://talloc.samba.org/"
405 With any luck, you're using a modern, package-based operating system
406 that has all of these packages available in the distribution. In that
407 case a simple command will install everything you need. For example:
409 On Debian and similar systems:
411 sudo apt-get install libxapian-dev libgmime-2.4-dev libtalloc-dev
413 Or on Fedora and similar systems:
415 sudo yum install xapian-core-devel gmime-devel libtalloc-devel
417 On other systems, similar commands can be used, but the details of the
418 package names may be different.
421 if [ $have_pkg_config -eq 0 ]; then
423 Note: the pkg-config program is not available. This configure script
424 uses pkg-config to find the compilation flags required to link against
425 the various libraries needed by notmuch. It's possible you simply need
426 to install pkg-config with a command such as:
428 sudo apt-get install pkg-config
430 sudo yum install pkgconfig
432 But if pkg-config is not available for your system, then you will need
433 to modify the configure script to manually set the cflags and ldflags
434 variables to the correct values to link against each library in each
435 case that pkg-config could not be used to determine those values.
440 When you have installed the necessary dependencies, you can run
441 configure again to ensure the packages can be found, or simply run
442 "make" to compile notmuch.
448 printf "Checking for getline... "
449 if ${CC} -o compat/have_getline "$srcdir"/compat/have_getline.c > /dev/null 2>&1
454 printf "No (will use our own instead).\n"
457 rm -f compat/have_getline
459 printf "Checking for strcasestr... "
460 if ${CC} -o compat/have_strcasestr "$srcdir"/compat/have_strcasestr.c > /dev/null 2>&1
465 printf "No (will use our own instead).\n"
468 rm -f compat/have_strcasestr
470 printf "int main(void){return 0;}\n" > minimal.c
472 printf "Checking for rpath support... "
473 if ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1
476 rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)"
478 printf "No (nothing to worry about).\n"
482 printf "Checking for -Wl,--as-needed... "
483 if ${CC} -Wl,--as-needed -o minimal minimal.c >/dev/null 2>&1
486 as_needed_ldflags="-Wl,--as-needed"
488 printf "No (nothing to worry about).\n"
493 printf "Checking for available C++ compiler warning flags... "
494 for flag in -Wall -Wextra -Wwrite-strings -Wswitch-enum; do
495 if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
497 WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
500 printf "\n\t${WARN_CXXFLAGS}\n"
502 WARN_CFLAGS="${WARN_CXXFLAGS}"
503 printf "Checking for available C compiler warning flags... "
504 for flag in -Wmissing-declarations; do
505 if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
507 WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
510 printf "\n\t${WARN_CFLAGS}\n"
512 rm -f minimal minimal.c
516 All required packages were found. You may now run the following
517 commands to compile and install notmuch:
524 # construct the Makefile.config
525 cat > Makefile.config <<EOF
526 # This Makefile.config was automatically generated by the ./configure
527 # script of notmuch. If the configure script identified anything
528 # incorrectly, then you can edit this file to try to correct things,
529 # but be warned that if configure is run again it will destroy your
530 # changes, (and this could happen by simply calling "make" if the
531 # configure script is updated).
533 # The top-level directory for the source, (the directory containing
534 # the configure script). This may be different than the build
535 # directory (the current directory at the time configure was run).
538 configure_options = $@
540 # We use vpath directives (rather than the VPATH variable) since the
541 # VPATH variable matches targets as well as prerequisites, (which is
542 # not useful since then a target left-over from a srcdir build would
543 # cause a target to not be built in the non-srcdir build).
545 # Also, we don't use a single "vpath % \$(srcdir)" here because we
546 # don't want the vpath to trigger for our emacs lisp compilation,
547 # (unless we first find a way to convince emacs to build the .elc
548 # target in a directory other than the directory of the .el
549 # prerequisite). In the meantime, we're actually copying in the .el
550 # files, (which is quite ugly).
552 vpath %.cc \$(srcdir)
554 vpath Makefile.% \$(srcdir)
556 # The C compiler to use
559 # The C++ compiler to use
562 # Command to execute emacs from Makefiles
563 EMACS = emacs --quick
565 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
568 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
569 CXXFLAGS = ${CXXFLAGS}
571 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
574 # Flags to enable warnings when using the C++ compiler
575 WARN_CXXFLAGS=${WARN_CXXFLAGS}
577 # Flags to enable warnings when using the C compiler
578 WARN_CFLAGS=${WARN_CFLAGS}
580 # The prefix to which notmuch should be installed
581 # Note: If you change this value here, be sure to ensure that the
582 # LIBDIR_IN_LDCONFIG value below is still set correctly.
585 # The directory to which libraries should be installed
586 # Note: If you change this value here, be sure to ensure that the
587 # LIBDIR_IN_LDCONFIG value below is still set correctly.
588 libdir = ${LIBDIR:=\$(prefix)/lib}
590 # Whether libdir is in a path configured into ldconfig
591 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
593 # The directory to which header files should be installed
594 includedir = ${INCLUDEDIR:=\$(prefix)/include}
596 # The directory to which man pages should be installed
597 mandir = ${MANDIR:=\$(prefix)/share/man}
599 # The directory to which read-only (configuration) files should be installed
600 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
602 # The directory to which emacs lisp files should be installed
603 emacslispdir=${EMACSLISPDIR}
605 # The directory to which emacs miscellaneous (machine-independent) files should
607 emacsetcdir=${EMACSETCDIR}
609 # Whether there's an emacs binary available for byte-compiling
610 HAVE_EMACS = ${have_emacs}
612 # The directory to which desktop files should be installed
613 desktop_dir = \$(prefix)/share/applications
615 # The directory to which bash completions files should be installed
616 bash_completion_dir = ${BASHCOMPLETIONDIR:=\$(sysconfdir)/bash_completion.d}
618 # The directory to which zsh completions files should be installed
619 zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completion/Unix}
621 # Whether the getline function is available (if not, then notmuch will
622 # build its own version)
623 HAVE_GETLINE = ${have_getline}
625 # Whether the strcasestr function is available (if not, then notmuch will
626 # build its own version)
627 HAVE_STRCASESTR = ${have_strcasestr}
629 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS
630 PLATFORM = ${platform}
632 # Whether the linker will automatically resolve the dependency of one
633 # library on another (if not, then linking a binary requires linking
634 # directly against both)
635 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
637 # Flags needed to compile and link against Xapian
638 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
639 XAPIAN_LDFLAGS = ${xapian_ldflags}
641 # Flags needed to compile and link against GMime-2.4
642 GMIME_CFLAGS = ${gmime_cflags}
643 GMIME_LDFLAGS = ${gmime_ldflags}
645 # Flags needed to compile and link against talloc
646 TALLOC_CFLAGS = ${talloc_cflags}
647 TALLOC_LDFLAGS = ${talloc_ldflags}
649 # Flags needed to have linker set rpath attribute
650 RPATH_LDFLAGS = ${rpath_ldflags}
652 # Flags needed to have linker link only to necessary libraries
653 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
655 # Whether valgrind header files are available
656 HAVE_VALGRIND = ${have_valgrind}
658 # And if so, flags needed at compile time for valgrind macros
659 VALGRIND_CFLAGS = ${valgrind_cflags}
662 WITH_EMACS = ${WITH_EMACS}
664 # Support for bash completion
665 WITH_BASH = ${WITH_BASH}
667 # Support for zsh completion
668 WITH_ZSH = ${WITH_ZSH}
670 # Combined flags for compiling and linking against all of the above
671 CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
672 \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
673 \$(VALGRIND_CFLAGS) -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
674 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
675 \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
676 \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS) \\
677 -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
678 CONFIGURE_LDFLAGS = \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS)