5 # For a non-srcdir configure invocation (such as ../configure), create
6 # the directory structure and copy Makefiles.
7 if [ "$srcdir" != "." ]; then
9 for dir in . $(grep "^subdirs *=" "$srcdir"/Makefile | sed -e "s/subdirs *= *//"); do
11 cp "$srcdir"/"$dir"/Makefile.local "$dir"
12 cp "$srcdir"/"$dir"/Makefile "$dir"
15 # Easiest way to get the test suite to work is to just copy the
16 # whole thing into the build directory.
17 cp -a "$srcdir"/test/* test
19 # Emacs only likes to generate compiled files next to the .el files
20 # by default so copy these as well (which is not ideal0.
21 cp -a "$srcdir"/emacs/*.el emacs
24 # Set several defaults (optionally specified by the user in
25 # environemnt variables)
29 CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)}
31 XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config}
33 # We don't allow the EMACS or GZIP Makefile variables inherit values
34 # from the environment as we do with CC and CXX above. The reason is
35 # that these names as environment variables have existing uses other
36 # than the program name that we want. (EMACS is set to 't' when a
37 # shell is running within emacs and GZIP specifies arguments to pass
38 # on the gzip command line).
40 # Set the defaults for values the user can specify with command-line
51 Usage: ./configure [options]...
53 This script configures notmuch to build on your system.
55 It verifies that dependencies are available, determines flags needed
56 to compile and link against various required libraries, and identifies
57 whether various system functions can be used or if locally-provided
58 replacements will be built instead.
60 Finally, it allows you to control various aspects of the build and
63 First, some common variables can specified via environment variables:
65 CC The C compiler to use
66 CFLAGS Flags to pass to the C compiler
67 CXX The C++ compiler to use
68 CXXFLAGS Flags to pass to the C compiler
69 LDFLAGS Flags to pass when linking
71 Each of these values can further be controlled by specifying them
72 later on the "make" command line.
74 Other environment variables can be used to control configure itself,
75 (and for which there is no equivalent build-time control):
77 XAPIAN_CONFIG The program to use to determine flags for
78 compiling and linking against the Xapian
79 library. [$XAPIAN_CONFIG]
81 Additionally, various options can be specified on the configure
84 --prefix=PREFIX Install files in PREFIX [$PREFIX]
86 By default, "make install" will install the resulting program to
87 $PREFIX/bin, documentation to $PREFIX/man, etc. You can
88 specify an installation prefix other than $PREFIX using
89 --prefix, for instance:
91 ./configure --prefix=\$HOME
93 Fine tuning of some installation directories is available:
95 --libdir=DIR Install libraries to DIR [PREFIX/lib]
96 --includedir=DIR Install header files to DIR [PREFIX/include]
97 --mandir=DIR Install man pages to DIR [PREFIX/share/man]
98 --sysconfdir=DIR Read-only single-machine data [PREFIX/etc]
99 --emacslispdir=DIR Emacs code [PREFIX/share/emacs/site-lisp]
100 --bashcompletiondir=DIR Bash completions files [SYSCONFDIR/bash_completion.d]
101 --zshcompletiondir=DIR Zsh completions files [PREFIX/share/zsh/functions/Completion/Unix]
103 Some features can be disabled (--with-feature=no is equivalent to
106 --without-emacs Do not install lisp file
107 --without-bash-completion Do not install bash completions files
108 --without-zsh-completion Do not install zsh completions files
110 Additional options are accepted for compatibility with other
111 configure-script calling conventions, but don't do anything yet:
113 --build=<cpu>-<vendor>-<os> Currently ignored
114 --host=<cpu>-<vendor>-<os> Currently ignored
115 --infodir=DIR Currently ignored
116 --datadir=DIR Currently ignored
117 --localstatedir=DIR Currently ignored
118 --libexecdir=DIR Currently ignored
119 --disable-maintainer-mode Currently ignored
120 --disable-dependency-tracking Currently ignored
125 # Parse command-line options
127 if [ "${option}" = '--help' ] ; then
130 elif [ "${option%%=*}" = '--prefix' ] ; then
131 PREFIX="${option#*=}"
132 elif [ "${option%%=*}" = '--libdir' ] ; then
133 LIBDIR="${option#*=}"
134 elif [ "${option%%=*}" = '--includedir' ] ; then
135 INCLUDEDIR="${option#*=}"
136 elif [ "${option%%=*}" = '--mandir' ] ; then
137 MANDIR="${option#*=}"
138 elif [ "${option%%=*}" = '--sysconfdir' ] ; then
139 SYSCONFDIR="${option#*=}"
140 elif [ "${option%%=*}" = '--emacslispdir' ] ; then
141 EMACSLISPDIR="${option#*=}"
142 elif [ "${option%%=*}" = '--bashcompletiondir' ] ; then
143 BASHCOMPLETIONDIR="${option#*=}"
144 elif [ "${option%%=*}" = '--zshcompletiondir' ] ; then
145 ZSHCOMLETIONDIR="${option#*=}"
146 elif [ "${option%%=*}" = '--with-emacs' ]; then
147 if [ "${option#*=}" = 'no' ]; then
152 elif [ "${option}" = '--without-emacs' ] ; then
154 elif [ "${option%%=*}" = '--with-bash-completion' ]; then
155 if [ "${option#*=}" = 'no' ]; then
160 elif [ "${option}" = '--without-bash-completion' ] ; then
162 elif [ "${option%%=*}" = '--with-zsh-completion' ]; then
163 if [ "${option#*=}" = 'no' ]; then
168 elif [ "${option}" = '--without-zsh-completion' ] ; then
170 elif [ "${option%%=*}" = '--build' ] ; then
171 build_option="${option#*=}"
172 case ${build_option} in
175 echo "Unrecognized value for --build option: ${build_option}"
176 echo "Should be: <cpu>-<vendor>-<os>"
182 build_cpu=${build_option%%-*}
183 build_option=${build_option#*-}
184 build_vendor=${build_option%%-*}
185 build_os=${build_option#*-}
186 elif [ "${option%%=*}" = '--host' ] ; then
187 host_option="${option#*=}"
188 case ${host_option} in
191 echo "Unrecognized value for --host option: ${host_option}"
192 echo "Should be: <cpu>-<vendor>-<os>"
198 host_cpu=${host_option%%-*}
199 host_option=${host_option#*-}
200 host_vendor=${host_option%%-*}
201 host_os=${host_option#*-}
202 elif [ "${option%%=*}" = '--infodir' ] ; then
204 elif [ "${option%%=*}" = '--datadir' ] ; then
206 elif [ "${option%%=*}" = '--localstatedir' ] ; then
208 elif [ "${option%%=*}" = '--libexecdir' ] ; then
210 elif [ "${option}" = '--disable-maintainer-mode' ] ; then
212 elif [ "${option}" = '--disable-dependency-tracking' ] ; then
215 echo "Unrecognized option: ${option}"
223 # We set this value early, (rather than just while printing the
224 # Makefile.config file later like most values), because we need to
225 # actually investigate this value compared to the ldconfig_paths value
227 libdir_expanded=${LIBDIR:-${PREFIX}/lib}
230 Welcome to Notmuch, a system for indexing, searching and tagging your email.
232 We hope that the process of building and installing notmuch is quick
233 and smooth so that you can soon be reading and processing your email
234 more efficiently than ever.
236 If anything goes wrong in the configure process, you can override any
237 decisions it makes by manually editing the Makefile.config file that
238 it creates. Also please do as much as you can to figure out what could
239 be different on your machine compared to those of the notmuch
240 developers. Then, please email those details to the Notmuch list
241 (notmuch@notmuchmail.org) so that we can hopefully make future
242 versions of notmuch easier for you to use.
244 We'll now investigate your system to verify that all required
245 dependencies are available:
251 if pkg-config --version > /dev/null 2>&1; then
257 printf "Checking for Xapian development files... "
259 for xapian_config in ${XAPIAN_CONFIG}; do
260 if ${xapian_config} --version > /dev/null 2>&1; then
261 printf "Yes (%s).\n" $(${xapian_config} --version | sed -e 's/.* //')
263 xapian_cxxflags=$(${xapian_config} --cxxflags)
264 xapian_ldflags=$(${xapian_config} --libs)
268 if [ ${have_xapian} = "0" ]; then
270 errors=$((errors + 1))
273 printf "Checking for GMime development files... "
275 for gmimepc in gmime-2.6 gmime-2.4; do
276 if pkg-config --exists $gmimepc; then
277 printf "Yes ($gmimepc).\n"
279 gmime_cflags=$(pkg-config --cflags $gmimepc)
280 gmime_ldflags=$(pkg-config --libs $gmimepc)
283 if [ "$have_gmime" = "0" ]; then
285 errors=$((errors + 1))
288 # GMime already depends on Glib >= 2.12, but we use at least one Glib
289 # function that only exists as of 2.14, (g_hash_table_get_keys)
290 printf "Checking for Glib development files (>= 2.14)... "
292 if pkg-config --exists 'glib-2.0 >= 2.14'; then
295 glib_cflags=$(pkg-config --cflags glib-2.0)
296 glib_ldflags=$(pkg-config --libs glib-2.0)
299 errors=$((errors + 1))
302 printf "Checking for talloc development files... "
303 if pkg-config --exists talloc; then
306 talloc_cflags=$(pkg-config --cflags talloc)
307 talloc_ldflags=$(pkg-config --libs talloc)
312 errors=$((errors + 1))
315 printf "Checking for valgrind development files... "
316 if pkg-config --exists valgrind; then
319 valgrind_cflags=$(pkg-config --cflags valgrind)
321 printf "No (but that's fine).\n"
325 if [ -z "${EMACSLISPDIR}" ]; then
326 if pkg-config --exists emacs; then
327 EMACSLISPDIR=$(pkg-config emacs --variable sitepkglispdir)
329 EMACSLISPDIR='$(prefix)/share/emacs/site-lisp'
333 printf "Checking if emacs is available... "
334 if emacs --quick --batch > /dev/null 2>&1; then
338 printf "No (so will not byte-compile emacs code)\n"
344 printf "Checking which platform we are on... "
346 if [ $uname = "Darwin" ] ; then
349 linker_resolves_library_dependencies=0
350 elif [ $uname = "SunOS" ] ; then
353 linker_resolves_library_dependencies=0
354 elif [ $uname = "Linux" ] ; then
357 linker_resolves_library_dependencies=1
359 printf "Checking for $libdir_expanded in ldconfig... "
360 ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
361 # Separate ldconfig_paths only on newline (not on any potential
362 # embedded space characters in any filenames). Note, we use a
363 # literal newline in the source here rather than something like:
367 # because the shell's command substitution deletes any trailing newlines.
371 for path in $ldconfig_paths; do
372 if [ "$path" = "$libdir_expanded" ]; then
377 if [ "$libdir_in_ldconfig" = '0' ]; then
378 printf "No (will set RPATH)\n"
386 *** Warning: Unknown platform. Notmuch might or might not build correctly.
391 if [ $errors -gt 0 ]; then
394 *** Error: The dependencies of notmuch could not be satisfied. You will
395 need to install the following packages before being able to compile
399 if [ $have_xapian -eq 0 ]; then
400 echo " Xapian library (including development files such as headers)"
401 echo " http://xapian.org/"
403 if [ $have_gmime -eq 0 ]; then
404 echo " GMime 2.4 library (including development files such as headers)"
405 echo " http://spruce.sourceforge.net/gmime/"
407 if [ $have_glib -eq 0 ]; then
408 echo " Glib library >= 2.14 (including development files such as headers)"
409 echo " http://ftp.gnome.org/pub/gnome/sources/glib/"
411 if [ $have_talloc -eq 0 ]; then
412 echo " The talloc library (including development files such as headers)"
413 echo " http://talloc.samba.org/"
417 With any luck, you're using a modern, package-based operating system
418 that has all of these packages available in the distribution. In that
419 case a simple command will install everything you need. For example:
421 On Debian and similar systems:
423 sudo apt-get install libxapian-dev libgmime-2.4-dev libtalloc-dev
425 Or on Fedora and similar systems:
427 sudo yum install xapian-core-devel gmime-devel libtalloc-devel
429 On other systems, similar commands can be used, but the details of the
430 package names may be different.
433 if [ $have_pkg_config -eq 0 ]; then
435 Note: the pkg-config program is not available. This configure script
436 uses pkg-config to find the compilation flags required to link against
437 the various libraries needed by notmuch. It's possible you simply need
438 to install pkg-config with a command such as:
440 sudo apt-get install pkg-config
442 sudo yum install pkgconfig
444 But if pkg-config is not available for your system, then you will need
445 to modify the configure script to manually set the cflags and ldflags
446 variables to the correct values to link against each library in each
447 case that pkg-config could not be used to determine those values.
452 When you have installed the necessary dependencies, you can run
453 configure again to ensure the packages can be found, or simply run
454 "make" to compile notmuch.
460 printf "Checking for getline... "
461 if ${CC} -o compat/have_getline "$srcdir"/compat/have_getline.c > /dev/null 2>&1
466 printf "No (will use our own instead).\n"
469 rm -f compat/have_getline
471 printf "Checking for strcasestr... "
472 if ${CC} -o compat/have_strcasestr "$srcdir"/compat/have_strcasestr.c > /dev/null 2>&1
477 printf "No (will use our own instead).\n"
480 rm -f compat/have_strcasestr
482 printf "int main(void){return 0;}\n" > minimal.c
484 printf "Checking for rpath support... "
485 if ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1
488 rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)"
490 printf "No (nothing to worry about).\n"
494 printf "Checking for -Wl,--as-needed... "
495 if ${CC} -Wl,--as-needed -o minimal minimal.c >/dev/null 2>&1
498 as_needed_ldflags="-Wl,--as-needed"
500 printf "No (nothing to worry about).\n"
505 printf "Checking for available C++ compiler warning flags... "
506 for flag in -Wall -Wextra -Wwrite-strings -Wswitch-enum; do
507 if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
509 WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
512 printf "\n\t${WARN_CXXFLAGS}\n"
514 WARN_CFLAGS="${WARN_CXXFLAGS}"
515 printf "Checking for available C compiler warning flags... "
516 for flag in -Wmissing-declarations; do
517 if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
519 WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
522 printf "\n\t${WARN_CFLAGS}\n"
524 rm -f minimal minimal.c
528 All required packages were found. You may now run the following
529 commands to compile and install notmuch:
536 # construct the Makefile.config
537 cat > Makefile.config <<EOF
538 # This Makefile.config was automatically generated by the ./configure
539 # script of notmuch. If the configure script identified anything
540 # incorrectly, then you can edit this file to try to correct things,
541 # but be warned that if configure is run again it will destroy your
542 # changes, (and this could happen by simply calling "make" if the
543 # configure script is updated).
545 # The top-level directory for the source, (the directory containing
546 # the configure script). This may be different than the build
547 # directory (the current directory at the time configure was run).
550 configure_options = $@
552 # We use vpath directives (rather than the VPATH variable) since the
553 # VPATH variable matches targets as well as prerequisites, (which is
554 # not useful since then a target left-over from a srcdir build would
555 # cause a target to not be built in the non-srcdir build).
557 # Also, we don't use a single "vpath % \$(srcdir)" here because we
558 # don't want the vpath to trigger for our emacs lisp compilation,
559 # (unless we first find a way to convince emacs to build the .elc
560 # target in a directory other than the directory of the .el
561 # prerequisite). In the meantime, we're actually copying in the .el
562 # files, (which is quite ugly).
564 vpath %.cc \$(srcdir)
566 vpath Makefile.% \$(srcdir)
568 # The C compiler to use
571 # The C++ compiler to use
574 # Command to execute emacs from Makefiles
575 EMACS = emacs --quick
577 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
580 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
581 CXXFLAGS = ${CXXFLAGS}
583 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
586 # Flags to enable warnings when using the C++ compiler
587 WARN_CXXFLAGS=${WARN_CXXFLAGS}
589 # Flags to enable warnings when using the C compiler
590 WARN_CFLAGS=${WARN_CFLAGS}
592 # The prefix to which notmuch should be installed
593 # Note: If you change this value here, be sure to ensure that the
594 # LIBDIR_IN_LDCONFIG value below is still set correctly.
597 # The directory to which libraries should be installed
598 # Note: If you change this value here, be sure to ensure that the
599 # LIBDIR_IN_LDCONFIG value below is still set correctly.
600 libdir = ${LIBDIR:=\$(prefix)/lib}
602 # Whether libdir is in a path configured into ldconfig
603 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
605 # The directory to which header files should be installed
606 includedir = ${INCLUDEDIR:=\$(prefix)/include}
608 # The directory to which man pages should be installed
609 mandir = ${MANDIR:=\$(prefix)/share/man}
611 # The directory to which read-only (configuration) filesshould be installed
612 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
614 # The directory to which emacs lisp files should be installed
615 emacslispdir=${EMACSLISPDIR}
617 # Whether there's an emacs binary available for byte-compiling
618 HAVE_EMACS = ${have_emacs}
620 # The directory to which desktop files should be installed
621 desktop_dir = \$(prefix)/share/applications
623 # The directory to which bash completions files should be installed
624 bash_completion_dir = ${BASHCOMPLETIONDIR:=\$(sysconfdir)/bash_completion.d}
626 # The directory to which zsh completions files should be installed
627 zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completion/Unix}
629 # Whether the getline function is available (if not, then notmuch will
630 # build its own version)
631 HAVE_GETLINE = ${have_getline}
633 # Whether the strcasestr function is available (if not, then notmuch will
634 # build its own version)
635 HAVE_STRCASESTR = ${have_strcasestr}
637 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS
638 PLATFORM = ${platform}
640 # Whether the linker will automatically resolve the dependency of one
641 # library on another (if not, then linking a binary requires linking
642 # directly against both)
643 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
645 # Flags needed to compile and link against Xapian
646 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
647 XAPIAN_LDFLAGS = ${xapian_ldflags}
649 # Flags needed to compile and link against GMime-2.4
650 GMIME_CFLAGS = ${gmime_cflags}
651 GMIME_LDFLAGS = ${gmime_ldflags}
653 # Flags needed to compile and link against talloc
654 TALLOC_CFLAGS = ${talloc_cflags}
655 TALLOC_LDFLAGS = ${talloc_ldflags}
657 # Flags needed to have linker set rpath attribute
658 RPATH_LDFLAGS = ${rpath_ldflags}
660 # Flags needed to have linker link only to necessary libraries
661 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
663 # Whether valgrind header files are available
664 HAVE_VALGRIND = ${have_valgrind}
666 # And if so, flags needed at compile time for valgrind macros
667 VALGRIND_CFLAGS = ${valgrind_cflags}
670 WITH_EMACS = ${WITH_EMACS}
672 # Support for bash completion
673 WITH_BASH = ${WITH_BASH}
675 # Support for zsh completion
676 WITH_ZSH = ${WITH_ZSH}
678 # Combined flags for compiling and linking against all of the above
679 CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
680 \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
681 \$(VALGRIND_CFLAGS) -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
682 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
683 \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
684 \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS) \\
685 -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
686 CONFIGURE_LDFLAGS = \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS)