]> git.notmuchmail.org Git - notmuch/blob - configure
lib: Add per-message last modification tracking
[notmuch] / configure
1 #! /bin/sh
2
3 # Test whether this shell is capable of parameter substring processing.
4 ( option='a/b'; : ${option#*/} ) 2>/dev/null || {
5     echo "
6 The shell interpreting '$0' is lacking some required features.
7
8 To work around this problem you may try to execute:
9
10     ksh $0 $*
11  or
12     bash $0 $*
13 "
14     exit 1
15 }
16
17 # Store original IFS value so it can be changed (and restored) in many places.
18 readonly DEFAULT_IFS="$IFS"
19
20 srcdir=$(dirname "$0")
21
22 subdirs="util compat lib parse-time-string completion doc emacs"
23 subdirs="${subdirs} performance-test test test/test-databases"
24 subdirs="${subdirs} bindings"
25
26 # For a non-srcdir configure invocation (such as ../configure), create
27 # the directory structure and copy Makefiles.
28 if [ "$srcdir" != "." ]; then
29
30     for dir in . ${subdirs}; do
31         mkdir -p "$dir"
32         cp "$srcdir"/"$dir"/Makefile.local "$dir"
33         cp "$srcdir"/"$dir"/Makefile "$dir"
34     done
35
36     # Easiest way to get the test suite to work is to just copy the
37     # whole thing into the build directory.
38     cp -a "$srcdir"/test/* test
39
40     # Emacs only likes to generate compiled files next to the .el files
41     # by default so copy these as well (which is not ideal).
42     cp -a "$srcdir"/emacs/*.el emacs
43 fi
44
45 # Set several defaults (optionally specified by the user in
46 # environment variables)
47 CC=${CC:-cc}
48 CXX=${CXX:-c++}
49 CFLAGS=${CFLAGS:--g -O2}
50 CPPFLAGS=${CPPFLAGS:-}
51 CXXFLAGS_for_sh=${CXXFLAGS:-${CFLAGS}}
52 CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)}
53 LDFLAGS=${LDFLAGS:-}
54 XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config}
55 PYTHON=${PYTHON:-}
56
57 # We don't allow the EMACS or GZIP Makefile variables inherit values
58 # from the environment as we do with CC and CXX above. The reason is
59 # that these names as environment variables have existing uses other
60 # than the program name that we want. (EMACS is set to 't' when a
61 # shell is running within emacs and GZIP specifies arguments to pass
62 # on the gzip command line).
63
64 # Set the defaults for values the user can specify with command-line
65 # options.
66 PREFIX=/usr/local
67 LIBDIR=
68 WITH_DOCS=1
69 WITH_EMACS=1
70 WITH_BASH=1
71 WITH_RUBY=1
72 WITH_ZSH=1
73
74 # Compatible GMime versions (with constraints).
75 # If using GMime 2.6, we need to have a version >= 2.6.5 to avoid a
76 # crypto bug. We need 2.6.7 for permissive "From " header handling.
77 GMIME_24_VERSION_CTR=''
78 GMIME_24_VERSION="gmime-2.4 $GMIME_24_VERSION_CTR"
79 GMIME_26_VERSION_CTR='>= 2.6.7'
80 GMIME_26_VERSION="gmime-2.6 $GMIME_26_VERSION_CTR"
81
82 WITH_GMIME_VERSIONS="$GMIME_26_VERSION;$GMIME_24_VERSION"
83
84 usage ()
85 {
86     cat <<EOF
87 Usage: ./configure [options]...
88
89 This script configures notmuch to build on your system.
90
91 It verifies that dependencies are available, determines flags needed
92 to compile and link against various required libraries, and identifies
93 whether various system functions can be used or if locally-provided
94 replacements will be built instead.
95
96 Finally, it allows you to control various aspects of the build and
97 installation process.
98
99 First, some common variables can specified via environment variables:
100
101         CC              The C compiler to use
102         CFLAGS          Flags to pass to the C compiler
103         CPPFLAGS        Flags to pass to the C preprocessor
104         CXX             The C++ compiler to use
105         CXXFLAGS        Flags to pass to the C compiler
106         LDFLAGS         Flags to pass when linking
107
108 Each of these values can further be controlled by specifying them
109 later on the "make" command line.
110
111 Other environment variables can be used to control configure itself,
112 (and for which there is no equivalent build-time control):
113
114         XAPIAN_CONFIG   The program to use to determine flags for
115                         compiling and linking against the Xapian
116                         library. [$XAPIAN_CONFIG]
117         PYTHON          Name of python command to use in
118                         configure and the test suite.
119
120 Additionally, various options can be specified on the configure
121 command line.
122
123         --prefix=PREFIX Install files in PREFIX [$PREFIX]
124
125 By default, "make install" will install the resulting program to
126 $PREFIX/bin, documentation to $PREFIX/man, etc. You can
127 specify an installation prefix other than $PREFIX using
128 --prefix, for instance:
129
130         ./configure --prefix=\$HOME
131
132 Fine tuning of some installation directories is available:
133
134         --libdir=DIR            Install libraries to DIR [PREFIX/lib]
135         --includedir=DIR        Install header files to DIR [PREFIX/include]
136         --mandir=DIR            Install man pages to DIR [PREFIX/share/man]
137         --sysconfdir=DIR        Read-only single-machine data [PREFIX/etc]
138         --emacslispdir=DIR      Emacs code [PREFIX/share/emacs/site-lisp]
139         --emacsetcdir=DIR       Emacs miscellaneous files [PREFIX/share/emacs/site-lisp]
140         --bashcompletiondir=DIR Bash completions files [SYSCONFDIR/bash_completion.d]
141         --zshcompletiondir=DIR  Zsh completions files [PREFIX/share/zsh/functions/Completion/Unix]
142
143 Some specific library versions can be specified (auto-detected otherwise):
144
145         --with-gmime-version=VERS       Specify GMIME version (2.4 or 2.6)
146
147 Some features can be disabled (--with-feature=no is equivalent to
148 --without-feature) :
149
150         --without-bash-completion       Do not install bash completions files
151         --without-docs                  Do not install documentation and man pages
152         --without-emacs                 Do not install lisp file
153         --without-ruby                  Do not install ruby bindings
154         --without-zsh-completion        Do not install zsh completions files
155
156 Additional options are accepted for compatibility with other
157 configure-script calling conventions, but don't do anything yet:
158
159         --build=<cpu>-<vendor>-<os>     Currently ignored
160         --host=<cpu>-<vendor>-<os>      Currently ignored
161         --infodir=DIR                   Currently ignored
162         --datadir=DIR                   Currently ignored
163         --localstatedir=DIR             Currently ignored
164         --libexecdir=DIR                Currently ignored
165         --disable-maintainer-mode       Currently ignored
166         --disable-dependency-tracking   Currently ignored
167
168 EOF
169 }
170
171 # Parse command-line options
172 for option; do
173     if [ "${option}" = '--help' ] ; then
174         usage
175         exit 0
176     elif [ "${option%%=*}" = '--prefix' ] ; then
177         PREFIX="${option#*=}"
178     elif [ "${option%%=*}" = '--libdir' ] ; then
179         LIBDIR="${option#*=}"
180     elif [ "${option%%=*}" = '--includedir' ] ; then
181         INCLUDEDIR="${option#*=}"
182     elif [ "${option%%=*}" = '--mandir' ] ; then
183         MANDIR="${option#*=}"
184     elif [ "${option%%=*}" = '--sysconfdir' ] ; then
185         SYSCONFDIR="${option#*=}"
186     elif [ "${option%%=*}" = '--emacslispdir' ] ; then
187         EMACSLISPDIR="${option#*=}"
188     elif [ "${option%%=*}" = '--emacsetcdir' ] ; then
189         EMACSETCDIR="${option#*=}"
190     elif [ "${option%%=*}" = '--bashcompletiondir' ] ; then
191         BASHCOMPLETIONDIR="${option#*=}"
192     elif [ "${option%%=*}" = '--zshcompletiondir' ] ; then
193         ZSHCOMLETIONDIR="${option#*=}"
194     elif [ "${option%%=*}" = '--with-docs' ]; then
195         if [ "${option#*=}" = 'no' ]; then
196             WITH_DOCS=0
197         else
198             WITH_DOCS=1
199         fi
200     elif [ "${option}" = '--without-docs' ] ; then
201         WITH_DOCS=0
202     elif [ "${option%%=*}" = '--with-emacs' ]; then
203         if [ "${option#*=}" = 'no' ]; then
204             WITH_EMACS=0
205         else
206             WITH_EMACS=1
207         fi
208     elif [ "${option}" = '--without-emacs' ] ; then
209         WITH_EMACS=0
210     elif [ "${option%%=*}" = '--with-bash-completion' ]; then
211         if [ "${option#*=}" = 'no' ]; then
212             WITH_BASH=0
213         else
214             WITH_BASH=1
215         fi
216     elif [ "${option}" = '--without-bash-completion' ] ; then
217         WITH_BASH=0
218     elif [ "${option%%=*}" = '--with-ruby' ]; then
219         if [ "${option#*=}" = 'no' ]; then
220             WITH_RUBY=0
221         else
222             WITH_RUBY=1
223         fi
224     elif [ "${option}" = '--without-ruby' ] ; then
225         WITH_RUBY=0
226     elif [ "${option%%=*}" = '--with-zsh-completion' ]; then
227         if [ "${option#*=}" = 'no' ]; then
228             WITH_ZSH=0
229         else
230             WITH_ZSH=1
231         fi
232     elif [ "${option}" = '--without-zsh-completion' ] ; then
233         WITH_ZSH=0
234     elif [ "${option%%=*}" = '--with-gmime-version' ] ; then
235         if [ "${option#*=}" = '2.4' ]; then
236              WITH_GMIME_VERSIONS=$GMIME_24_VERSION
237          elif [ "${option#*=}" = '2.6' ]; then
238              WITH_GMIME_VERSIONS=$GMIME_26_VERSION
239         fi
240     elif [ "${option%%=*}" = '--build' ] ; then
241         true
242     elif [ "${option%%=*}" = '--host' ] ; then
243         true
244     elif [ "${option%%=*}" = '--infodir' ] ; then
245         true
246     elif [ "${option%%=*}" = '--datadir' ] ; then
247         true
248     elif [ "${option%%=*}" = '--localstatedir' ] ; then
249         true
250     elif [ "${option%%=*}" = '--libexecdir' ] ; then
251         true
252     elif [ "${option}" = '--disable-maintainer-mode' ] ; then
253         true
254     elif [ "${option}" = '--disable-dependency-tracking' ] ; then
255         true
256     else
257         echo "Unrecognized option: ${option}"
258         echo "See:"
259         echo "  $0 --help"
260         echo ""
261         exit 1
262     fi
263 done
264
265 # We set this value early, (rather than just while printing the
266 # Makefile.config file later like most values), because we need to
267 # actually investigate this value compared to the ldconfig_paths value
268 # below.
269 if [ -z "$LIBDIR" ] ; then
270     libdir_expanded="${PREFIX}/lib"
271 else
272     # very non-general variable expansion
273     libdir_expanded=`echo "$LIBDIR" | sed "s|\\${prefix}|${PREFIX}|g; s|\\$prefix/|${PREFIX}/|; s|//*|/|g"`
274 fi
275
276 cat <<EOF
277 Welcome to Notmuch, a system for indexing, searching and tagging your email.
278
279 We hope that the process of building and installing notmuch is quick
280 and smooth so that you can soon be reading and processing your email
281 more efficiently than ever.
282
283 If anything goes wrong in the configure process, you can override any
284 decisions it makes by manually editing the Makefile.config file that
285 it creates. Also please do as much as you can to figure out what could
286 be different on your machine compared to those of the notmuch
287 developers. Then, please email those details to the Notmuch list
288 (notmuch@notmuchmail.org) so that we can hopefully make future
289 versions of notmuch easier for you to use.
290
291 We'll now investigate your system to verify that all required
292 dependencies are available:
293
294 EOF
295
296 errors=0
297 printf "int main(void){return 0;}\n" > minimal.c
298
299 printf "Sanity checking C compilation environment... "
300 if ${CC} ${CFLAGS} ${CPPFLAGS} minimal.c ${LDFLAGS} -o minimal > /dev/null 2>&1
301 then
302     printf "OK.\n"
303 else
304     printf "Fail.\n"
305     errors=$((errors + 1))
306 fi
307
308 printf "Sanity checking C++ compilation environment... "
309 if ${CXX} ${CXXFLAGS_for_sh} ${CPPFLAGS} minimal.c ${LDFLAGS} -o minimal > /dev/null 2>&1
310 then
311     printf "OK.\n"
312 else
313     printf "Fail.\n"
314     errors=$((errors + 1))
315 fi
316
317 if [ $errors -gt 0 ]; then
318     cat <<EOF
319 *** Error: Initial sanity checking of environment failed.  Please try
320 running configure in a clean environment, and if the problem persists,
321 report a bug.
322 EOF
323     rm -f minimal minimal.c
324     exit 1
325 fi
326
327 printf "Reading libnotmuch version from source... "
328 cat > _libversion.c <<EOF
329 #include <stdio.h>
330 #include "lib/notmuch.h"
331 int main(void) {
332     printf("libnotmuch_version_major=%d\n",
333                 LIBNOTMUCH_MAJOR_VERSION);
334     printf("libnotmuch_version_minor=%d\n",
335                 LIBNOTMUCH_MINOR_VERSION);
336     printf("libnotmuch_version_release=%d\n",
337                 LIBNOTMUCH_MICRO_VERSION);
338     return 0;
339 }
340 EOF
341 if ${CC} ${CFLAGS} _libversion.c -o _libversion > /dev/null 2>&1 && \
342        ./_libversion > _libversion.sh && . ./_libversion.sh
343 then
344     printf "OK.\n"
345 else
346     cat <<EOF
347
348 *** Error: Reading lib/notmuch.h failed.
349 Please try running configure again in a clean environment, and if the
350 problem persists, report a bug.
351 EOF
352     rm -f _libversion _libversion.c _libversion.sh
353     exit 1
354 fi
355
356 if pkg-config --version > /dev/null 2>&1; then
357     have_pkg_config=1
358 else
359     have_pkg_config=0
360 fi
361
362 printf "Checking for Xapian development files... "
363 have_xapian=0
364 for xapian_config in ${XAPIAN_CONFIG}; do
365     if ${xapian_config} --version > /dev/null 2>&1; then
366         xapian_version=$(${xapian_config} --version | sed -e 's/.* //')
367         printf "Yes (%s).\n" ${xapian_version}
368         have_xapian=1
369         xapian_cxxflags=$(${xapian_config} --cxxflags)
370         xapian_ldflags=$(${xapian_config} --libs)
371         break
372     fi
373 done
374 if [ ${have_xapian} = "0" ]; then
375     printf "No.\n"
376     errors=$((errors + 1))
377 fi
378
379 # Compaction is only supported on Xapian > 1.2.6
380 have_xapian_compact=0
381 if [ ${have_xapian} = "1" ]; then
382     printf "Checking for Xapian compaction support... "
383     case "${xapian_version}" in
384         0.*|1.[01].*|1.2.[0-5])
385             printf "No (only available with Xapian > 1.2.6).\n" ;;
386         [1-9]*.[0-9]*.[0-9]*)
387             have_xapian_compact=1
388             printf "Yes.\n" ;;
389         *)
390             printf "Unknown version.\n" ;;
391     esac
392 fi
393
394 printf "Checking for GMime development files... "
395 have_gmime=0
396 IFS=';'
397 for gmimepc in $WITH_GMIME_VERSIONS; do
398     if pkg-config --exists $gmimepc; then
399         printf "Yes ($gmimepc).\n"
400         have_gmime=1
401         gmime_cflags=$(pkg-config --cflags $gmimepc)
402         gmime_ldflags=$(pkg-config --libs $gmimepc)
403         break
404     fi
405 done
406 IFS=$DEFAULT_IFS
407 if [ "$have_gmime" = "0" ]; then
408     printf "No.\n"
409     errors=$((errors + 1))
410 fi
411
412 # GMime already depends on Glib >= 2.12, but we use at least one Glib
413 # function that only exists as of 2.22, (g_array_unref)
414 printf "Checking for Glib development files (>= 2.22)... "
415 have_glib=0
416 if pkg-config --exists 'glib-2.0 >= 2.22'; then
417     printf "Yes.\n"
418     have_glib=1
419     glib_cflags=$(pkg-config --cflags glib-2.0)
420     glib_ldflags=$(pkg-config --libs glib-2.0)
421 else
422     printf "No.\n"
423     errors=$((errors + 1))
424 fi
425
426 if ! pkg-config --exists zlib; then
427   ${CC} ${zlib_cflags} -o compat/gen_zlib_pc \
428           "$srcdir"/compat/gen_zlib_pc.c ${zlib_ldflags} > /dev/null 2>&1 &&
429   compat/gen_zlib_pc > compat/zlib.pc &&
430   PKG_CONFIG_PATH="$PKG_CONFIG_PATH":compat &&
431   export PKG_CONFIG_PATH
432   rm -f compat/gen_zlib_pc
433 fi
434
435 printf "Checking for zlib (>= 1.2.5.2)... "
436 have_zlib=0
437 if pkg-config --atleast-version=1.2.5.2 zlib; then
438     printf "Yes.\n"
439     have_zlib=1
440     zlib_cflags=$(pkg-config --cflags zlib)
441     zlib_ldflags=$(pkg-config --libs zlib)
442 else
443     printf "No.\n"
444     errors=$((errors + 1))
445 fi
446
447 printf "Checking for talloc development files... "
448 if pkg-config --exists talloc; then
449     printf "Yes.\n"
450     have_talloc=1
451     talloc_cflags=$(pkg-config --cflags talloc)
452     talloc_ldflags=$(pkg-config --libs talloc)
453 else
454     printf "No.\n"
455     have_talloc=0
456     talloc_cflags=
457     errors=$((errors + 1))
458 fi
459
460 printf "Checking for python... "
461 have_python=0
462
463 for name in ${PYTHON} python python2 python3; do
464     if command -v $name > /dev/null; then
465         have_python=1
466         python=$name
467         printf "Yes ($name).\n"
468         break
469     fi
470 done
471
472 if [ $have_python -eq 0 ]; then
473     printf "No.\n"
474     errors=$((errors + 1))
475 fi
476
477 printf "Checking for valgrind development files... "
478 if pkg-config --exists valgrind; then
479     printf "Yes.\n"
480     have_valgrind=1
481     valgrind_cflags=$(pkg-config --cflags valgrind)
482 else
483     printf "No (but that's fine).\n"
484     have_valgrind=0
485 fi
486
487 printf "Checking for bash-completion (>= 1.90)... "
488 if pkg-config --atleast-version=1.90 bash-completion; then
489     printf "Yes.\n"
490 else
491     printf "No (will not install bash completion).\n"
492     WITH_BASH=0
493 fi
494
495 if [ -z "${EMACSLISPDIR}" ]; then
496     if pkg-config --exists emacs; then
497         EMACSLISPDIR=$(pkg-config emacs --variable sitepkglispdir)
498     else
499         EMACSLISPDIR='$(prefix)/share/emacs/site-lisp'
500     fi
501 fi
502
503 if [ -z "${EMACSETCDIR}" ]; then
504     if pkg-config --exists emacs; then
505         EMACSETCDIR=$(pkg-config emacs --variable sitepkglispdir)
506     else
507         EMACSETCDIR='$(prefix)/share/emacs/site-lisp'
508     fi
509 fi
510
511 printf "Checking if emacs is available... "
512 if emacs --quick --batch > /dev/null 2>&1; then
513     printf "Yes.\n"
514     have_emacs=1
515 else
516     printf "No (so will not byte-compile emacs code)\n"
517     have_emacs=0
518 fi
519
520 have_doxygen=0
521 if [ $WITH_DOCS = "1" ] ; then
522     printf "Checking if doxygen is available... "
523     if command -v doxygen > /dev/null; then
524         printf "Yes.\n"
525         have_doxygen=1
526     else
527         printf "No (so will not install api docs)\n"
528     fi
529 fi
530
531 have_ruby_dev=0
532 if [ $WITH_RUBY = "1" ] ; then
533     printf "Checking for ruby development files... "
534     if ruby -e "require 'mkmf'"> /dev/null 2>&1; then
535         printf "Yes.\n"
536         have_ruby_dev=1
537     else
538         printf "No (skipping ruby bindings)\n"
539     fi
540 fi
541
542 have_sphinx=0
543 if [ $WITH_DOCS = "1" ] ; then
544     printf "Checking if sphinx is available and supports nroff output... "
545     if command -v sphinx-build > /dev/null && ${python} -m sphinx.writers.manpage > /dev/null 2>&1 ; then
546         printf "Yes.\n"
547         have_sphinx=1
548     else
549         printf "No (so will not install man pages).\n"
550     fi
551 fi
552
553 libdir_in_ldconfig=0
554
555 printf "Checking which platform we are on... "
556 uname=`uname`
557 if [ $uname = "Darwin" ] ; then
558     printf "Mac OS X.\n"
559     platform=MACOSX
560     linker_resolves_library_dependencies=0
561 elif [ $uname = "SunOS" ] ; then
562     printf "Solaris.\n"
563     platform=SOLARIS
564     linker_resolves_library_dependencies=0
565 elif [ $uname = "FreeBSD" ] ; then
566     printf "FreeBSD.\n"
567     platform=FREEBSD
568     linker_resolves_library_dependencies=0
569 elif [ $uname = "OpenBSD" ] ; then
570     printf "OpenBSD.\n"
571     platform=OPENBSD
572     linker_resolves_library_dependencies=0
573 elif [ $uname = "Linux" ] || [ $uname = "GNU" ] ; then
574     printf "$uname\n"
575     platform="$uname"
576     linker_resolves_library_dependencies=1
577
578     printf "Checking for $libdir_expanded in ldconfig... "
579     ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
580     # Separate ldconfig_paths only on newline (not on any potential
581     # embedded space characters in any filenames). Note, we use a
582     # literal newline in the source here rather than something like:
583     #
584     #   IFS=$(printf '\n')
585     #
586     # because the shell's command substitution deletes any trailing newlines.
587     IFS="
588 "
589     for path in $ldconfig_paths; do
590         if [ "$path" = "$libdir_expanded" ]; then
591             libdir_in_ldconfig=1
592         fi
593     done
594     IFS=$DEFAULT_IFS
595     if [ "$libdir_in_ldconfig" = '0' ]; then
596         printf "No (will set RPATH)\n"
597     else
598         printf "Yes\n"
599     fi
600 else
601     printf "Unknown.\n"
602     cat <<EOF
603
604 *** Warning: Unknown platform. Notmuch might or might not build correctly.
605
606 EOF
607 fi
608
609 printf "Checking byte order... "
610 cat> _byteorder.c <<EOF
611 #include <stdio.h>
612 #include <stdint.h>
613 uint32_t test = 0x34333231;
614 int main() { printf("%.4s\n", (const char*)&test); return 0; }
615 EOF
616 ${CC} ${CFLAGS} _byteorder.c -o _byteorder > /dev/null 2>&1
617 util_byte_order=$(./_byteorder)
618 echo $util_byte_order
619
620 rm -f _byteorder _byteorder.c
621
622 if [ $errors -gt 0 ]; then
623     cat <<EOF
624
625 *** Error: The dependencies of notmuch could not be satisfied. You will
626 need to install the following packages before being able to compile
627 notmuch:
628
629 EOF
630     if [ $have_python -eq 0 ]; then
631         echo "  python interpreter"
632     fi
633     if [ $have_xapian -eq 0 ]; then
634         echo "  Xapian library (including development files such as headers)"
635         echo "  http://xapian.org/"
636     fi
637     if [ $have_zlib -eq 0 ]; then
638         echo "  zlib library (>= version 1.2.5.2, including development files such as headers)"
639         echo "  http://zlib.net/"
640         echo
641     fi
642     if [ $have_gmime -eq 0 ]; then
643         echo "  Either GMime 2.4 library" $GMIME_24_VERSION_CTR "or GMime 2.6 library" $GMIME_26_VERSION_CTR
644         echo "  (including development files such as headers)"
645         echo "  http://spruce.sourceforge.net/gmime/"
646         echo
647     fi
648     if [ $have_glib -eq 0 ]; then
649         echo "  Glib library >= 2.22 (including development files such as headers)"
650         echo "  http://ftp.gnome.org/pub/gnome/sources/glib/"
651         echo
652     fi
653     if [ $have_talloc -eq 0 ]; then
654         echo "  The talloc library (including development files such as headers)"
655         echo "  http://talloc.samba.org/"
656         echo
657     fi
658     cat <<EOF
659 With any luck, you're using a modern, package-based operating system
660 that has all of these packages available in the distribution. In that
661 case a simple command will install everything you need. For example:
662
663 On Debian and similar systems:
664
665         sudo apt-get install libxapian-dev libgmime-2.6-dev libtalloc-dev zlib1g-dev
666
667 Or on Fedora and similar systems:
668
669         sudo yum install xapian-core-devel gmime-devel libtalloc-devel zlib-devel
670
671 On other systems, similar commands can be used, but the details of the
672 package names may be different.
673
674 EOF
675     if [ $have_pkg_config -eq 0 ]; then
676 cat <<EOF
677 Note: the pkg-config program is not available. This configure script
678 uses pkg-config to find the compilation flags required to link against
679 the various libraries needed by notmuch. It's possible you simply need
680 to install pkg-config with a command such as:
681
682         sudo apt-get install pkg-config
683 Or:
684         sudo yum install pkgconfig
685
686 But if pkg-config is not available for your system, then you will need
687 to modify the configure script to manually set the cflags and ldflags
688 variables to the correct values to link against each library in each
689 case that pkg-config could not be used to determine those values.
690
691 EOF
692     fi
693 cat <<EOF
694 When you have installed the necessary dependencies, you can run
695 configure again to ensure the packages can be found, or simply run
696 "make" to compile notmuch.
697
698 EOF
699     exit 1
700 fi
701
702 printf "Checking for canonicalize_file_name... "
703 if ${CC} -o compat/have_canonicalize_file_name "$srcdir"/compat/have_canonicalize_file_name.c > /dev/null 2>&1
704 then
705     printf "Yes.\n"
706     have_canonicalize_file_name=1
707 else
708     printf "No (will use our own instead).\n"
709     have_canonicalize_file_name=0
710 fi
711 rm -f compat/have_canonicalize_file_name
712
713
714 printf "Checking for getline... "
715 if ${CC} -o compat/have_getline "$srcdir"/compat/have_getline.c > /dev/null 2>&1
716 then
717     printf "Yes.\n"
718     have_getline=1
719 else
720     printf "No (will use our own instead).\n"
721     have_getline=0
722 fi
723 rm -f compat/have_getline
724
725 printf "Checking for strcasestr... "
726 if ${CC} -o compat/have_strcasestr "$srcdir"/compat/have_strcasestr.c > /dev/null 2>&1
727 then
728     printf "Yes.\n"
729     have_strcasestr=1
730 else
731     printf "No (will use our own instead).\n"
732     have_strcasestr=0
733 fi
734 rm -f compat/have_strcasestr
735
736 printf "Checking for strsep... "
737 if ${CC} -o compat/have_strsep "$srcdir"/compat/have_strsep.c > /dev/null 2>&1
738 then
739     printf "Yes.\n"
740     have_strsep="1"
741 else
742     printf "No (will use our own instead).\n"
743     have_strsep="0"
744 fi
745 rm -f compat/have_strsep
746
747 printf "Checking for timegm... "
748 if ${CC} -o compat/have_timegm "$srcdir"/compat/have_timegm.c > /dev/null 2>&1
749 then
750     printf "Yes.\n"
751     have_timegm="1"
752 else
753     printf "No (will use our own instead).\n"
754     have_timegm="0"
755 fi
756 rm -f compat/have_timegm
757
758 printf "Checking for dirent.d_type... "
759 if ${CC} -o compat/have_d_type "$srcdir"/compat/have_d_type.c > /dev/null 2>&1
760 then
761     printf "Yes.\n"
762     have_d_type="1"
763 else
764     printf "No (will use stat instead).\n"
765     have_d_type="0"
766 fi
767 rm -f compat/have_d_type
768
769 printf "Checking for standard version of getpwuid_r... "
770 if ${CC} -o compat/check_getpwuid "$srcdir"/compat/check_getpwuid.c > /dev/null 2>&1
771 then
772     printf "Yes.\n"
773     std_getpwuid=1
774 else
775     printf "No (will define _POSIX_PTHREAD_SEMANTICS to get it).\n"
776     std_getpwuid=0
777 fi
778 rm -f compat/check_getpwuid
779
780 printf "Checking for standard version of asctime_r... "
781 if ${CC} -o compat/check_asctime "$srcdir"/compat/check_asctime.c > /dev/null 2>&1
782 then
783     printf "Yes.\n"
784     std_asctime=1
785 else
786     printf "No (will define _POSIX_PTHREAD_SEMANTICS to get it).\n"
787     std_asctime=0
788 fi
789 rm -f compat/check_asctime
790
791 printf "Checking for rpath support... "
792 if ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1
793 then
794     printf "Yes.\n"
795     rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)"
796 else
797     printf "No (nothing to worry about).\n"
798     rpath_ldflags=""
799 fi
800
801 printf "Checking for -Wl,--as-needed... "
802 if ${CC} -Wl,--as-needed -o minimal minimal.c >/dev/null 2>&1
803 then
804     printf "Yes.\n"
805     as_needed_ldflags="-Wl,--as-needed"
806 else
807     printf "No (nothing to worry about).\n"
808     as_needed_ldflags=""
809 fi
810
811 printf "Checking for -Wl,--no-undefined... "
812 if ${CC} -Wl,--no-undefined -o minimal minimal.c >/dev/null 2>&1
813 then
814     printf "Yes.\n"
815     no_undefined_ldflags="-Wl,--no-undefined"
816 else
817     printf "No (nothing to worry about).\n"
818     no_undefined_ldflags=""
819 fi
820
821 WARN_CXXFLAGS=""
822 printf "Checking for available C++ compiler warning flags... "
823 for flag in -Wall -Wextra -Wwrite-strings; do
824     if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
825     then
826         WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
827     fi
828 done
829 printf "\n\t${WARN_CXXFLAGS}\n"
830
831 WARN_CFLAGS="${WARN_CXXFLAGS}"
832 printf "Checking for available C compiler warning flags... "
833 for flag in -Wmissing-declarations; do
834     if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
835     then
836         WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
837     fi
838 done
839 printf "\n\t${WARN_CFLAGS}\n"
840
841 rm -f minimal minimal.c _libversion.c _libversion _libversion.sh
842
843 # construct the Makefile.config
844 cat > Makefile.config <<EOF
845 # This Makefile.config was automatically generated by the ./configure
846 # script of notmuch. If the configure script identified anything
847 # incorrectly, then you can edit this file to try to correct things,
848 # but be warned that if configure is run again it will destroy your
849 # changes, (and this could happen by simply calling "make" if the
850 # configure script is updated).
851
852 # The top-level directory for the source, (the directory containing
853 # the configure script). This may be different than the build
854 # directory (the current directory at the time configure was run).
855 srcdir = ${srcdir}
856
857 # subdirectories to build
858 subdirs = ${subdirs}
859
860 configure_options = $@
861
862 # We use vpath directives (rather than the VPATH variable) since the
863 # VPATH variable matches targets as well as prerequisites, (which is
864 # not useful since then a target left-over from a srcdir build would
865 # cause a target to not be built in the non-srcdir build).
866 #
867 # Also, we don't use a single "vpath % \$(srcdir)" here because we
868 # don't want the vpath to trigger for our emacs lisp compilation,
869 # (unless we first find a way to convince emacs to build the .elc
870 # target in a directory other than the directory of the .el
871 # prerequisite). In the meantime, we're actually copying in the .el
872 # files, (which is quite ugly).
873 vpath %.c \$(srcdir)
874 vpath %.cc \$(srcdir)
875 vpath Makefile.% \$(srcdir)
876 vpath %.py \$(srcdir)
877 vpath %.rst \$(srcdir)
878
879 # Library versions (used to make SONAME)
880 # The major version of the library interface. This will control the soname.
881 # As such, this number must be incremented for any incompatible change to
882 # the library interface, (such as the deletion of an API or a major
883 # semantic change that breaks formerly functioning code).
884 #
885 LIBNOTMUCH_VERSION_MAJOR = ${libnotmuch_version_major}
886
887 # The minor version of the library interface. This should be incremented at
888 # the time of release for any additions to the library interface,
889 # (and when it is incremented, the release version of the library should
890 #  be reset to 0).
891 LIBNOTMUCH_VERSION_MINOR = ${libnotmuch_version_minor}
892
893 # The release version the library interface. This should be incremented at
894 # the time of release if there have been no changes to the interface, (but
895 # simply compatible changes to the implementation).
896 LIBNOTMUCH_VERSION_RELEASE = ${libnotmuch_version_release}
897
898 # These are derived from the VERSION macros in lib/notmuch.h so
899 # if you have to change them, something is wrong.
900
901 # The C compiler to use
902 CC = ${CC}
903
904 # The C++ compiler to use
905 CXX = ${CXX}
906
907 # Command to execute emacs from Makefiles
908 EMACS = emacs --quick
909
910 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
911 CFLAGS = ${CFLAGS}
912
913 # Default FLAGS for C preprocessor (can be overridden by user such as "make CPPFLAGS=-I/usr/local/include")
914 CPPFLAGS = ${CPPFLAGS}
915
916 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
917 CXXFLAGS = ${CXXFLAGS}
918
919 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
920 LDFLAGS = ${LDFLAGS}
921
922 # Flags to enable warnings when using the C++ compiler
923 WARN_CXXFLAGS=${WARN_CXXFLAGS}
924
925 # Flags to enable warnings when using the C compiler
926 WARN_CFLAGS=${WARN_CFLAGS}
927
928 # Name of python interpreter
929 PYTHON = ${python}
930
931 # The prefix to which notmuch should be installed
932 # Note: If you change this value here, be sure to ensure that the
933 # LIBDIR_IN_LDCONFIG value below is still set correctly.
934 prefix = ${PREFIX}
935
936 # The directory to which libraries should be installed
937 # Note: If you change this value here, be sure to ensure that the
938 # LIBDIR_IN_LDCONFIG value below is still set correctly.
939 libdir = ${LIBDIR:=\$(prefix)/lib}
940
941 # byte order within a 32 bit word. 1234 = little, 4321 = big, 0 = guess
942 UTIL_BYTE_ORDER = ${util_byte_order}
943
944 # Whether libdir is in a path configured into ldconfig
945 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
946
947 # The directory to which header files should be installed
948 includedir = ${INCLUDEDIR:=\$(prefix)/include}
949
950 # The directory to which man pages should be installed
951 mandir = ${MANDIR:=\$(prefix)/share/man}
952
953 # The directory to which read-only (configuration) files should be installed
954 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
955
956 # The directory to which emacs lisp files should be installed
957 emacslispdir=${EMACSLISPDIR}
958
959 # The directory to which emacs miscellaneous (machine-independent) files should
960 # be installed
961 emacsetcdir=${EMACSETCDIR}
962
963 # Whether there's an emacs binary available for byte-compiling
964 HAVE_EMACS = ${have_emacs}
965
966 # Whether there's a sphinx-build binary available for building documentation
967 HAVE_SPHINX=${have_sphinx}
968
969 # Whether there's a doxygen binary available for building api documentation
970 HAVE_DOXYGEN=${have_doxygen}
971
972 # The directory to which desktop files should be installed
973 desktop_dir = \$(prefix)/share/applications
974
975 # The directory to which bash completions files should be installed
976 bash_completion_dir = ${BASHCOMPLETIONDIR:=\$(sysconfdir)/bash_completion.d}
977
978 # The directory to which zsh completions files should be installed
979 zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completion/Unix}
980
981 # Whether the canonicalize_file_name function is available (if not, then notmuch will
982 # build its own version)
983 HAVE_CANONICALIZE_FILE_NAME = ${have_canonicalize_file_name}
984
985 # Whether the getline function is available (if not, then notmuch will
986 # build its own version)
987 HAVE_GETLINE = ${have_getline}
988
989 # Are the ruby development files (and ruby) available? If not skip
990 # building/testing ruby bindings.
991 HAVE_RUBY_DEV = ${have_ruby_dev}
992
993 # Whether the strcasestr function is available (if not, then notmuch will
994 # build its own version)
995 HAVE_STRCASESTR = ${have_strcasestr}
996
997 # Whether the strsep function is available (if not, then notmuch will
998 # build its own version)
999 HAVE_STRSEP = ${have_strsep}
1000
1001 # Whether struct dirent has d_type (if not, then notmuch will use stat)
1002 HAVE_D_TYPE = ${have_d_type}
1003
1004 # Whether the Xapian version in use supports compaction
1005 HAVE_XAPIAN_COMPACT = ${have_xapian_compact}
1006
1007 # Whether the getpwuid_r function is standards-compliant
1008 # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
1009 # to enable the standards-compliant version -- needed for Solaris)
1010 STD_GETPWUID = ${std_getpwuid}
1011
1012 # Whether the asctime_r function is standards-compliant
1013 # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
1014 # to enable the standards-compliant version -- needed for Solaris)
1015 STD_ASCTIME = ${std_asctime}
1016
1017 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS, FREEBSD, OPENBSD
1018 PLATFORM = ${platform}
1019
1020 # Whether the linker will automatically resolve the dependency of one
1021 # library on another (if not, then linking a binary requires linking
1022 # directly against both)
1023 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
1024
1025 # Flags needed to compile and link against Xapian
1026 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
1027 XAPIAN_LDFLAGS = ${xapian_ldflags}
1028
1029 # Flags needed to compile and link against GMime-2.4
1030 GMIME_CFLAGS = ${gmime_cflags}
1031 GMIME_LDFLAGS = ${gmime_ldflags}
1032
1033 # Flags needed to compile and link against zlib
1034 ZLIB_CFLAGS = ${zlib_cflags}
1035 ZLIB_LDFLAGS = ${zlib_ldflags}
1036
1037 # Flags needed to compile and link against talloc
1038 TALLOC_CFLAGS = ${talloc_cflags}
1039 TALLOC_LDFLAGS = ${talloc_ldflags}
1040
1041 # Flags needed to have linker set rpath attribute
1042 RPATH_LDFLAGS = ${rpath_ldflags}
1043
1044 # Flags needed to have linker link only to necessary libraries
1045 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
1046
1047 # Flags to have the linker flag undefined symbols in object files
1048 NO_UNDEFINED_LDFLAGS = ${no_undefined_ldflags}
1049
1050 # Whether valgrind header files are available
1051 HAVE_VALGRIND = ${have_valgrind}
1052
1053 # And if so, flags needed at compile time for valgrind macros
1054 VALGRIND_CFLAGS = ${valgrind_cflags}
1055
1056 # Support for emacs
1057 WITH_EMACS = ${WITH_EMACS}
1058
1059 # Support for bash completion
1060 WITH_BASH = ${WITH_BASH}
1061
1062 # Support for zsh completion
1063 WITH_ZSH = ${WITH_ZSH}
1064
1065 # Combined flags for compiling and linking against all of the above
1066 CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)      \\
1067                    -DHAVE_CANONICALIZE_FILE_NAME=\$(HAVE_CANONICALIZE_FILE_NAME) \\
1068                    \$(ZLIB_CFLAGS)                                       \\
1069                    \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND)   \\
1070                    \$(VALGRIND_CFLAGS)                                   \\
1071                    -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)                 \\
1072                    -DHAVE_STRSEP=\$(HAVE_STRSEP)                         \\
1073                    -DHAVE_D_TYPE=\$(HAVE_D_TYPE)                         \\
1074                    -DSTD_GETPWUID=\$(STD_GETPWUID)                       \\
1075                    -DSTD_ASCTIME=\$(STD_ASCTIME)                         \\
1076                    -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)         \\
1077                    -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)
1078
1079 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)    \\
1080                      -DHAVE_CANONICALIZE_FILE_NAME=\$(HAVE_CANONICALIZE_FILE_NAME) \\
1081                      \$(ZLIB_CFLAGS)                                     \\
1082                      \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
1083                      \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS)             \\
1084                      -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)               \\
1085                      -DHAVE_STRSEP=\$(HAVE_STRSEP)                       \\
1086                      -DHAVE_D_TYPE=\$(HAVE_D_TYPE)                       \\
1087                      -DSTD_GETPWUID=\$(STD_GETPWUID)                     \\
1088                      -DSTD_ASCTIME=\$(STD_ASCTIME)                       \\
1089                      -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)       \\
1090                      -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)
1091
1092 CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(ZLIB_LDFLAGS) \$(XAPIAN_LDFLAGS)
1093 EOF
1094
1095 # construct the sh.config
1096 cat > sh.config <<EOF
1097 # This sh.config was automatically generated by the ./configure
1098 # script of notmuch.
1099
1100 # Whether the Xapian version in use supports compaction
1101 NOTMUCH_HAVE_XAPIAN_COMPACT=${have_xapian_compact}
1102
1103 # do we have man pages?
1104 NOTMUCH_HAVE_MAN=$((have_sphinx))
1105
1106 # Name of python interpreter
1107 NOTMUCH_PYTHON=${python}
1108
1109 # Are the ruby development files (and ruby) available? If not skip
1110 # building/testing ruby bindings.
1111 NOTMUCH_HAVE_RUBY_DEV=${have_ruby_dev}
1112 EOF
1113
1114 # Finally, after everything configured, inform the user how to continue.
1115 cat <<EOF
1116
1117 All required packages were found. You may now run the following
1118 commands to compile and install notmuch:
1119
1120         make
1121         sudo make install
1122
1123 EOF