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