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