]> git.notmuchmail.org Git - notmuch/blob - configure
emacs: mv notmuch-{show,common}-do-stash
[notmuch] / configure
1 #! /bin/sh
2
3 # Removing space from IFS makes it much easier to support filenames
4 # with spaces. See http://www.dwheeler.com/essays/filenames-in-shell.html
5 # for gory details.
6 IFS="$(printf '\n\t')"
7
8 # Since we don't have space in IFS we use tab to separate things in lists
9 tab="$(printf '\t')"
10
11 # Set several defaults (optionally specified by the user in
12 # environemnt variables)
13 CC=${CC:-gcc}
14 CXX=${CXX:-g++}
15 CFLAGS=${CFLAGS:--O2}
16 CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)}
17 LDFLAGS=${LDFLAGS:-}
18 XAPIAN_CONFIG=${XAPIAN_CONFIG:-xapian-config}
19
20 # We don't allow the EMACS or GZIP Makefile variables inherit values
21 # from the environment as we do with CC and CXX above. The reason is
22 # that these names as environment variables have existing uses other
23 # than the program name that we want. (EMACS is set to 't' when a
24 # shell is running within emacs and GZIP specifies arguments to pass
25 # on the gzip command line).
26
27 # Set the defaults for values the user can specify with command-line
28 # options.
29 PREFIX=/usr/local
30 LIBDIR=
31
32 usage ()
33 {
34     cat <<EOF
35 Usage: ./configure [options]...
36
37 This script configures notmuch to build on your system.
38
39 It verifies that dependencies are available, determines flags needed
40 to compile and link against various required libraries, and identifies
41 whether various system functions can be used or if locally-provided
42 replacements will be built instead.
43
44 Finally, it allows you to control various aspects of the build and
45 installation process.
46
47 First, some common variables can specified via environment variables:
48
49         CC              The C compiler to use
50         CFLAGS          Flags to pass to the C compiler
51         CXX             The C++ compiler to use
52         CXXFLAGS        Flags to pass to the C compiler
53         LDFLAGS         Flags to pass when linking
54
55 Each of these values can further be controlled by specifying them
56 later on the "make" command line.
57
58 Other environment variables can be used to control configure itself,
59 (and for which there is no equivalent build-time control):
60
61         XAPIAN_CONFIG   The program to use to determine flags for
62                         compiling and linking against the Xapian
63                         library. [$XAPIAN_CONFIG]
64
65 Additionally, various options can be specified on the configure
66 command line.
67
68         --prefix=PREFIX Install files in PREFIX [$PREFIX]
69
70 By default, "make install" will install the resulting program to
71 $PREFIX/bin, documentation to $PREFIX/man, etc. You can
72 specify an installation prefix other than $PREFIX using
73 --prefix, for instance:
74
75         ./configure --prefix=\$HOME
76
77 Fine tuning of some installation directories is available:
78
79         --libdir=DIR            Install libraries to DIR [PREFIX/lib]
80         --includedir=DIR        Install header files to DIR [PREFIX/include]
81         --mandir=DIR            Install man pages to DIR [PREFIX/share/man]
82         --sysconfdir=DIR        Read-only single-machine data [PREFIX/etc]
83         --emacslispdir=DIR      Emacs code [PREFIX/share/emacs/site-lisp]
84
85 Additional options are accepted for compatibility with other
86 configure-script calling conventions, but don't do anything yet:
87
88         --build=<cpu>-<vendor>-<os>     Currently ignored
89         --host=<cpu>-<vendor>-<os>      Currently ignored
90         --infodir=DIR                   Currently ignored
91         --datadir=DIR                   Currently ignored
92         --localstatedir=DIR             Currently ignored
93         --libexecdir=DIR                Currently ignored
94         --disable-maintainer-mode       Currently ignored
95         --disable-dependency-tracking   Currently ignored
96
97 EOF
98 }
99
100 # Parse command-line options
101 for option; do
102     if [ "${option}" = '--help' ] ; then
103         usage
104         exit 0
105     elif [ "${option%%=*}" = '--prefix' ] ; then
106         PREFIX="${option#*=}"
107     elif [ "${option%%=*}" = '--libdir' ] ; then
108         LIBDIR="${option#*=}"
109     elif [ "${option%%=*}" = '--includedir' ] ; then
110         INCLUDEDIR="${option#*=}"
111     elif [ "${option%%=*}" = '--mandir' ] ; then
112         MANDIR="${option#*=}"
113     elif [ "${option%%=*}" = '--sysconfdir' ] ; then
114         SYSCONFDIR="${option#*=}"
115     elif [ "${option%%=*}" = '--emacslispdir' ] ; then
116         EMACSLISPDIR="${option#*=}"
117     elif [ "${option%%=*}" = '--build' ] ; then
118         build_option="${option#*=}"
119         case ${build_option} in
120             *-*-*) ;;
121             *)
122                 echo "Unrecognized value for --build option: ${build_option}"
123                 echo "Should be: <cpu>-<vendor>-<os>"
124                 echo "See:"
125                 echo "  $0 --help"
126                 echo ""
127                 exit 1
128         esac
129         build_cpu=${build_option%%-*}
130         build_option=${build_option#*-}
131         build_vendor=${build_option%%-*}
132         build_os=${build_option#*-}
133     elif [ "${option%%=*}" = '--host' ] ; then
134         host_option="${option#*=}"
135         case ${host_option} in
136             *-*-*) ;;
137             *)
138                 echo "Unrecognized value for --host option: ${host_option}"
139                 echo "Should be: <cpu>-<vendor>-<os>"
140                 echo "See:"
141                 echo "  $0 --help"
142                 echo ""
143                 exit 1
144         esac
145         host_cpu=${host_option%%-*}
146         host_option=${host_option#*-}
147         host_vendor=${host_option%%-*}
148         host_os=${host_option#*-}
149     elif [ "${option%%=*}" = '--infodir' ] ; then
150         true
151     elif [ "${option%%=*}" = '--datadir' ] ; then
152         true
153     elif [ "${option%%=*}" = '--localstatedir' ] ; then
154         true
155     elif [ "${option%%=*}" = '--libexecdir' ] ; then
156         true
157     elif [ "${option}" = '--disable-maintainer-mode' ] ; then
158         true
159     elif [ "${option}" = '--disable-dependency-tracking' ] ; then
160         true
161     else
162         echo "Unrecognized option: ${option}"
163         echo "See:"
164         echo "  $0 --help"
165         echo ""
166         exit 1
167     fi
168 done
169
170 # We set this value early, (rather than just while printing the
171 # Makefile.config file later like most values), because we need to
172 # actually investigate this value compared to the ldconfig_paths value
173 # below.
174 libdir_expanded=${LIBDIR:-${PREFIX}/lib}
175
176 cat <<EOF
177 Welcome to Notmuch, a system for indexing, searching and tagging your email.
178
179 We hope that the process of building and installing notmuch is quick
180 and smooth so that you can soon be reading and processing your email
181 more efficiently than ever.
182
183 If anything goes wrong in the configure process, you can override any
184 decisions it makes by manually editing the Makefile.config file that
185 it creates. Also please do as much as you can to figure out what could
186 be different on your machine compared to those of the notmuch
187 developers. Then, please email those details to the Notmuch list
188 (notmuch@notmuchmail.org) so that we can hopefully make future
189 versions of notmuch easier for you to use.
190
191 We'll now investigate your system to verify that all required
192 dependencies are available:
193
194 EOF
195
196 errors=0
197
198 if pkg-config --version > /dev/null 2>&1; then
199     have_pkg_config=1
200 else
201     have_pkg_config=0
202 fi
203
204 printf "Checking for Xapian development files... "
205 have_xapian=0
206 for xapian_config in ${XAPIAN_CONFIG}; do
207     if ${xapian_config} --version > /dev/null 2>&1; then
208         printf "Yes (%s).\n" $(${xapian_config} --version | sed -e 's/.* //')
209         have_xapian=1
210         xapian_cxxflags=$(${xapian_config} --cxxflags)
211         xapian_ldflags=$(${xapian_config} --libs)
212         break
213     fi
214 done
215 if [ ${have_xapian} = "0" ]; then
216     printf "No.\n"
217     errors=$((errors + 1))
218 fi
219
220 printf "Checking for GMime development files... "
221 have_gmime=0
222 for gmimepc in gmime-2.6 gmime-2.4; do
223     if pkg-config --modversion $gmimepc > /dev/null 2>&1; then
224         printf "Yes ($gmimepc).\n"
225         have_gmime=1
226         gmime_cflags=$(pkg-config --cflags $gmimepc)
227         gmime_ldflags=$(pkg-config --libs $gmimepc)
228     fi
229 done
230 if [ "$have_gmime" = "0" ]; then
231     printf "No.\n"
232     errors=$((errors + 1))
233 fi
234
235 printf "Checking for talloc development files... "
236 if pkg-config --modversion talloc > /dev/null 2>&1; then
237     printf "Yes.\n"
238     have_talloc=1
239     talloc_cflags=$(pkg-config --cflags talloc)
240     talloc_ldflags=$(pkg-config --libs talloc)
241 else
242     printf "No.\n"
243     have_talloc=0
244     talloc_cflags=
245     errors=$((errors + 1))
246 fi
247
248 printf "Checking for valgrind development files... "
249 if pkg-config --modversion valgrind > /dev/null 2>&1; then
250     printf "Yes.\n"
251     have_valgrind=1
252     valgrind_cflags=$(pkg-config --cflags valgrind)
253 else
254     printf "No (but that's fine).\n"
255     have_valgrind=0
256 fi
257
258 if [ -z "${EMACSLISPDIR}" ]; then
259     if pkg-config --modversion emacs > /dev/null 2>&1; then
260         EMACSLISPDIR=$(pkg-config emacs --variable sitepkglispdir)
261     else
262         EMACSLISPDIR='$(prefix)/share/emacs/site-lisp'
263     fi
264 fi
265
266 printf "Checking if emacs is available... "
267 if emacs --quick --batch > /dev/null 2>&1; then
268     printf "Yes.\n"
269     have_emacs=1
270 else
271     printf "No (so will not byte-compile emacs code)\n"
272     have_emacs=0
273 fi
274
275 libdir_in_ldconfig=0
276
277 printf "Checking which platform we are on... "
278 uname=`uname`
279 if [ $uname = "Darwin" ] ; then
280     printf "Mac OS X.\n"
281     platform=MACOSX
282     linker_resolves_library_dependencies=0
283 elif [ $uname = "SunOS" ] ; then
284     printf "Solaris.\n"
285     platform=SOLARIS
286     linker_resolves_library_dependencies=0
287 elif [ $uname = "Linux" ] ; then
288     printf "Linux\n"
289     platform=LINUX
290     linker_resolves_library_dependencies=1
291     ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p')
292     for path in $ldconfig_paths; do
293         if [ "$path" = "$libdir_expanded" ]; then
294             libdir_in_ldconfig=1
295         fi
296     done
297 else
298     printf "Unknown.\n"
299     cat <<EOF
300
301 *** Warning: Unknown platform. Notmuch might or might not build correctly.
302
303 EOF
304 fi
305
306 if [ $errors -gt 0 ]; then
307     cat <<EOF
308
309 *** Error: The dependencies of notmuch could not be satisfied. You will
310 need to install the following packages before being able to compile
311 notmuch:
312
313 EOF
314     if [ $have_xapian -eq 0 ]; then
315         echo "  Xapian library (including development files such as headers)"
316         echo "  http://xapian.org/"
317     fi
318     if [ $have_gmime -eq 0 ]; then
319         echo "  GMime 2.4 library (including development files such as headers)"
320         echo "  http://spruce.sourceforge.net/gmime/"
321     fi
322     if [ $have_talloc -eq 0 ]; then
323         echo "  The talloc library (including development files such as headers)"
324         echo "  http://talloc.samba.org/"
325     fi
326     cat <<EOF
327
328 With any luck, you're using a modern, package-based operating system
329 that has all of these packages available in the distribution. In that
330 case a simple command will install everything you need. For example:
331
332 On Debian and similar systems:
333
334         sudo apt-get install libxapian-dev libgmime-2.4-dev libtalloc-dev
335
336 Or on Fedora and similar systems:
337
338         sudo yum install xapian-core-devel gmime-devel libtalloc-devel
339
340 On other systems, similar commands can be used, but the details of the
341 package names may be different.
342
343 EOF
344     if [ $have_pkg_config -eq 0 ]; then
345 cat <<EOF
346 Note: the pkg-config program is not available. This configure script
347 uses pkg-config to find the compilation flags required to link against
348 the various libraries needed by notmuch. It's possible you simply need
349 to install pkg-config with a command such as:
350
351         sudo apt-get install pkg-config
352 Or:
353         sudo yum install pkgconfig
354
355 But if pkg-config is not available for your system, then you will need
356 to modify the configure script to manually set the cflags and ldflags
357 variables to the correct values to link against each library in each
358 case that pkg-config could not be used to determine those values.
359
360 EOF
361     fi
362 cat <<EOF
363 When you have installed the necessary dependencies, you can run
364 configure again to ensure the packages can be found, or simply run
365 "make" to compile notmuch.
366
367 EOF
368     exit 1
369 fi
370
371 printf "Checking for getline... "
372 if ${CC} -o compat/have_getline compat/have_getline.c > /dev/null 2>&1
373 then
374     printf "Yes.\n"
375     have_getline=1
376 else
377     printf "No (will use our own instead).\n"
378     have_getline=0
379 fi
380 rm -f compat/have_getline
381
382 printf "Checking for strcasestr... "
383 if ${CC} -o compat/have_strcasestr compat/have_strcasestr.c > /dev/null 2>&1
384 then
385     printf "Yes.\n"
386     have_strcasestr=1
387 else
388     printf "No (will use our own instead).\n"
389     have_strcasestr=0
390 fi
391 rm -f compat/have_strcasestr
392
393 printf "int main(void){return 0;}\n" > minimal.c
394
395 printf "Checking for rpath support... "
396 if ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1
397 then
398     printf "Yes.\n"
399     rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)"
400 else
401     printf "No (nothing to worry about).\n"
402     rpath_ldflags=""
403 fi
404
405 printf "Checking for -Wl,--as-needed... "
406 if ${CC} -Wl,--as-needed -o minimal minimal.c >/dev/null 2>&1
407 then
408     printf "Yes.\n"
409     as_needed_ldflags="-Wl,--as-needed"
410 else
411     printf "No (nothing to worry about).\n"
412     as_needed_ldflags=""
413 fi
414
415 WARN_CXXFLAGS=""
416 printf "Checking for available C++ compiler warning flags... "
417 for flag in -Wall -Wextra -Wwrite-strings -Wswitch-enum; do
418     if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
419     then
420         WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}"
421     fi
422 done
423 printf "\n\t${WARN_CXXFLAGS}\n"
424
425 WARN_CFLAGS="${WARN_CXXFLAGS}"
426 printf "Checking for available C compiler warning flags... "
427 for flag in -Wmissing-declarations; do
428     if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1
429     then
430         WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}"
431     fi
432 done
433 printf "\n\t${WARN_CFLAGS}\n"
434
435 rm -f minimal minimal.c
436         
437 cat <<EOF
438
439 All required packages were found. You may now run the following
440 commands to compile and install notmuch:
441
442         make
443         sudo make install
444
445 EOF
446
447 # construct the Makefile.config
448 cat > Makefile.config <<EOF
449 # This Makefile.config was automatically generated by the ./configure
450 # script of notmuch. If the configure script identified anything
451 # incorrectly, then you can edit this file to try to correct things,
452 # but be warned that if configure is run again it will destroy your
453 # changes, (and this could happen by simply calling "make" if the
454 # configure script is updated).
455
456 # The C compiler to use
457 CC = ${CC}
458
459 # The C++ compiler to use
460 CXX = ${CXX}
461
462 # Command to execute emacs from Makefiles
463 EMACS = emacs --quick
464
465 # Default FLAGS for C compiler (can be overridden by user such as "make CFLAGS=-g")
466 CFLAGS = ${CFLAGS}
467
468 # Default FLAGS for C++ compiler (can be overridden by user such as "make CXXFLAGS=-g")
469 CXXFLAGS = ${CXXFLAGS}
470
471 # Default FLAGS for the linker (can be overridden by user such as "make LDFLAGS=-znow")
472 LDFLAGS = ${LDFLAGS}
473
474 # Flags to enable warnings when using the C++ compiler
475 WARN_CXXFLAGS=${WARN_CXXFLAGS}
476
477 # Flags to enable warnings when using the C compiler
478 WARN_CFLAGS=${WARN_CFLAGS}
479
480 # The prefix to which notmuch should be installed
481 # Note: If you change this value here, be sure to ensure that the
482 # LIBDIR_IN_LDCONFIG value below is still set correctly.
483 prefix = ${PREFIX}
484
485 # The directory to which libraries should be installed
486 # Note: If you change this value here, be sure to ensure that the
487 # LIBDIR_IN_LDCONFIG value below is still set correctly.
488 libdir = ${LIBDIR:=\$(prefix)/lib}
489
490 # Whether libdir is in a path configured into ldconfig
491 LIBDIR_IN_LDCONFIG = ${libdir_in_ldconfig}
492
493 # The directory to which header files should be installed
494 includedir = ${INCLUDEDIR:=\$(prefix)/include}
495
496 # The directory to which man pages should be installed
497 mandir = ${MANDIR:=\$(prefix)/share/man}
498
499 # The directory to which read-only (configuration) filesshould be installed
500 sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
501
502 # The directory to which emacs lisp files should be installed
503 emacslispdir=${EMACSLISPDIR}
504
505 # Whether there's an emacs binary available for byte-compiling
506 HAVE_EMACS = ${have_emacs}
507
508 # The directory to which desktop files should be installed
509 desktop_dir = \$(prefix)/share/applications
510
511 # The directory to which bash completions files should be installed
512 bash_completion_dir = \$(sysconfdir)/bash_completion.d
513
514 # The directory to which zsh completions files should be installed
515 zsh_completion_dir = \$(prefix)/share/zsh/functions/Completion/Unix
516
517 # Whether the getline function is available (if not, then notmuch will
518 # build its own version)
519 HAVE_GETLINE = ${have_getline}
520
521 # Whether the strcasestr function is available (if not, then notmuch will
522 # build its own version)
523 HAVE_STRCASESTR = ${have_strcasestr}
524
525 # Supported platforms (so far) are: LINUX, MACOSX, SOLARIS
526 PLATFORM = ${platform}
527
528 # Whether the linker will automatically resolve the dependency of one
529 # library on another (if not, then linking a binary requires linking
530 # directly against both)
531 LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies}
532
533 # Flags needed to compile and link against Xapian
534 XAPIAN_CXXFLAGS = ${xapian_cxxflags}
535 XAPIAN_LDFLAGS = ${xapian_ldflags}
536
537 # Flags needed to compile and link against GMime-2.4
538 GMIME_CFLAGS = ${gmime_cflags}
539 GMIME_LDFLAGS = ${gmime_ldflags}
540
541 # Flags needed to compile and link against talloc
542 TALLOC_CFLAGS = ${talloc_cflags}
543 TALLOC_LDFLAGS = ${talloc_ldflags}
544
545 # Flags needed to have linker set rpath attribute
546 RPATH_LDFLAGS = ${rpath_ldflags}
547
548 # Flags needed to have linker link only to necessary libraries
549 AS_NEEDED_LDFLAGS = ${as_needed_ldflags}
550
551 # Whether valgrind header files are available
552 HAVE_VALGRIND = ${have_valgrind}
553
554 # And if so, flags needed at compile time for valgrind macros
555 VALGRIND_CFLAGS = ${valgrind_cflags}
556
557 # Combined flags for compiling and linking against all of the above
558 CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)      \\
559                    \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND)   \\
560                    \$(VALGRIND_CFLAGS) -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
561 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)    \\
562                      \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
563                      \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS)             \\
564                      -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
565 CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS)
566 EOF