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