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