#! /bin/sh set -u # Test whether this shell is capable of parameter substring processing. ( option='a/b'; : ${option#*/} ) 2>/dev/null || { echo " The shell interpreting '$0' is lacking some required features. To work around this problem you may try to execute: ksh $0 $* or bash $0 $* " exit 1 } # Store original IFS value so it can be changed (and restored) in many places. readonly DEFAULT_IFS="$IFS" # The top-level directory for the source. This ./configure and all Makefiles # are good with ${srcdir} usually being relative. Some components (e.g. tests) # are executed in subdirectories and for those it is simpler to use # ${NOTMUCH_SRCDIR} which holds absolute path to the source. srcdir=$(dirname "$0") NOTMUCH_SRCDIR=$(cd "$srcdir" && pwd) case $NOTMUCH_SRCDIR in ( *\'* | *['\"`$']* ) echo "Definitely unsafe characters in source path '$NOTMUCH_SRCDIR'". exit 1 esac case $PWD in ( *\'* | *['\"`$']* ) echo "Definitely unsafe characters in current directory '$PWD'". exit 1 esac # In case of whitespace, builds may work, tests definitely will not. case $NOTMUCH_SRCDIR in ( *["$IFS"]* ) echo "Whitespace in source path '$NOTMUCH_SRCDIR' not supported". exit 1 esac case $PWD in ( *["$IFS"]* ) echo "Whitespace in current directory '$PWD' not supported". exit 1 esac subdirs="util compat lib parse-time-string completion doc emacs" subdirs="${subdirs} performance-test test" subdirs="${subdirs} bindings" # For a non-srcdir configure invocation (such as ../configure), create # the directory structure and copy Makefiles. if [ "$srcdir" != "." ]; then NOTMUCH_BUILDDIR=$PWD for dir in . ${subdirs}; do mkdir -p "$dir" cp "$srcdir"/"$dir"/Makefile.local "$dir" cp "$srcdir"/"$dir"/Makefile "$dir" done # Emacs only likes to generate compiled files next to the .el files # by default so copy these as well (which is not ideal). cp -a "$srcdir"/emacs/*.el emacs # We were not able to create fully working Makefile using ruby mkmf.rb # so ruby bindings source files are copied as well (ditto -- not ideal). mkdir bindings/ruby cp -a "$srcdir"/bindings/ruby/*.[ch] bindings/ruby cp -a "$srcdir"/bindings/ruby/extconf.rb bindings/ruby # Use the same hack to replicate python-cffi source for # out-of-tree builds (again, not ideal). mkdir bindings/python-cffi cp -a "$srcdir"/bindings/python-cffi/tests \ "$srcdir"/bindings/python-cffi/notmuch2 \ "$srcdir"/bindings/python-cffi/setup.py \ bindings/python-cffi/ else NOTMUCH_BUILDDIR=$NOTMUCH_SRCDIR fi # Set several defaults (optionally specified by the user in # environment variables) BASHCMD=${BASHCMD:-bash} PERL=${PERL:-perl} CC=${CC:-cc} CXX=${CXX:-c++} CFLAGS=${CFLAGS:--g -O2} CPPFLAGS=${CPPFLAGS:-} CXXFLAGS_for_sh=${CXXFLAGS:-${CFLAGS}} CXXFLAGS=${CXXFLAGS:-\$(CFLAGS)} LDFLAGS=${LDFLAGS:-} XAPIAN_CONFIG=${XAPIAN_CONFIG:-} PYTHON=${PYTHON:-} RUBY=${RUBY:-ruby} # We don't allow the EMACS or GZIP Makefile variables inherit values # from the environment as we do with CC and CXX above. The reason is # that these names as environment variables have existing uses other # than the program name that we want. (EMACS is set to 't' when a # shell is running within emacs and GZIP specifies arguments to pass # on the gzip command line). # Set the defaults for values the user can specify with command-line # options. PREFIX=/usr/local LIBDIR= WITH_DOCS=1 WITH_API_DOCS=1 WITH_PYTHON_DOCS=1 WITH_EMACS=1 WITH_DESKTOP=1 WITH_BASH=1 WITH_RPATH=1 WITH_RUBY=1 WITH_ZSH=1 WITH_RETRY_LOCK=1 usage () { cat <-- Currently ignored --host=-- Currently ignored --datadir=DIR Currently ignored --localstatedir=DIR Currently ignored --libexecdir=DIR Currently ignored --disable-maintainer-mode Currently ignored --disable-dependency-tracking Currently ignored EOF } # Parse command-line options for option; do if [ "${option}" = '--help' ] ; then usage exit 0 elif [ "${option%%=*}" = '--prefix' ] ; then PREFIX="${option#*=}" elif [ "${option%%=*}" = '--libdir' ] ; then LIBDIR="${option#*=}" elif [ "${option%%=*}" = '--includedir' ] ; then INCLUDEDIR="${option#*=}" elif [ "${option%%=*}" = '--mandir' ] ; then MANDIR="${option#*=}" elif [ "${option%%=*}" = '--infodir' ] ; then INFODIR="${option#*=}" elif [ "${option%%=*}" = '--sysconfdir' ] ; then SYSCONFDIR="${option#*=}" elif [ "${option%%=*}" = '--emacslispdir' ] ; then EMACSLISPDIR="${option#*=}" elif [ "${option%%=*}" = '--emacsetcdir' ] ; then EMACSETCDIR="${option#*=}" elif [ "${option%%=*}" = '--bashcompletiondir' ] ; then BASHCOMPLETIONDIR="${option#*=}" elif [ "${option%%=*}" = '--zshcompletiondir' ] ; then ZSHCOMLETIONDIR="${option#*=}" elif [ "${option%%=*}" = '--with-docs' ]; then if [ "${option#*=}" = 'no' ]; then WITH_DOCS=0 WITH_API_DOCS=0 else WITH_DOCS=1 fi elif [ "${option}" = '--without-docs' ] ; then WITH_DOCS=0 WITH_API_DOCS=0 elif [ "${option%%=*}" = '--with-api-docs' ]; then if [ "${option#*=}" = 'no' ]; then WITH_API_DOCS=0 else WITH_API_DOCS=1 fi elif [ "${option}" = '--without-api-docs' ] ; then WITH_API_DOCS=0 elif [ "${option%%=*}" = '--with-emacs' ]; then if [ "${option#*=}" = 'no' ]; then WITH_EMACS=0 else WITH_EMACS=1 fi elif [ "${option}" = '--without-emacs' ] ; then WITH_EMACS=0 elif [ "${option%%=*}" = '--with-desktop' ]; then if [ "${option#*=}" = 'no' ]; then WITH_DESKTOP=0 else WITH_DESKTOP=1 fi elif [ "${option}" = '--without-desktop' ] ; then WITH_DESKTOP=0 elif [ "${option%%=*}" = '--with-bash-completion' ]; then if [ "${option#*=}" = 'no' ]; then WITH_BASH=0 else WITH_BASH=1 fi elif [ "${option}" = '--without-bash-completion' ] ; then WITH_BASH=0 elif [ "${option%%=*}" = '--with-rpath' ]; then if [ "${option#*=}" = 'no' ]; then WITH_RPATH=0 else WITH_RPATH=1 fi elif [ "${option}" = '--without-rpath' ] ; then WITH_RPATH=0 elif [ "${option%%=*}" = '--with-ruby' ]; then if [ "${option#*=}" = 'no' ]; then WITH_RUBY=0 else WITH_RUBY=1 fi elif [ "${option}" = '--without-ruby' ] ; then WITH_RUBY=0 elif [ "${option%%=*}" = '--with-retry-lock' ]; then if [ "${option#*=}" = 'no' ]; then WITH_RETRY_LOCK=0 else WITH_RETRY_LOCK=1 fi elif [ "${option}" = '--without-retry-lock' ] ; then WITH_RETRY_LOCK=0 elif [ "${option%%=*}" = '--with-zsh-completion' ]; then if [ "${option#*=}" = 'no' ]; then WITH_ZSH=0 else WITH_ZSH=1 fi elif [ "${option}" = '--without-zsh-completion' ] ; then WITH_ZSH=0 elif [ "${option%%=*}" = '--build' ] ; then true elif [ "${option%%=*}" = '--host' ] ; then true elif [ "${option%%=*}" = '--bindir' ] ; then true elif [ "${option%%=*}" = '--sbindir' ] ; then true elif [ "${option%%=*}" = '--datadir' ] ; then true elif [ "${option%%=*}" = '--localstatedir' ] ; then true elif [ "${option%%=*}" = '--sharedstatedir' ] ; then true elif [ "${option%%=*}" = '--libexecdir' ] ; then true elif [ "${option%%=*}" = '--exec-prefix' ] ; then true elif [ "${option%%=*}" = '--program-prefix' ] ; then true elif [ "${option}" = '--disable-maintainer-mode' ] ; then true elif [ "${option}" = '--disable-dependency-tracking' ] ; then true else echo "Unrecognized option: ${option}" echo "See:" echo " $0 --help" echo "" exit 1 fi done # We set this value early, (rather than just while printing the # Makefile.config file later like most values), because we need to # actually investigate this value compared to the ldconfig_paths value # below. if [ -z "$LIBDIR" ] ; then libdir_expanded="${PREFIX}/lib" else # very non-general variable expansion libdir_expanded=$(printf %s "$LIBDIR" | sed "s|\${prefix}|${PREFIX}|; s|\$prefix\>|${PREFIX}|; s|//*|/|g") fi cat < minimal.c printf "Sanity checking C compilation environment... " test_cmdline="${CC} ${CFLAGS} ${CPPFLAGS} minimal.c ${LDFLAGS} -o minimal" if ${test_cmdline} > /dev/null 2>&1 then printf "OK.\n" else printf "Fail.\n" errors=$((errors + 1)) printf Executed:; printf ' %s' ${test_cmdline}; echo ${test_cmdline} fi printf "Sanity checking C++ compilation environment... " test_cmdline="${CXX} ${CXXFLAGS_for_sh} ${CPPFLAGS} minimal.c ${LDFLAGS} -o minimal" if ${test_cmdline} > /dev/null 2>&1 then printf "OK.\n" else printf "Fail.\n" errors=$((errors + 1)) printf Executed:; printf ' %s' ${test_cmdline}; echo ${test_cmdline} fi unset test_cmdline if [ $errors -gt 0 ]; then cat </dev/null 2>&1 && ./minimal then printf "Yes.\n" have_asan=1 else printf "Nope, skipping those tests.\n" have_asan=0 fi unset test_cmdline printf "Reading libnotmuch version from source... " cat > _libversion.c < #include "lib/notmuch.h" int main(void) { printf("libnotmuch_version_major=%d\n", LIBNOTMUCH_MAJOR_VERSION); printf("libnotmuch_version_minor=%d\n", LIBNOTMUCH_MINOR_VERSION); printf("libnotmuch_version_release=%d\n", LIBNOTMUCH_MICRO_VERSION); return 0; } EOF if ${CC} ${CFLAGS} -I"$srcdir" _libversion.c -o _libversion > /dev/null 2>&1 \ && ./_libversion > _libversion.sh && . ./_libversion.sh then printf "OK.\n" else cat < /dev/null 2>&1; then have_pkg_config=1 else have_pkg_config=0 fi printf "Checking for Xapian development files (>= 1.4.0)... " have_xapian=0 for xapian_config in ${XAPIAN_CONFIG} xapian-config; do if ${xapian_config} --version > /dev/null 2>&1; then xapian_version=$(${xapian_config} --version | sed -e 's/.* //') case $xapian_version in 1.[4-9]* | 1.[1-9][0-9]* | [2-9]* | [1-9][0-9]*) printf "Yes (%s).\n" ${xapian_version} have_xapian=1 xapian_cxxflags=$(${xapian_config} --cxxflags) xapian_ldflags=$(${xapian_config} --libs) ;; *) printf "Xapian $xapian_version not supported... " esac break fi done if [ ${have_xapian} = "0" ]; then printf "No.\n" errors=$((errors + 1)) fi GMIME_MINVER=3.0.3 printf "Checking for GMime development files (>= $GMIME_MINVER)... " if pkg-config --exists "gmime-3.0 >= $GMIME_MINVER"; then printf "Yes.\n" have_gmime=1 gmime_cflags=$(pkg-config --cflags gmime-3.0) gmime_ldflags=$(pkg-config --libs gmime-3.0) printf "Checking for GMime session key extraction support... " cat > _check_session_keys.c < #include int main () { GError *error = NULL; GMimeParser *parser = NULL; GMimeMultipartEncrypted *body = NULL; GMimeDecryptResult *decrypt_result = NULL; GMimeObject *output = NULL; g_mime_init (); parser = g_mime_parser_new (); g_mime_parser_init_with_stream (parser, g_mime_stream_file_open("$srcdir/test/corpora/crypto/basic-encrypted.eml", "r", &error)); if (error) return !! fprintf (stderr, "failed to instantiate parser with test/corpora/crypto/basic-encrypted.eml\n"); body = GMIME_MULTIPART_ENCRYPTED(g_mime_message_get_mime_part (g_mime_parser_construct_message (parser, NULL))); if (body == NULL) return !! fprintf (stderr, "did not find a multipart encrypted message\n"); output = g_mime_multipart_encrypted_decrypt (body, GMIME_DECRYPT_EXPORT_SESSION_KEY, NULL, &decrypt_result, &error); if (error || output == NULL) return !! fprintf (stderr, "decryption failed\n"); if (decrypt_result == NULL) return !! fprintf (stderr, "no GMimeDecryptResult found\n"); if (decrypt_result->session_key == NULL) return !! fprintf (stderr, "GMimeDecryptResult has no session key\n"); printf ("%s\n", decrypt_result->session_key); return 0; } EOF if ! TEMP_GPG=$(mktemp -d "${TMPDIR:-/tmp}/notmuch.XXXXXX"); then printf 'No.\nCould not make tempdir for testing session-key support.\n' errors=$((errors + 1)) elif ${CC} ${CFLAGS} ${gmime_cflags} _check_session_keys.c ${gmime_ldflags} -o _check_session_keys \ && GNUPGHOME=${TEMP_GPG} gpg --batch --quiet --import < "$srcdir"/test/gnupg-secret-key.asc \ && SESSION_KEY=$(GNUPGHOME=${TEMP_GPG} ./_check_session_keys) \ && [ $SESSION_KEY = 9:0BACD64099D1468AB07C796F0C0AC4851948A658A15B34E803865E9FC635F2F5 ] then printf "OK.\n" else cat </dev/null; then printf 'Your current GPGME development version is: %s\n' "$(gpgme-config --version)" else printf 'You do not have the GPGME development libraries installed.\n' fi errors=$((errors + 1)) fi if [ -n "$TEMP_GPG" -a -d "$TEMP_GPG" ]; then rm -rf "$TEMP_GPG" fi cat > _check_gmime_cert.c < #include int main () { GError *error = NULL; GMimeParser *parser = NULL; GMimeApplicationPkcs7Mime *body = NULL; GMimeSignatureList *sig_list = NULL; GMimeSignature *sig = NULL; GMimeCertificate *cert = NULL; GMimeObject *output = NULL; int len; g_mime_init (); parser = g_mime_parser_new (); g_mime_parser_init_with_stream (parser, g_mime_stream_file_open("$srcdir/test/corpora/pkcs7/smime-onepart-signed.eml", "r", &error)); if (error) return !! fprintf (stderr, "failed to instantiate parser with test/corpora/pkcs7/smime-onepart-signed.eml\n"); body = GMIME_APPLICATION_PKCS7_MIME(g_mime_message_get_mime_part (g_mime_parser_construct_message (parser, NULL))); if (body == NULL) return !! fprintf (stderr, "did not find a application/pkcs7 message\n"); sig_list = g_mime_application_pkcs7_mime_verify (body, GMIME_VERIFY_NONE, &output, &error); if (error || output == NULL) return !! fprintf (stderr, "verify failed\n"); if (sig_list == NULL) return !! fprintf (stderr, "no GMimeSignatureList found\n"); len = g_mime_signature_list_length (sig_list); if (len != 1) return !! fprintf (stderr, "expected 1 signature, got %d\n", len); sig = g_mime_signature_list_get_signature (sig_list, 0); if (sig == NULL) return !! fprintf (stderr, "no GMimeSignature found at position 0\n"); cert = g_mime_signature_get_certificate (sig); if (cert == NULL) return !! fprintf (stderr, "no GMimeCertificate found\n"); #ifdef CHECK_VALIDITY GMimeValidity validity = g_mime_certificate_get_id_validity (cert); if (validity != GMIME_VALIDITY_FULL) return !! fprintf (stderr, "Got validity %d, expected %d\n", validity, GMIME_VALIDITY_FULL); #endif #ifdef CHECK_EMAIL const char *email = g_mime_certificate_get_email (cert); if (! email) return !! fprintf (stderr, "no email returned"); if (email[0] == '<') return 2; #endif return 0; } EOF # see https://github.com/jstedfast/gmime/pull/90 # should be fixed in GMime in 3.2.7, but some distros might patch printf "Checking for GMime X.509 certificate validity... " if ! TEMP_GPG=$(mktemp -d "${TMPDIR:-/tmp}/notmuch.XXXXXX"); then printf 'No.\nCould not make tempdir for testing X.509 certificate validity support.\n' errors=$((errors + 1)) elif ${CC} -DCHECK_VALIDITY ${CFLAGS} ${gmime_cflags} _check_gmime_cert.c ${gmime_ldflags} -o _check_x509_validity \ && echo disable-crl-checks > "$TEMP_GPG/gpgsm.conf" \ && echo "4D:E0:FF:63:C0:E9:EC:01:29:11:C8:7A:EE:DA:3A:9A:7F:6E:C1:0D S" >> "$TEMP_GPG/trustlist.txt" \ && GNUPGHOME=${TEMP_GPG} gpgsm --batch --quiet --import < "$srcdir"/test/smime/ca.crt then if GNUPGHOME=${TEMP_GPG} ./_check_x509_validity; then gmime_x509_cert_validity=1 printf "Yes.\n" else gmime_x509_cert_validity=0 printf "No.\n" if pkg-config --exists "gmime-3.0 >= 3.2.7"; then cat < _verify_sig_with_session_key.c < #include int main () { GError *error = NULL; GMimeParser *parser = NULL; GMimeMultipartEncrypted *body = NULL; GMimeDecryptResult *result = NULL; GMimeSignatureList *sig_list = NULL; GMimeSignature *sig = NULL; GMimeObject *output = NULL; GMimeSignatureStatus status; int len; g_mime_init (); parser = g_mime_parser_new (); g_mime_parser_init_with_stream (parser, g_mime_stream_file_open("$srcdir/test/corpora/crypto/encrypted-signed.eml", "r", &error)); if (error) return !! fprintf (stderr, "failed to instantiate parser with test/corpora/pkcs7/smime-onepart-signed.eml\n"); body = GMIME_MULTIPART_ENCRYPTED(g_mime_message_get_mime_part (g_mime_parser_construct_message (parser, NULL))); if (body == NULL) return !! fprintf (stderr, "did not find a multipart/encrypted message\n"); output = g_mime_multipart_encrypted_decrypt (body, GMIME_DECRYPT_NONE, "9:13607E4217515A70EC8DF9DBC16C5327B94577561D98AD1246FA8756659C7899", &result, &error); if (error || output == NULL) return !! fprintf (stderr, "decrypt failed\n"); sig_list = g_mime_decrypt_result_get_signatures (result); if (sig_list == NULL) return !! fprintf (stderr, "sig_list is NULL\n"); if (sig_list == NULL) return !! fprintf (stderr, "no GMimeSignatureList found\n"); len = g_mime_signature_list_length (sig_list); if (len != 1) return !! fprintf (stderr, "expected 1 signature, got %d\n", len); sig = g_mime_signature_list_get_signature (sig_list, 0); if (sig == NULL) return !! fprintf (stderr, "no GMimeSignature found at position 0\n"); status = g_mime_signature_get_status (sig); if (status & GMIME_SIGNATURE_STATUS_KEY_MISSING) return !! fprintf (stderr, "signature status contains KEY_MISSING (see https://dev.gnupg.org/T3464)\n"); return 0; } EOF if ! TEMP_GPG=$(mktemp -d "${TMPDIR:-/tmp}/notmuch.XXXXXX"); then printf 'No.\nCould not make tempdir for testing signature verification when decrypting with session keys.\n' errors=$((errors + 1)) elif ${CC} ${CFLAGS} ${gmime_cflags} _verify_sig_with_session_key.c ${gmime_ldflags} -o _verify_sig_with_session_key \ && GNUPGHOME=${TEMP_GPG} gpg --batch --quiet --import < "$srcdir"/test/gnupg-secret-key.asc \ && rm -f ${TEMP_GPG}/private-keys-v1.d/*.key then if GNUPGHOME=${TEMP_GPG} ./_verify_sig_with_session_key; then gmime_verify_with_session_key=1 printf "Yes.\n" else gmime_verify_with_session_key=0 printf "No.\n" cat <= 2.12, but we use at least one Glib # function that only exists as of 2.22, (g_array_unref) printf "Checking for Glib development files (>= 2.22)... " have_glib=0 if pkg-config --exists 'glib-2.0 >= 2.22'; then printf "Yes.\n" have_glib=1 # these are included in gmime cflags and ldflags # glib_cflags=$(pkg-config --cflags glib-2.0) # glib_ldflags=$(pkg-config --libs glib-2.0) else printf "No.\n" errors=$((errors + 1)) fi if ! pkg-config --exists zlib; then ${CC} -o compat/gen_zlib_pc "$srcdir"/compat/gen_zlib_pc.c >/dev/null 2>&1 && compat/gen_zlib_pc > compat/zlib.pc && PKG_CONFIG_PATH=${PKG_CONFIG_PATH:+$PKG_CONFIG_PATH:}compat && export PKG_CONFIG_PATH rm -f compat/gen_zlib_pc fi printf "Checking for zlib (>= 1.2.5.2)... " have_zlib=0 if pkg-config --atleast-version=1.2.5.2 zlib; then printf "Yes.\n" have_zlib=1 zlib_cflags=$(pkg-config --cflags zlib) zlib_ldflags=$(pkg-config --libs zlib) else printf "No.\n" errors=$((errors + 1)) fi printf "Checking for talloc development files... " if pkg-config --exists talloc; then printf "Yes.\n" have_talloc=1 talloc_cflags=$(pkg-config --cflags talloc) talloc_ldflags=$(pkg-config --libs talloc) else printf "No.\n" have_talloc=0 talloc_cflags= errors=$((errors + 1)) fi printf "Checking for bash... " if command -v ${BASHCMD} > /dev/null; then have_bash=1 bash_absolute=$(command -v ${BASHCMD}) printf "Yes (%s).\n" "$bash_absolute" else have_bash=0 bash_absolute= printf "No. (%s not found)\n" "${BASHCMD}" fi printf "Checking for perl... " if command -v ${PERL} > /dev/null; then have_perl=1 perl_absolute=$(command -v ${PERL}) printf "Yes (%s).\n" "$perl_absolute" else have_perl=0 perl_absolute= printf "No. (%s not found)\n" "${PERL}" fi printf "Checking for python... " have_python=0 for name in ${PYTHON} python3 python python2; do if command -v $name > /dev/null; then have_python=1 python=$name printf "Yes (%s).\n" "$name" break fi done if [ $have_python -eq 0 ]; then printf "No.\n" errors=$((errors + 1)) fi have_python3=0 if [ $have_python -eq 1 ]; then printf "Checking for python3 (>= 3.5)..." if "$python" -c 'import sys, sysconfig; assert sys.version_info >= (3,5)'; >/dev/null 2>&1; then printf "Yes.\n" have_python3=1 else printf "No (will not install CFFI-based python bindings).\n" fi fi have_python3_dev=0 if [ $have_python3 -eq 1 ]; then printf "Checking for python3 version ..." python3_version=$("$python" -c 'import sysconfig; print(sysconfig.get_python_version());') printf "(%s)\n" $python3_version printf "Checking for python $python3_version development files..." if pkg-config --exists "python-$python3_version"; then have_python3_dev=1 printf "Yes.\n" else have_python3_dev=0 printf "No (will not install CFFI-based python bindings).\n" fi fi have_python3_cffi=0 have_python3_pytest=0 if [ $have_python3_dev -eq 1 ]; then printf "Checking for python3 cffi and setuptools... " if "$python" -c 'import cffi,setuptools; cffi.FFI().verify()' >/dev/null 2>&1; then printf "Yes.\n" have_python3_cffi=1 WITH_PYTHON_DOCS=1 else WITH_PYTHON_DOCS=0 printf "No (will not install CFFI-based python bindings).\n" fi rm -rf __pycache__ # cffi.FFI().verify() uses this space printf "Checking for python3 pytest (>= 3.0)... " conf=$(mktemp) printf "[pytest]\nminversion=3.0\n" > $conf if "$python" -m pytest -c $conf --version >/dev/null 2>&1; then printf "Yes.\n" have_python3_pytest=1 else printf "No (will not test CFFI-based python bindings).\n" fi rm -f $conf fi printf "Checking for valgrind development files... " if pkg-config --exists valgrind; then printf "Yes.\n" have_valgrind=1 valgrind_cflags=$(pkg-config --cflags valgrind) else printf "No (but that's fine).\n" have_valgrind=0 valgrind_cflags= fi printf "Checking for bash-completion (>= 1.90)... " if pkg-config --atleast-version=1.90 bash-completion; then printf "Yes.\n" else printf "No (will not install bash completion).\n" WITH_BASH=0 fi printf "Checking for sfsexp... " if pkg-config --exists sfsexp; then printf "Yes.\n" have_sfsexp=1 sfsexp_cflags=$(pkg-config --cflags sfsexp) sfsexp_ldflags=$(pkg-config --libs sfsexp) else printf "No (will not enable s-expression queries).\n" have_sfsexp=0 sfsexp_cflags= sfsexp_ldflags= fi if [ -z "${EMACSLISPDIR-}" ]; then EMACSLISPDIR="\$(prefix)/share/emacs/site-lisp" fi if [ -z "${EMACSETCDIR-}" ]; then EMACSETCDIR="\$(prefix)/share/emacs/site-lisp" fi if [ $WITH_EMACS = "1" ]; then printf "Checking if emacs (>= 25) is available... " if emacs --quick --batch --eval '(if (< emacs-major-version 25) (kill-emacs 1))' > /dev/null 2>&1; then printf "Yes.\n" else printf "No (disabling emacs related parts of build)\n" WITH_EMACS=0 fi fi have_doxygen=0 if [ $WITH_API_DOCS = "1" ] ; then printf "Checking if doxygen is available... " if command -v doxygen > /dev/null; then printf "Yes.\n" have_doxygen=1 else printf "No (so will not install api docs)\n" fi fi have_ruby_dev=0 if [ $WITH_RUBY = "1" ] ; then printf "Checking for ruby development files... " if ${RUBY} -e "require 'mkmf'"> /dev/null 2>&1; then printf "Yes.\n" have_ruby_dev=1 else printf "No (skipping ruby bindings)\n" fi fi have_sphinx=0 have_makeinfo=0 have_install_info=0 if [ $WITH_DOCS = "1" ] ; then printf "Checking if sphinx is available and supports nroff output... " if command -v sphinx-build > /dev/null && ${python} -m sphinx.writers.manpage > /dev/null 2>&1 ; then printf "Yes.\n" have_sphinx=1 else printf "No (so will not install man pages).\n" fi printf "Checking if makeinfo is available... " if command -v makeinfo > /dev/null; then printf "Yes.\n" have_makeinfo=1 else printf "No (so will not build info pages).\n" fi printf "Checking if install-info is available... " if command -v install-info > /dev/null; then printf "Yes.\n" have_install_info=1 else printf "No (so will not install info pages).\n" fi fi if [ $WITH_DESKTOP = "1" ]; then printf "Checking if desktop-file-install is available... " if command -v desktop-file-install > /dev/null; then printf "Yes.\n" else printf "No (so will not install .desktop file).\n" WITH_DESKTOP=0 fi fi printf "Checking for cppcheck... " if command -v cppcheck > /dev/null; then have_cppcheck=1 printf "Yes.\n" else have_cppcheck=0 printf "No.\n" fi libdir_in_ldconfig=0 printf "Checking which platform we are on... " uname=$(uname) if [ $uname = "Darwin" ] ; then printf "Mac OS X.\n" platform=MACOSX linker_resolves_library_dependencies=0 elif [ $uname = "SunOS" ] ; then printf "Solaris.\n" platform=SOLARIS linker_resolves_library_dependencies=0 elif [ $uname = "FreeBSD" ] ; then printf "FreeBSD.\n" platform=FREEBSD linker_resolves_library_dependencies=0 elif [ $uname = "OpenBSD" ] ; then printf "OpenBSD.\n" platform=OPENBSD linker_resolves_library_dependencies=0 elif [ $uname = "Linux" ] || [ $uname = "GNU" ] ; then printf "%s\n" "$uname" platform="$uname" linker_resolves_library_dependencies=1 printf "Checking for %s in ldconfig... " "$libdir_expanded" ldconfig_paths=$(/sbin/ldconfig -N -X -v 2>/dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p') # Separate ldconfig_paths only on newline (not on any potential # embedded space characters in any filenames). Note, we use a # literal newline in the source here rather than something like: # # IFS=$(printf '\n') # # because the shell's command substitution deletes any trailing newlines. IFS=" " for path in $ldconfig_paths; do if [ "$path" -ef "$libdir_expanded" ]; then libdir_in_ldconfig=1 fi done IFS=$DEFAULT_IFS if [ "$libdir_in_ldconfig" = '0' ]; then printf "No (will set RPATH)\n" else printf "Yes\n" fi else printf "Unknown.\n" platform="$uname" linker_resolves_library_dependencies=0 cat <= version 1.4.0, including development files such as headers)" echo " https://xapian.org/" fi if [ $have_zlib -eq 0 ]; then echo " zlib library (>= version 1.2.5.2, including development files such as headers)" echo " https://zlib.net/" echo fi if [ $have_gmime -eq 0 ]; then echo " GMime library >= $GMIME_MINVER" echo " (including development files such as headers)" echo " https://github.com/jstedfast/gmime/" echo fi if [ $have_glib -eq 0 ]; then echo " Glib library >= 2.22 (including development files such as headers)" echo " https://ftp.gnome.org/pub/gnome/sources/glib/" echo fi if [ $have_talloc -eq 0 ]; then echo " The talloc library (including development files such as headers)" echo " https://talloc.samba.org/" echo fi cat < /dev/null 2>&1 then printf "Yes.\n" have_canonicalize_file_name=1 else printf "No (will use our own instead).\n" have_canonicalize_file_name=0 fi rm -f compat/have_canonicalize_file_name printf "Checking for getline... " if ${CC} -o compat/have_getline "$srcdir"/compat/have_getline.c > /dev/null 2>&1 then printf "Yes.\n" have_getline=1 else printf "No (will use our own instead).\n" have_getline=0 fi rm -f compat/have_getline printf "Checking for strcasestr... " if ${CC} -o compat/have_strcasestr "$srcdir"/compat/have_strcasestr.c > /dev/null 2>&1 then printf "Yes.\n" have_strcasestr=1 else printf "No (will use our own instead).\n" have_strcasestr=0 fi rm -f compat/have_strcasestr printf "Checking for strsep... " if ${CC} -o compat/have_strsep "$srcdir"/compat/have_strsep.c > /dev/null 2>&1 then printf "Yes.\n" have_strsep="1" else printf "No (will use our own instead).\n" have_strsep="0" fi rm -f compat/have_strsep printf "Checking for timegm... " if ${CC} -o compat/have_timegm "$srcdir"/compat/have_timegm.c > /dev/null 2>&1 then printf "Yes.\n" have_timegm="1" else printf "No (will use our own instead).\n" have_timegm="0" fi rm -f compat/have_timegm cat < _time_t.c #include #include static_assert(sizeof(time_t) >= 8, "sizeof(time_t) < 8"); EOF printf "Checking for 64 bit time_t... " if ${CC} -c _time_t.c -o /dev/null then printf "Yes.\n" have_64bit_time_t=1 else printf "No.\n" have_64bit_time_t=0 fi printf "Checking for dirent.d_type... " if ${CC} -o compat/have_d_type "$srcdir"/compat/have_d_type.c > /dev/null 2>&1 then printf "Yes.\n" have_d_type="1" else printf "No (will use stat instead).\n" have_d_type="0" fi rm -f compat/have_d_type printf "Checking for standard version of getpwuid_r... " if ${CC} -o compat/check_getpwuid "$srcdir"/compat/check_getpwuid.c > /dev/null 2>&1 then printf "Yes.\n" std_getpwuid=1 else printf "No (will define _POSIX_PTHREAD_SEMANTICS to get it).\n" std_getpwuid=0 fi rm -f compat/check_getpwuid printf "Checking for standard version of asctime_r... " if ${CC} -o compat/check_asctime "$srcdir"/compat/check_asctime.c > /dev/null 2>&1 then printf "Yes.\n" std_asctime=1 else printf "No (will define _POSIX_PTHREAD_SEMANTICS to get it).\n" std_asctime=0 fi rm -f compat/check_asctime printf "Checking for rpath support... " if [ $WITH_RPATH = "1" ] && ${CC} -Wl,--enable-new-dtags -Wl,-rpath,/tmp/ -o minimal minimal.c >/dev/null 2>&1 then printf "Yes.\n" rpath_ldflags="-Wl,--enable-new-dtags -Wl,-rpath,\$(libdir)" else printf "No (nothing to worry about).\n" rpath_ldflags="" fi printf "Checking for -Wl,--as-needed... " if ${CC} -Wl,--as-needed -o minimal minimal.c >/dev/null 2>&1 then printf "Yes.\n" as_needed_ldflags="-Wl,--as-needed" else printf "No (nothing to worry about).\n" as_needed_ldflags="" fi printf "Checking for -Wl,--no-undefined... " if ${CC} -Wl,--no-undefined -o minimal minimal.c >/dev/null 2>&1 then printf "Yes.\n" no_undefined_ldflags="-Wl,--no-undefined" else printf "No (nothing to worry about).\n" no_undefined_ldflags="" fi WARN_CXXFLAGS="" printf "Checking for available C++ compiler warning flags... " for flag in -Wall -Wextra -Wwrite-strings; do if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1 then WARN_CXXFLAGS="${WARN_CXXFLAGS}${WARN_CXXFLAGS:+ }${flag}" fi done printf "\n\t%s\n" "${WARN_CXXFLAGS}" WARN_CFLAGS="${WARN_CXXFLAGS}" printf "Checking for available C compiler warning flags... " for flag in -Wmissing-declarations; do if ${CC} $flag -o minimal minimal.c > /dev/null 2>&1 then WARN_CFLAGS="${WARN_CFLAGS}${WARN_CFLAGS:+ }${flag}" fi done printf "\n\t%s\n" "${WARN_CFLAGS}" rm -f minimal minimal.c _time_t.c _libversion.c _libversion _libversion.sh _check_session_keys.c _check_session_keys _check_gmime_cert.c _check_x509_validity _check_email \ _verify_sig_with_session_key.c _verify_sig_with_session_key # construct the Makefile.config cat > Makefile.config < sh.config <) NOTMUCH_GMIME_EMITS_ANGLE_BRACKETS=${gmime_emits_angle_brackets} # Whether GMime can verify signatures when decrypting with a session key: NOTMUCH_GMIME_VERIFY_WITH_SESSION_KEY=${gmime_verify_with_session_key} # Does the C compiler support the address sanitizer NOTMUCH_HAVE_ASAN=${have_asan} # do we have man pages? NOTMUCH_HAVE_MAN=$((have_sphinx)) # Whether bash exists, and if so where NOTMUCH_HAVE_BASH=${have_bash} NOTMUCH_BASH_ABSOLUTE=${bash_absolute} # Whether time_t is 64 bits (or more) NOTMUCH_HAVE_64BIT_TIME_T=${have_64bit_time_t} # Whether perl exists, and if so where NOTMUCH_HAVE_PERL=${have_perl} NOTMUCH_PERL_ABSOLUTE=${perl_absolute} # Name of python interpreter NOTMUCH_PYTHON=${python} # Name of ruby interpreter NOTMUCH_RUBY=${RUBY} # Are the ruby development files (and ruby) available? If not skip # building/testing ruby bindings. NOTMUCH_HAVE_RUBY_DEV=${have_ruby_dev} # Is the python cffi package available? NOTMUCH_HAVE_PYTHON3_CFFI=${have_python3_cffi} # Is the python pytest package available? NOTMUCH_HAVE_PYTHON3_PYTEST=${have_python3_pytest} # Is the sfsexp library available? NOTMUCH_HAVE_SFSEXP=${have_sfsexp} # Platform we are run on PLATFORM=${platform} EOF { echo "# Generated by configure, run from doc/conf.py" if [ $WITH_EMACS = "1" ]; then echo "tags.add('WITH_EMACS')" fi if [ $WITH_PYTHON_DOCS = "1" ]; then echo "tags.add('WITH_PYTHON')" fi printf "rsti_dir = '%s'\n" "$(cd emacs && pwd -P)" } > sphinx.config cat > bindings/python-cffi/_notmuch_config.py <