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