X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/b5481a756851b8ee1626aaf8f66dc4e4a11e6695..4b1c1c0b7395ab1a48d364b13d26ba35e03d9b56:/configure.ac diff --git a/configure.ac b/configure.ac index 94b2ec03..18dbc1c9 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,6 @@ dnl dnl configure.ac -- autoconf template for nmh dnl -dnl Move this up a bit AC_PREREQ([2.68]) AC_INIT([nmh], m4_normalize(m4_include([VERSION])), [nmh-workers@nongnu.org]) @@ -24,32 +23,22 @@ dnl -------------------------- dnl CHECK COMMAND LINE OPTIONS dnl -------------------------- -dnl Do you want to debug nmh? -AC_ARG_ENABLE([debug], - AS_HELP_STRING([--enable-debug],[enable nmh code debugging])) - dnl Do you want client-side support for using SASL for authentication? dnl Note that this code will be enabled for both POP and SMTP AC_ARG_WITH([cyrus-sasl], AS_HELP_STRING([--with-cyrus-sasl], [Enable SASL support via the Cyrus SASL library])) -AS_IF([test x"$with_cyrus_sasl" != x -a x"$with_cyrus_sasl" != x"no"],[ - AC_DEFINE([CYRUS_SASL], [1], - [Define to use the Cyrus SASL library for authentication of POP and SMTP.])dnl - AS_IF([test x"$with_cyrus_sasl" != xyes],[ - AC_MSG_WARN([Arguments to --with-cyrus-sasl now ignored]) - AC_MSG_WARN([Please pass the appropriate arguments to CPPFLAGS/LDFLAGS])]) - sasl_support=yes], [sasl_support=no]) +AS_IF([test x"$with_cyrus_sasl" != x -a x"$with_cyrus_sasl" != xyes -a \ + x"$with_cyrus_sasl" != xno],[ + AC_MSG_WARN([Arguments to --with-cyrus-sasl now ignored]) + AC_MSG_WARN([Please pass the appropriate arguments to CPPFLAGS/LDFLAGS])]) + +dnl Do you want client-side support for encryption with TLS? +AC_ARG_WITH([tls], AS_HELP_STRING([--with-tls], [Enable TLS support])) dnl Do you want client-side support for using OAuth2 for SMTP authentication? AC_ARG_WITH([oauth], AS_HELP_STRING([--with-oauth], [Enable OAuth2 support in SMTP auth])) -dnl Do you want client-side support for encryption with TLS? -AC_ARG_WITH([tls], AS_HELP_STRING([--with-tls], [Enable TLS support])) -AS_IF([test x"$with_tls" != x"no"],[ - AC_DEFINE([TLS_SUPPORT], [1], [Support TLS for session encryption.])dnl - tls_support=yes],[tls_support=no]) - dnl Set the backup prefix AC_ARG_WITH([hash-backup], AS_HELP_STRING([--with-hash-backup],[use # as the backup prefix (default: ,)])) @@ -92,35 +81,79 @@ dnl ------------------ AC_PROG_CC([cc gcc]) AM_PROG_CC_C_O +dnl ------------------ +dnl CHECK HEADER FILES +dnl ------------------ + +AC_HEADER_TIOCGWINSZ +AC_CHECK_HEADERS([fcntl.h stdbool.h wchar.h wctype.h \ + sys/param.h sys/time.h sys/stream.h]) + +AC_CHECK_HEADER([sys/ptem.h], AC_DEFINE(WINSIZE_IN_PTEM,1, + [Define to 1 if `struct winsize' requires .]),, +[[#if HAVE_SYS_STREAM_H +# include +#endif +]]) + +dnl --------------- +dnl CHECK FUNCTIONS +dnl --------------- +AC_CHECK_FUNCS([wcwidth mbtowc getutxent arc4random mkstemps]) + +dnl Use custom getline for platforms that don't have it. +AC_CONFIG_LIBOBJ_DIR([sbr]) +AC_REPLACE_FUNCS([getline]) + +dnl ----------------------- +dnl CHECK MULTIBYTE SUPPORT +dnl ----------------------- +AS_IF([test "x$ac_cv_header_wchar_h" = "xyes" -a \ + "x$ac_cv_header_wctype_h" = "xyes" -a \ + "x$ac_cv_func_wcwidth" = "xyes" -a \ + "x$ac_cv_func_mbtowc" = "xyes"], + [AC_DEFINE([MULTIBYTE_SUPPORT], [1], + [Define to enable support for multibyte character sets.]) + MULTIBYTE_ENABLED=1], + [MULTIBYTE_ENABLED=0]) +AC_SUBST([MULTIBYTE_ENABLED]) + dnl ---------------- dnl CUSTOMIZE CFLAGS dnl ---------------- dnl The user didn't specify CFLAGS, so customize them. + if test "$GCC" != yes; then dnl Use -v and some other options with SunStudio cc. lex produces dnl code that causes unreachable-statement warnings. It might be dnl better to use an autoconf test, except -v will probably succeed dnl with many other compilers but have different meaning. AS_CASE([`${CC} -V 2>&1`], - [cc:\ Sun\ C*], [CFLAGS=\ + [cc:*\ Sun\ C*], [CFLAGS=\ "${CFLAGS:+$CFLAGS }-v -errtags=yes -erroff=E_STATEMENT_NOT_REACHED"]) fi AC_CACHE_CHECK([whether compiler supports -Wall], [nmh_cv_has_wall], [nmh_saved_cflags="$CFLAGS" - CFLAGS="$CFLAGS -Wall -Werror" + CFLAGS="$AM_CFLAGS $CFLAGS -Wall -Werror" AC_TRY_COMPILE([],[],nmh_cv_has_wall=yes,nmh_cv_has_wall=no) CFLAGS="$nmh_saved_cflags"]) test "$nmh_cv_has_wall" = "yes" && CFLAGS="${CFLAGS:+$CFLAGS }-Wall" AC_CACHE_CHECK([whether compiler supports -Wextra], [nmh_cv_has_wextra], [nmh_saved_cflags="$CFLAGS" - CFLAGS="$CFLAGS -Wextra -Werror" + CFLAGS="$AM_CFLAGS $CFLAGS -Wextra -Werror" AC_TRY_COMPILE([],[],nmh_cv_has_wextra=yes, nmh_cv_has_wextra=no) CFLAGS="$nmh_saved_cflags"]) test "$nmh_cv_has_wextra" = "yes" && CFLAGS="${CFLAGS:+$CFLAGS }-Wextra" +AC_SUBST([AM_CFLAGS]) + +dnl Check for any platform-specific additional AM_CPPFLAGS. This depends on +dnl MULTIBYTE_ENABLED having already been set. +NMH_ADDL_CPPFLAGS + if test "$GCC" = yes; then dnl Do this regardless of auto_cflags value. dnl Enable _FORTIFY_SOURCE checking, which is supported by @@ -128,9 +161,11 @@ if test "$GCC" = yes; then dnl It shouldn't hurt with earlier versions because it's a cpp macro. dnl If the user configures with a CFLAGS that contains a -O flag dnl but then removes it a make time, they'll also have to remove - dnl -D_FORTIFY_SOURCE from CPPFLAGS because it requires optimization. + dnl -D_FORTIFY_SOURCE from AM_CPPFLAGS because it requires optimization. + dnl Use "\ " instead of ' ' or " " for compatiblity with posh. AS_CASE([$CFLAGS], - [-O*|*' -O'*],[CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-D_FORTIFY_SOURCE=2"]) + [-O|*\ -O|-O[[!0]]*|*\ -O[[!0]]*], + [AM_CPPFLAGS="${AM_CPPFLAGS:+$AM_CPPFLAGS }-D_FORTIFY_SOURCE=2"]) fi dnl FreeBSD needs a bit of magic to bring getline() into scope. @@ -170,13 +205,13 @@ AC_CACHE_CHECK([whether linker supports -Qunused-arguments], [AS_IF([test "$GCC" = yes && `${CC} --version 2>&1 | \ grep clang >/dev/null`], [nmh_saved_ldflags="$LDFLAGS" - LDFLAGS="$LDFLAGS -Qunused-arguments" + LDFLAGS="$AM_LDFLAGS $LDFLAGS -Qunused-arguments" AC_TRY_LINK([],[],nmh_cv_has_q_unused_arguments=yes, nmh_cv_has_q_unused_arguments=no) LDFLAGS="$nmh_saved_ldflags"], [nmh_cv_has_q_unused_arguments=no])]) test "$nmh_cv_has_q_unused_arguments" = "yes" && \ - LDFLAGS="${LDFLAGS:+$LDFLAGS }-Qunused-arguments" + AM_LDFLAGS="${AM_LDFLAGS:+$AM_LDFLAGS }-Qunused-arguments" dnl This hack turns off assertions by default, assuming dnl that configure still uses this shell variable. Without @@ -233,7 +268,9 @@ pathtmp=/usr/sbin:/usr/lib:/usr/etc:/usr/ucblib:/usr/bin:/bin AC_PATH_PROG([sendmailpath], [sendmail], [/usr/sbin/sendmail], [$pathtmp]) dnl Cygwin FAT filesystems do not support hard links. So default to -dnl cp instead, even if running on an NTFS or other filesystem. +dnl cp instead, even if running on an NTFS or other filesystem. (And +dnl therefore, this cannot be made into a dynamic test, in order to +dnl support the least common Cygwin denominator. AS_CASE(["$host_os"], [cygwin*], [LN=cp], [LN=ln]) @@ -307,51 +344,6 @@ AC_SUBST([MAIL_SPOOL_GRP])dnl NMH_MIMETYPEPROC NMH_MIMEENCODINGPROC -dnl ------------------ -dnl CHECK HEADER FILES -dnl ------------------ - -dnl On glibc we need to define at least the '_XOPEN_SOURCE' level of features, -dnl or wchar.h doesn't declare a prototype for wcwidth(). But if we only define -dnl that level then db.h won't compile. So we define _GNU_SOURCE which turns -dnl on everything. Perhaps other OSes need some feature switch set to get wcwidth() -dnl declared; if so they should have an entry added to this case statement. -dnl NB that we must define this on the compiler command line, not in config.h, -dnl because it must be set before any system header is included and there's no -dnl portable way to make sure that files generated by lex include config.h -dnl before system header files. - -AS_CASE(["$host_os"], - [linux*], - [# Like DEFS, but doesn't get stomped on by configure when using config.h: - CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-D_GNU_SOURCE"]) - -AC_HEADER_TIOCGWINSZ -AC_CHECK_HEADERS([fcntl.h wchar.h wctype.h sys/param.h sys/time.h sys/stream.h]) - -AC_CHECK_HEADER([sys/ptem.h], AC_DEFINE(WINSIZE_IN_PTEM,1, - [Define to 1 if `struct winsize' requires .]),, -[[#if HAVE_SYS_STREAM_H -# include -#endif -]]) - -dnl --------------- -dnl CHECK FUNCTIONS -dnl --------------- -AC_CHECK_FUNCS([wcwidth mbtowc getutxent arc4random mkstemps]) - -dnl Check for multibyte character set support -AS_IF([test "x$ac_cv_header_wchar_h" = "xyes" -a \ - "x$ac_cv_header_wctype_h" = "xyes" -a \ - "x$ac_cv_func_wcwidth" = "xyes" -a \ - "x$ac_cv_func_mbtowc" = "xyes"], - [AC_DEFINE([MULTIBYTE_SUPPORT], [1], - [Define to enable support for multibyte character sets.]) - MULTIBYTE_ENABLED=1], - [MULTIBYTE_ENABLED=0]) -AC_SUBST([MULTIBYTE_ENABLED]) - dnl ------------------- dnl CHECK FOR LIBRARIES dnl ------------------- @@ -462,28 +454,67 @@ dnl -------------------- dnl CHECK FOR CYRUS-SASL dnl -------------------- -AS_IF([test x"$sasl_support" = x"yes"],[ - AC_CHECK_HEADER([sasl/sasl.h], , [AC_MSG_ERROR([sasl.h not found])]) - AC_CHECK_LIB([sasl2], [sasl_client_new], [SASLLIB="-lsasl2"], - [AC_MSG_ERROR([Cyrus SASL library not found])])],[SASLLIB=""]) +AS_IF([test x"$with_cyrus_sasl" != x"no"],[ + AC_CHECK_HEADER([sasl/sasl.h], HAVE_SASL_H=1) + AC_CHECK_LIB([sasl2], [sasl_client_new], [SASLLIB="-lsasl2"])]) AC_SUBST([SASLLIB]) +dnl ----------------- +dnl Enable SASL? +dnl ----------------- +dnl By default (with_cyrus_sasl=''), enable SASL if header and lib are found. +dnl If SASL requested (--with-sasl with_cyrus_sasl=yes), error if header or lib not found. +dnl If SASL disabled (--without-sasl with_cyrus_sasl=no), don't enable it. +sasl_support=no +CYRUS_SASL=0 +AC_SUBST([CYRUS_SASL]) +AS_IF([test "x$with_cyrus_sasl" = xyes && test "x$HAVE_SASL_H" = x], + [AC_MSG_ERROR([SASL requested but sasl.h not found])], + [test "x$with_cyrus_sasl" = xyes && test "x$SASLLIB" = x], + [AC_MSG_ERROR([SASL requested but Cyrus SASL library not found])], + [test "x$with_cyrus_sasl" != xno && test "x$HAVE_SASL_H" = x1 && + test "x$SASLLIB" != x], + [AC_DEFINE([CYRUS_SASL], [1], + [Define to use the Cyrus SASL library for authentication of POP and SMTP.]) + CYRUS_SASL=1 + sasl_support=yes]) + dnl ----------------- dnl CHECK FOR OPENSSL dnl ----------------- -AS_IF([test x"$tls_support" = x"yes"],[ - dnl OpenBSD 5 needs the other-libraries (fourth argument) to the - dnl AC_CHECK_LIB for SSL_library_init, because it doesn't +AS_IF([test x"$with_tls" != x"no"],[ + dnl OpenBSD 5 needs the other-libraries (fifth argument) to the + dnl AC_CHECK_LIB for SSL_new, because it doesn't dnl automatically append -lcrypto when linking with -lssl. - AC_CHECK_HEADER([openssl/ssl.h], , [AC_MSG_ERROR([openssl/ssl.h not found])]) - AC_CHECK_LIB([crypto], [BIO_write], [TLSLIB="-lcrypto"], - [AC_MSG_ERROR([OpenSSL crypto library not found])]) - AC_CHECK_LIB([ssl], [SSL_library_init], [TLSLIB="-lssl $TLSLIB"], - [AC_MSG_ERROR([OpenSSL library not found])],[$TLSLIB])], - [TLSLIB=]) + AC_CHECK_HEADER([openssl/ssl.h], HAVE_SSL_H=1) + AC_CHECK_LIB([crypto], [BIO_write], [TLSLIB="-lcrypto"]) + AC_CHECK_LIB([ssl], [SSL_new], [TLSLIB="-lssl $TLSLIB"], [TLSLIB=], + [$TLSLIB])]) AC_SUBST([TLSLIB]) +dnl ----------------- +dnl Enable TLS? +dnl ----------------- +dnl By default (with_tls=''), enable TLS if header and libs were found. +dnl If TLS requested (--with-tls with_tls=yes), error if header/lib not found. +dnl If TLS disabled (--without-tls with_tls=no), don't enable it. +tls_support=no +TLS_SUPPORT=0 +AC_SUBST([TLS_SUPPORT]) +AS_IF([test "x$with_tls" = xyes && test "x$HAVE_SSL_H" = x], + [AC_MSG_ERROR([TLS requested but openssl/ssl.h not found])], + [test "x$with_tls" = xyes && test "x$TLSLIB" = x], + [AC_MSG_ERROR([TLS requested but crypto or ssl library not found])], + [test "x$with_tls" != xno && test "x$HAVE_SSL_H" = x1 && test "x$TLSLIB" != x], + [AC_DEFINE([TLS_SUPPORT], [1], [Support TLS for session encryption.]) + TLS_SUPPORT=1 + tls_support=yes + save_LIBS="$LIBS" + LIBS="$LIBS $TLSLIB" + AC_CHECK_FUNCS([X509_VERIFY_PARAM_set1_host]) + LIBS="$save_LIBS"]) + dnl ----------------- dnl CHECK FOR CURL dnl ----------------- @@ -491,7 +522,7 @@ dnl Look for curl if oauth not disabled (--without-oauth). AC_PATH_PROG([curl_config], [curl-config]) AS_IF([test "x$with_oauth" != xno && test -n "$curl_config"], [ save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS `$curl_config --cflags`" + CFLAGS="$AM_CPPFLAGS $AM_CFLAGS $CFLAGS `$curl_config --cflags`" AC_CHECK_HEADER([curl/curl.h], [ HAVE_CURL_H=1 AC_CHECK_LIB([curl], [curl_easy_init], [ @@ -501,12 +532,10 @@ AS_IF([test "x$with_oauth" != xno && test -n "$curl_config"], [ AS_IF([test "x$CURL_USER_AGENT" != "x`echo $CURL_USER_AGENT | sed 's/ //'`"], [AC_MSG_WARN([unexpected curl-config --version: $CURL_USER_AGENT]) CURL_USER_AGENT=libcurl/UNKNOWN]) - echo "HEYEPG ($CURL_USER_AGENT)" AC_SUBST([CURL_USER_AGENT]) ]) - ], [ - CFLAGS="$save_CFLAGS" ]) + CFLAGS="$save_CFLAGS" ]) dnl ----------------- @@ -530,16 +559,20 @@ AS_IF([test "x$with_oauth" = xyes && test "x$HAVE_CURL_H" = x], dnl ---------------- dnl CHECK FLEX FIXUP dnl ---------------- -dnl Use LFLAGS make variable setting to work around bugs in flex +dnl BUG: This stops $(LFLAGS) working as it comes after $(AM_FLAGS). +dnl Use AM_LFLAGS make variable setting to work around bugs in flex dnl 2.5.36-37 that cause signed/unsigned mismatch, dnl http://sourceforge.net/p/flex/bugs/140/ +dnl 2.6.1 bug: https://github.com/westes/flex/issues/97 AS_IF([test "$LEX" = flex], [AS_CASE([`$LEX -V`], - [flex\ 2.5.35], [LFLAGS=\ + [flex\ 2.5.35], [AM_LFLAGS=\ '; sed "s/ int n;/ size_t n;/" $@ >$@.tmp && mv -f $@.tmp $@'], - [flex\ 2.5.3[[67]]], [LFLAGS=\ -'; sed "s/\( \)int i;/\1yy_size_t i;/" $@ >$@.tmp && mv -f $@.tmp $@']) - AC_SUBST([LFLAGS])]) + [flex\ 2.5.3[[67]]], [AM_LFLAGS=\ +'; sed "s/\( \)int i;/\1yy_size_t i;/" $@ >$@.tmp && mv -f $@.tmp $@'], + [flex\ 2.6.1], [AM_LFLAGS=\ +'; sed '\''/\/s/int/size_t/; s/\/int i/'\'' $@ >$@.tmp && mv -f $@.tmp $@']) + AC_SUBST([AM_LFLAGS])]) dnl ------------------ dnl FOR INTERNAL USE by the NMH test suite @@ -552,6 +585,9 @@ dnl ---------------- dnl CHECK STRUCTURES dnl ---------------- +dnl FIXME: This test could work on Linux if _BSD_SOURCE was #define'd +dnl according to localtime(3). +dnl dnl For platforms such as FreeBSD that have tm_gmtoff in struct tm. dnl (FreeBSD has a timezone() function but not a timezone global dnl variable that is visible). @@ -559,24 +595,6 @@ AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[#include ]) AC_STRUCT_DIRENT_D_TYPE -dnl Where is located? Needed as input for signames.awk -AC_CACHE_CHECK(where signal.h is located, nmh_cv_path_signal_h, -[for SIGNAL_H in /usr/include/bsd/sys/signal.h dnl Next - /usr/include/asm/signal.h dnl Linux 1.3.0 and above - /usr/include/asm/signum.h dnl some versions of Linux/Alpha - /usr/include/linux/signal.h dnl Linux up to 1.2.11 - /usr/include/sys/signal.h dnl Almost everybody else - /dev/null; dnl Just in case we fall through -do - test -f $SIGNAL_H && \ - grep '#[ ]*define[ ][ ]*SIG[0-9A-Z]*[ ]*[0-9][0-9]*' $SIGNAL_H > /dev/null && \ - break -done -nmh_cv_path_signal_h=$SIGNAL_H -]) -SIGNAL_H=$nmh_cv_path_signal_h -AC_SUBST(SIGNAL_H)dnl - dnl dnl Sigh, this is required because under the new world order autoconf has dnl nothing to create in a few of the build directories when doing an object @@ -609,9 +627,9 @@ nmh configuration nmh version : AC_PACKAGE_VERSION host os : ${host} compiler : ${CC} -compiler flags : ${CFLAGS} -linker flags : ${LDFLAGS} -preprocessor flags : ${CPPFLAGS} +compiler flags : ${AM_CFLAGS} ${CFLAGS} +linker flags : ${AM_LDFLAGS} ${LDFLAGS} +preprocessor flags : ${AM_CPPFLAGS} ${CPPFLAGS} source code location : ${srcdir} binary install path : ${nmhbin} libexec install path : ${nmhlibexec}/nmh