]> git.notmuchmail.org Git - notmuch/blob - configure
lib, ruby: make use of -Wl,--no-undefined configurable
[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 printf "Checking for -Wl,--no-undefined... "
755 if ${CC} -Wl,--no-undefined -o minimal minimal.c >/dev/null 2>&1
756 then
757     printf "Yes.\n"
758     no_undefined_ldflags="-Wl,--no-undefined"
759 else
760     printf "No (nothing to worry about).\n"
761     no_undefined_ldflags=""
762 fi
763
764 WARN_CXXFLAGS=""
765 printf "Checking for available C++ compiler warning flags... "
766 for flag in -Wall -Wextra -Wwrite-strings; do
767     if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
768     then
769         WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
770     fi
771 done
772 printf "\n\t${WARN_CXXFLAGS}\n"
773
774 WARN_CFLAGS="${WARN_CXXFLAGS}"
775 printf "Checking for available C compiler warning flags... "
776 for flag in -Wmissing-declarations; do
777     if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
778     then
779         WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
780     fi
781 done
782 printf "\n\t${WARN_CFLAGS}\n"
783
784 rm -f minimal minimal.c
785
786 # construct the Makefile.config
787 cat > Makefile.config <<EOF
788 # This Makefile.config was automatically generated by the ./configure
789 # script of notmuch. If the configure script identified anything
790 # incorrectly, then you can edit this file to try to correct things,
791 # but be warned that if configure is run again it will destroy your
792 # changes, (and this could happen by simply calling "make" if the
793 # configure script is updated).
794
795 # The top-level directory for the source, (the directory containing
796 # the configure script). This may be different than the build
797 # directory (the current directory at the time configure was run).
798 srcdir = ${srcdir}
799
800 # subdirectories to build
801 subdirs = ${subdirs}
802
803 configure_options = $@
804
805 # We use vpath directives (rather than the VPATH variable) since the
806 # VPATH variable matches targets as well as prerequisites, (which is
807 # not useful since then a target left-over from a srcdir build would
808 # cause a target to not be built in the non-srcdir build).
809 #
810 # Also, we don't use a single "vpath % \$(srcdir)" here because we
811 # don't want the vpath to trigger for our emacs lisp compilation,
812 # (unless we first find a way to convince emacs to build the .elc
813 # target in a directory other than the directory of the .el
814 # prerequisite). In the meantime, we're actually copying in the .el
815 # files, (which is quite ugly).
816 vpath %.c \$(srcdir)
817 vpath %.cc \$(srcdir)
818 vpath Makefile.% \$(srcdir)
819 vpath %.py \$(srcdir)
820 vpath %.rst \$(srcdir)
821
822 # The C compiler to use
823 CC = ${CC}
824
825 # The C++ compiler to use
826 CXX = ${CXX}
827
828 # Command to execute emacs from Makefiles
829 EMACS = emacs --quick
830
831 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
832 CFLAGS = ${CFLAGS}
833
834 # Default FLAGS for C preprocessor (can be overridden by user such as "make CPPFLAGS=-I/usr/local/include")
835 CPPFLAGS = ${CPPFLAGS}
836
837 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
838 CXXFLAGS = ${CXXFLAGS}
839
840 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
841 LDFLAGS = ${LDFLAGS}
842
843 # Flags to enable warnings when using the C++ compiler
844 WARN_CXXFLAGS=${WARN_CXXFLAGS}
845
846 # Flags to enable warnings when using the C compiler
847 WARN_CFLAGS=${WARN_CFLAGS}
848
849 # Name of python interpreter
850 PYTHON = ${python}
851
852 # The prefix to which notmuch should be installed
853 # Note: If you change this value here, be sure to ensure that the
854 # LIBDIR_IN_LDCONFIG value below is still set correctly.
855 prefix = ${PREFIX}
856
857 # The directory to which libraries should be installed
858 # Note: If you change this value here, be sure to ensure that the
859 # LIBDIR_IN_LDCONFIG value below is still set correctly.
860 libdir = ${LIBDIR:=\$(prefix)/lib}
861
862 # byte order within a 32 bit word. 1234 = little, 4321 = big, 0 = guess
863 UTIL_BYTE_ORDER = ${util_byte_order}
864
865 # Whether libdir is in a path configured into ldconfig
866 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
867
868 # The directory to which header files should be installed
869 includedir = ${INCLUDEDIR:=\$(prefix)/include}
870
871 # The directory to which man pages should be installed
872 mandir = ${MANDIR:=\$(prefix)/share/man}
873
874 # The directory to which read-only (configuration) files should be installed
875 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
876
877 # The directory to which emacs lisp files should be installed
878 emacslispdir=${EMACSLISPDIR}
879
880 # The directory to which emacs miscellaneous (machine-independent) files should
881 # be installed
882 emacsetcdir=${EMACSETCDIR}
883
884 # Whether there's an emacs binary available for byte-compiling
885 HAVE_EMACS = ${have_emacs}
886
887 # Whether there's a sphinx-build binary available for building documentation
888 HAVE_SPHINX=${have_sphinx}
889
890 # Whether there's a doxygen binary available for building api documentation
891 HAVE_DOXYGEN=${have_doxygen}
892
893 # The directory to which desktop files should be installed
894 desktop_dir = \$(prefix)/share/applications
895
896 # The directory to which bash completions files should be installed
897 bash_completion_dir = ${BASHCOMPLETIONDIR:=\$(sysconfdir)/bash_completion.d}
898
899 # The directory to which zsh completions files should be installed
900 zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completion/Unix}
901
902 # Whether the canonicalize_file_name function is available (if not, then notmuch will
903 # build its own version)
904 HAVE_CANONICALIZE_FILE_NAME = ${have_canonicalize_file_name}
905
906 # Whether the getline function is available (if not, then notmuch will
907 # build its own version)
908 HAVE_GETLINE = ${have_getline}
909
910 # Are the ruby development files (and ruby) available? If not skip
911 # building/testing ruby bindings.
912 HAVE_RUBY_DEV = ${have_ruby_dev}
913
914 # Whether the strcasestr function is available (if not, then notmuch will
915 # build its own version)
916 HAVE_STRCASESTR = ${have_strcasestr}
917
918 # Whether the strsep function is available (if not, then notmuch will
919 # build its own version)
920 HAVE_STRSEP = ${have_strsep}
921
922 # Whether struct dirent has d_type (if not, then notmuch will use stat)
923 HAVE_D_TYPE = ${have_d_type}
924
925 # Whether the Xapian version in use supports compaction
926 HAVE_XAPIAN_COMPACT = ${have_xapian_compact}
927
928 # Whether the getpwuid_r function is standards-compliant
929 # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
930 # to enable the standards-compliant version -- needed for Solaris)
931 STD_GETPWUID = ${std_getpwuid}
932
933 # Whether the asctime_r function is standards-compliant
934 # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS
935 # to enable the standards-compliant version -- needed for Solaris)
936 STD_ASCTIME = ${std_asctime}
937
938 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS, FREEBSD, OPENBSD
939 PLATFORM = ${platform}
940
941 # Whether the linker will automatically resolve the dependency of one
942 # library on another (if not, then linking a binary requires linking
943 # directly against both)
944 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
945
946 # Flags needed to compile and link against Xapian
947 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
948 XAPIAN_LDFLAGS = ${xapian_ldflags}
949
950 # Flags needed to compile and link against GMime-2.4
951 GMIME_CFLAGS = ${gmime_cflags}
952 GMIME_LDFLAGS = ${gmime_ldflags}
953
954 # Flags needed to compile and link against zlib
955 ZLIB_CFLAGS = ${zlib_cflags}
956 ZLIB_LDFLAGS = ${zlib_ldflags}
957
958 # Flags needed to compile and link against talloc
959 TALLOC_CFLAGS = ${talloc_cflags}
960 TALLOC_LDFLAGS = ${talloc_ldflags}
961
962 # Flags needed to have linker set rpath attribute
963 RPATH_LDFLAGS = ${rpath_ldflags}
964
965 # Flags needed to have linker link only to necessary libraries
966 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
967
968 # Flags to have the linker flag undefined symbols in object files
969 NO_UNDEFINED_LDFLAGS = ${no_undefined_ldflags}
970
971 # Whether valgrind header files are available
972 HAVE_VALGRIND = ${have_valgrind}
973
974 # And if so, flags needed at compile time for valgrind macros
975 VALGRIND_CFLAGS = ${valgrind_cflags}
976
977 # Support for emacs
978 WITH_EMACS = ${WITH_EMACS}
979
980 # Support for bash completion
981 WITH_BASH = ${WITH_BASH}
982
983 # Support for zsh completion
984 WITH_ZSH = ${WITH_ZSH}
985
986 # Combined flags for compiling and linking against all of the above
987 CONFIGURE_CFLAGS = -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)                                   \\
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_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)    \\
1001                      -DHAVE_CANONICALIZE_FILE_NAME=\$(HAVE_CANONICALIZE_FILE_NAME) \\
1002                      \$(ZLIB_CFLAGS)                                     \\
1003                      \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
1004                      \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS)             \\
1005                      -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)               \\
1006                      -DHAVE_STRSEP=\$(HAVE_STRSEP)                       \\
1007                      -DHAVE_D_TYPE=\$(HAVE_D_TYPE)                       \\
1008                      -DSTD_GETPWUID=\$(STD_GETPWUID)                     \\
1009                      -DSTD_ASCTIME=\$(STD_ASCTIME)                       \\
1010                      -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)       \\
1011                      -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)
1012
1013 CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(ZLIB_LDFLAGS) \$(XAPIAN_LDFLAGS)
1014 EOF
1015
1016 # construct the sh.config
1017 cat > sh.config <<EOF
1018 # This sh.config was automatically generated by the ./configure
1019 # script of notmuch.
1020
1021 # Whether the Xapian version in use supports compaction
1022 NOTMUCH_HAVE_XAPIAN_COMPACT=${have_xapian_compact}
1023
1024 # do we have man pages?
1025 NOTMUCH_HAVE_MAN=$((have_sphinx))
1026
1027 # Name of python interpreter
1028 NOTMUCH_PYTHON=${python}
1029
1030 # Are the ruby development files (and ruby) available? If not skip
1031 # building/testing ruby bindings.
1032 NOTMUCH_HAVE_RUBY_DEV=${have_ruby_dev}
1033 EOF
1034
1035 # Finally, after everything configured, inform the user how to continue.
1036 cat <<EOF
1037
1038 All required packages were found. You may now run the following
1039 commands to compile and install notmuch:
1040
1041         make
1042         sudo make install
1043
1044 EOF