3 # Removing space from IFS makes it much easier to support filenames
4 # with spaces. See http://www.dwheeler.com/essays/filenames-in-shell.html
8 # Since we don't have space in IFS we use tab to separate things in lists
11 # Set several defaults (optionally specified by the user in
12 # environemnt variables)
16 CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)}
18 XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config}
20 # We don't allow the EMACS or GZIP Makefile variables inherit values
21 # from the environment as we do with CC and CXX above. The reason is
22 # that these names as environment variables have existing uses other
23 # than the program name that we want. (EMACS is set to 't' when a
24 # shell is running within emacs and GZIP specifies arguments to pass
25 # on the gzip command line).
27 # Set the defaults for values the user can specify with command-line
35 Usage: ./configure [options]...
37 This script configures notmuch to build on your system.
39 It verifies that dependencies are available, determines flags needed
40 to compile and link against various required libraries, and identifies
41 whether various system functions can be used or if locally-provided
42 replacements will be built instead.
44 Finally, it allows you to control various aspects of the build and
47 First, some common variables can specified via environment variables:
49 CC The C compiler to use
50 CFLAGS Flags to pass to the C compiler
51 CXX The C++ compiler to use
52 CXXFLAGS Flags to pass to the C compiler
53 LDFLAGS Flags to pass when linking
55 Each of these values can further be controlled by specifying them
56 later on the "make" command line.
58 Other environment variables can be used to control configure itself,
59 (and for which there is no equivalent build-time control):
61 XAPIAN_CONFIG The program to use to determine flags for
62 compiling and linking against the Xapian
63 library. [$XAPIAN_CONFIG]
65 Additionally, various options can be specified on the configure
68 --prefix=PREFIX Install files in PREFIX [$PREFIX]
70 By default, "make install" will install the resulting program to
71 $PREFIX/bin, documentation to $PREFIX/man, etc. You can
72 specify an installation prefix other than $PREFIX using
73 --prefix, for instance:
75 ./configure --prefix=\$HOME
77 Fine tuning of some installation directories is available:
79 --libdir=DIR Install libraries to DIR [PREFIX/lib]
80 --includedir=DIR Install header files to DIR [PREFIX/include]
81 --mandir=DIR Install man pages to DIR [PREFIX/share/man]
82 --sysconfdir=DIR Read-only single-machine data [PREFIX/etc]
83 --emacslispdir=DIR Emacs code [PREFIX/share/emacs/site-lisp]
85 Additional options are accepted for compatibility with other
86 configure-script calling conventions, but don't do anything yet:
88 --build=<cpu>-<vendor>-<os> Currently ignored
89 --host=<cpu>-<vendor>-<os> Currently ignored
90 --infodir=DIR Currently ignored
91 --datadir=DIR Currently ignored
92 --localstatedir=DIR Currently ignored
93 --libexecdir=DIR Currently ignored
94 --disable-maintainer-mode Currently ignored
95 --disable-dependency-tracking Currently ignored
100 # Parse command-line options
102 if [ "${option}" = '--help' ] ; then
105 elif [ "${option%%=*}" = '--prefix' ] ; then
106 PREFIX="${option#*=}"
107 elif [ "${option%%=*}" = '--libdir' ] ; then
108 LIBDIR="${option#*=}"
109 elif [ "${option%%=*}" = '--includedir' ] ; then
110 INCLUDEDIR="${option#*=}"
111 elif [ "${option%%=*}" = '--mandir' ] ; then
112 MANDIR="${option#*=}"
113 elif [ "${option%%=*}" = '--sysconfdir' ] ; then
114 SYSCONFDIR="${option#*=}"
115 elif [ "${option%%=*}" = '--emacslispdir' ] ; then
116 EMACSLISPDIR="${option#*=}"
117 elif [ "${option%%=*}" = '--build' ] ; then
118 build_option="${option#*=}"
119 case ${build_option} in
122 echo "Unrecognized value for --build option: ${build_option}"
123 echo "Should be: <cpu>-<vendor>-<os>"
129 build_cpu=${build_option%%-*}
130 build_option=${build_option#*-}
131 build_vendor=${build_option%%-*}
132 build_os=${build_option#*-}
133 elif [ "${option%%=*}" = '--host' ] ; then
134 host_option="${option#*=}"
135 case ${host_option} in
138 echo "Unrecognized value for --host option: ${host_option}"
139 echo "Should be: <cpu>-<vendor>-<os>"
145 host_cpu=${host_option%%-*}
146 host_option=${host_option#*-}
147 host_vendor=${host_option%%-*}
148 host_os=${host_option#*-}
149 elif [ "${option%%=*}" = '--infodir' ] ; then
151 elif [ "${option%%=*}" = '--datadir' ] ; then
153 elif [ "${option%%=*}" = '--localstatedir' ] ; then
155 elif [ "${option%%=*}" = '--libexecdir' ] ; then
157 elif [ "${option}" = '--disable-maintainer-mode' ] ; then
159 elif [ "${option}" = '--disable-dependency-tracking' ] ; then
162 echo "Unrecognized option: ${option}"
170 # We set this value early, (rather than just while printing the
171 # Makefile.config file later like most values), because we need to
172 # actually investigate this value compared to the ldconfig_paths value
174 libdir_expanded=${LIBDIR:-${PREFIX}/lib}
177 Welcome to Notmuch, a system for indexing, searching and tagging your email.
179 We hope that the process of building and installing notmuch is quick
180 and smooth so that you can soon be reading and processing your email
181 more efficiently than ever.
183 If anything goes wrong in the configure process, you can override any
184 decisions it makes by manually editing the Makefile.config file that
185 it creates. Also please do as much as you can to figure out what could
186 be different on your machine compared to those of the notmuch
187 developers. Then, please email those details to the Notmuch list
188 (notmuch@notmuchmail.org) so that we can hopefully make future
189 versions of notmuch easier for you to use.
191 We'll now investigate your system to verify that all required
192 dependencies are available:
198 if pkg-config --version > /dev/null 2>&1; then
204 printf "Checking for Xapian development files... "
206 for xapian_config in ${XAPIAN_CONFIG}; do
207 if ${xapian_config} --version > /dev/null 2>&1; then
208 printf "Yes (%s).\n" $(${xapian_config} --version | sed -e 's/.* //')
210 xapian_cxxflags=$(${xapian_config} --cxxflags)
211 xapian_ldflags=$(${xapian_config} --libs)
215 if [ ${have_xapian} = "0" ]; then
217 errors=$((errors + 1))
220 printf "Checking for GMime development files... "
222 for gmimepc in gmime-2.6 gmime-2.4; do
223 if pkg-config --modversion $gmimepc > /dev/null 2>&1; then
224 printf "Yes ($gmimepc).\n"
226 gmime_cflags=$(pkg-config --cflags $gmimepc)
227 gmime_ldflags=$(pkg-config --libs $gmimepc)
230 if [ "$have_gmime" = "0" ]; then
232 errors=$((errors + 1))
235 printf "Checking for talloc development files... "
236 if pkg-config --modversion talloc > /dev/null 2>&1; then
239 talloc_cflags=$(pkg-config --cflags talloc)
240 talloc_ldflags=$(pkg-config --libs talloc)
245 errors=$((errors + 1))
248 printf "Checking for valgrind development files... "
249 if pkg-config --modversion valgrind > /dev/null 2>&1; then
252 valgrind_cflags=$(pkg-config --cflags valgrind)
254 printf "No (but that's fine).\n"
258 if [ -z "${EMACSLISPDIR}" ]; then
259 if pkg-config --modversion emacs > /dev/null 2>&1; then
260 EMACSLISPDIR=$(pkg-config emacs --variable sitepkglispdir)
262 EMACSLISPDIR='$(prefix)/share/emacs/site-lisp'
266 printf "Checking if emacs is available... "
267 if emacs --quick --batch > /dev/null 2>&1; then
271 printf "No (so will not byte-compile emacs code)\n"
277 printf "Checking which platform we are on... "
279 if [ $uname = "Darwin" ] ; then
282 linker_resolves_library_dependencies=0
283 elif [ $uname = "SunOS" ] ; then
286 linker_resolves_library_dependencies=0
287 elif [ $uname = "Linux" ] ; then
290 linker_resolves_library_dependencies=1
291 ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
292 for path in $ldconfig_paths; do
293 echo "Checking $path compared to $libdir_expanded"
294 if [ "$path" = "$libdir_expanded" ]; then
302 *** Warning: Unknown platform. Notmuch might or might not build correctly.
307 if [ $errors -gt 0 ]; then
310 *** Error: The dependencies of notmuch could not be satisfied. You will
311 need to install the following packages before being able to compile
315 if [ $have_xapian -eq 0 ]; then
316 echo " Xapian library (including development files such as headers)"
317 echo " http://xapian.org/"
319 if [ $have_gmime -eq 0 ]; then
320 echo " GMime 2.4 library (including development files such as headers)"
321 echo " http://spruce.sourceforge.net/gmime/"
323 if [ $have_talloc -eq 0 ]; then
324 echo " The talloc library (including development files such as headers)"
325 echo " http://talloc.samba.org/"
329 With any luck, you're using a modern, package-based operating system
330 that has all of these packages available in the distribution. In that
331 case a simple command will install everything you need. For example:
333 On Debian and similar systems:
335 sudo apt-get install libxapian-dev libgmime-2.4-dev libtalloc-dev
337 Or on Fedora and similar systems:
339 sudo yum install xapian-core-devel gmime-devel libtalloc-devel
341 On other systems, similar commands can be used, but the details of the
342 package names may be different.
345 if [ $have_pkg_config -eq 0 ]; then
347 Note: the pkg-config program is not available. This configure script
348 uses pkg-config to find the compilation flags required to link against
349 the various libraries needed by notmuch. It's possible you simply need
350 to install pkg-config with a command such as:
352 sudo apt-get install pkg-config
354 sudo yum install pkgconfig
356 But if pkg-config is not available for your system, then you will need
357 to modify the configure script to manually set the cflags and ldflags
358 variables to the correct values to link against each library in each
359 case that pkg-config could not be used to determine those values.
364 When you have installed the necessary dependencies, you can run
365 configure again to ensure the packages can be found, or simply run
366 "make" to compile notmuch.
372 printf "Checking for getline... "
373 if ${CC} -o compat/have_getline compat/have_getline.c > /dev/null 2>&1
378 printf "No (will use our own instead).\n"
381 rm -f compat/have_getline
383 printf "Checking for strcasestr... "
384 if ${CC} -o compat/have_strcasestr compat/have_strcasestr.c > /dev/null 2>&1
389 printf "No (will use our own instead).\n"
392 rm -f compat/have_strcasestr
394 printf "int main(void){return 0;}\n" > minimal.c
396 printf "Checking for rpath support... "
397 if ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1
400 rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)"
402 printf "No (nothing to worry about).\n"
406 printf "Checking for available C++ compiler warning flags... "
407 for flag in -Wall -Wextra -Wwrite-strings -Wswitch-enum; do
408 if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
410 WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
413 printf "\n\t${WARN_CXXFLAGS}\n"
415 WARN_CFLAGS="${WARN_CXXFLAGS}"
416 printf "Checking for available C compiler warning flags... "
417 for flag in -Wmissing-declarations; do
418 if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
420 WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
423 printf "\n\t${WARN_CFLAGS}\n"
425 rm -f minimal minimal.c
429 All required packages were found. You may now run the following
430 commands to compile and install notmuch:
437 # construct the Makefile.config
438 cat > Makefile.config <<EOF
439 # This Makefile.config was automatically generated by the ./configure
440 # script of notmuch. If the configure script identified anything
441 # incorrectly, then you can edit this file to try to correct things,
442 # but be warned that if configure is run again it will destroy your
443 # changes, (and this could happen by simply calling "make" if the
444 # configure script is updated).
446 # The C compiler to use
449 # The C++ compiler to use
452 # Command to execute emacs from Makefiles
453 EMACS = emacs --quick
455 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
458 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
459 CXXFLAGS = ${CXXFLAGS}
461 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
464 # Flags to enable warnings when using the C++ compiler
465 WARN_CXXFLAGS=${WARN_CXXFLAGS}
467 # Flags to enable warnings when using the C compiler
468 WARN_CFLAGS=${WARN_CFLAGS}
470 # The prefix to which notmuch should be installed
471 # Note: If you change this value here, be sure to ensure that the
472 # LIBDIR_IN_LDCONFIG value below is still set correctly.
475 # The directory to which libraries should be installed
476 # Note: If you change this value here, be sure to ensure that the
477 # LIBDIR_IN_LDCONFIG value below is still set correctly.
478 libdir = ${LIBDIR:=\$(prefix)/lib}
480 # Whether libdir is in a path configured into ldconfig
481 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
483 # The directory to which header files should be installed
484 includedir = ${INCLUDEDIR:=\$(prefix)/include}
486 # The directory to which man pages should be installed
487 mandir = ${MANDIR:=\$(prefix)/share/man}
489 # The directory to which read-only (configuration) filesshould be installed
490 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
492 # The directory to which emacs lisp files should be installed
493 emacslispdir=${EMACSLISPDIR}
495 # Whether there's an emacs binary available for byte-compiling
496 HAVE_EMACS = ${have_emacs}
498 # The directory to which desktop files should be installed
499 desktop_dir = \$(prefix)/share/applications
501 # The directory to which bash completions files should be installed
502 bash_completion_dir = \$(sysconfdir)/bash_completion.d
504 # The directory to which zsh completions files should be installed
505 zsh_completion_dir = \$(prefix)/share/zsh/functions/Completion/Unix
507 # Whether the getline function is available (if not, then notmuch will
508 # build its own version)
509 HAVE_GETLINE = ${have_getline}
511 # Whether the strcasestr function is available (if not, then notmuch will
512 # build its own version)
513 HAVE_STRCASESTR = ${have_strcasestr}
515 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS
516 PLATFORM = ${platform}
518 # Whether the linker will automatically resolve the dependency of one
519 # library on another (if not, then linking a binary requires linking
520 # directly against both)
521 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
523 # Flags needed to compile and link against Xapian
524 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
525 XAPIAN_LDFLAGS = ${xapian_ldflags}
527 # Flags needed to compile and link against GMime-2.4
528 GMIME_CFLAGS = ${gmime_cflags}
529 GMIME_LDFLAGS = ${gmime_ldflags}
531 # Flags needed to compile and link against talloc
532 TALLOC_CFLAGS = ${talloc_cflags}
533 TALLOC_LDFLAGS = ${talloc_ldflags}
535 # Flags needed to have linker set rpath attribute
536 RPATH_LDFLAGS = ${rpath_ldflags}
538 # Whether valgrind header files are available
539 HAVE_VALGRIND = ${have_valgrind}
541 # And if so, flags needed at compile time for valgrind macros
542 VALGRIND_CFLAGS = ${valgrind_cflags}
544 # Combined flags for compiling and linking against all of the above
545 CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
546 \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
547 \$(VALGRIND_CFLAGS) -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
548 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
549 \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
550 \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS) \\
551 -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
552 CONFIGURE_LDFLAGS = \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS)