diff options
Diffstat (limited to 'm4/dovecot.m4')
-rw-r--r-- | m4/dovecot.m4 | 619 |
1 files changed, 619 insertions, 0 deletions
diff --git a/m4/dovecot.m4 b/m4/dovecot.m4 new file mode 100644 index 0000000..8092bf5 --- /dev/null +++ b/m4/dovecot.m4 @@ -0,0 +1,619 @@ +dnl dovecot.m4 - Check presence of dovecot -*-Autoconf-*- +dnl +dnl Copyright (C) 2010 Dennis Schridde +dnl +dnl This file is free software; the authors give +dnl unlimited permission to copy and/or distribute it, with or without +dnl modifications, as long as this notice is preserved. + +# serial 34 + +dnl +dnl Check for support for D_FORTIFY_SOURCE=2 +dnl + +AC_DEFUN([AC_CC_D_FORTIFY_SOURCE],[ + AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) + AS_IF([test "$enable_hardening" = yes], [ + case "$host" in + *) + gl_COMPILER_OPTION_IF([-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2], [ + CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2" + ], + [], + [AC_LANG_PROGRAM()] + ) + esac + ]) +]) + +dnl * gcc specific options +AC_DEFUN([DC_DOVECOT_CFLAGS],[ + AS_IF([test "x$ac_cv_c_compiler_gnu" = "xyes"], [ + dnl -Wcast-qual -Wcast-align -Wconversion -Wunreachable-code # too many warnings + dnl -Wstrict-prototypes -Wredundant-decls # may give warnings in some systems + dnl -Wmissing-format-attribute -Wmissing-noreturn -Wwrite-strings # a couple of warnings + CFLAGS="$CFLAGS -Wall -W -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith -Wchar-subscripts -Wformat=2 -Wbad-function-cast" + + AS_IF([test "$have_clang" = "yes"], [ + AC_TRY_COMPILE([ + #if __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 3) + # error new clang + #endif + ],,,[ + dnl clang 3.3+ unfortunately this gives warnings with hash.h + CFLAGS="$CFLAGS -Wno-duplicate-decl-specifier" + ]) + ], [ + dnl This is simply to avoid warning when building strftime() wrappers.. + CFLAGS="$CFLAGS -fno-builtin-strftime" + ]) + + AC_TRY_COMPILE([ + #if __GNUC__ < 4 + # error old gcc + #endif + ],,[ + dnl gcc4 + CFLAGS="$CFLAGS -Wstrict-aliasing=2" + ]) + + dnl Use std=gnu99 if we have new enough gcc + old_cflags=$CFLAGS + CFLAGS="-std=gnu99" + AC_TRY_COMPILE([ + ],, [ + CFLAGS="$CFLAGS $old_cflags" + ], [ + CFLAGS="$old_cflags" + ]) + + ]) +]) + +AC_DEFUN([AC_LD_WHOLE_ARCHIVE], [ + LD_WHOLE_ARCHIVE= + LD_NO_WHOLE_ARCHIVE= + AC_MSG_CHECKING([for linker option to include whole archive]) + ld_help="`$CC -Wl,-help 2>&1`" + case "$ld_help" in + *"--whole-archive"*) + LD_WHOLE_ARCHIVE="--whole-archive" + LD_NO_WHOLE_ARCHIVE="--no-whole-archive" + ;; + esac + AS_IF([test "x$LD_WHOLE_ARCHIVE" != "x"], + [AC_MSG_RESULT([-Wl,$LD_WHOLE_ARCHIVE])], + [AC_MSG_RESULT([not supported])] + ) + AC_SUBST([LD_WHOLE_ARCHIVE]) + AC_SUBST([LD_NO_WHOLE_ARCHIVE]) + AM_CONDITIONAL([HAVE_WHOLE_ARCHIVE], [test "x$LD_WHOLE_ARCHIVE" != "x"]) +]) + +dnl +dnl Check for -z now and -z relro linker flags +dnl +dnl Copyright (C) 2013 Red Hat, Inc. +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License, or (at your option) any later version. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library. If not, see +dnl <http://www.gnu.org/licenses/>. +dnl + +AC_DEFUN([AC_LD_RELRO],[ + RELRO_LDFLAGS= + AS_IF([test "$enable_hardening" = yes], [ + AC_MSG_CHECKING([for how to force completely read-only GOT table]) + ld_help=`$CC -Wl,-help 2>&1` + case $ld_help in + *"-z relro"*) RELRO_LDFLAGS="-Wl,-z -Wl,relro" ;; + esac + case $ld_help in + *"-z now"*) RELRO_LDFLAGS="$RELRO_LDFLAGS -Wl,-z -Wl,now" ;; + esac + AS_IF([test "x$RELRO_LDFLAGS" != "x"], + [AC_MSG_RESULT([$RELRO_LDFLAGS])], + [AC_MSG_RESULT([unknown])] + ) + ]) + AC_SUBST([RELRO_LDFLAGS]) +]) + +dnl +dnl Check for support for position independent executables +dnl +dnl Copyright (C) 2013 Red Hat, Inc. +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License, or (at your option) any later version. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library. If not, see +dnl <http://www.gnu.org/licenses/>. +dnl + +AC_DEFUN([AC_CC_PIE],[ + AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) + PIE_CFLAGS= + PIE_LDFLAGS= + + AS_IF([test "$enable_hardening" = yes], [ + OLD_CFLAGS=$CFLAGS + case "$host" in + *-*-mingw* | *-*-msvc* | *-*-cygwin* ) + ;; dnl All code is position independent on Win32 target + *) + CFLAGS="-fPIE -DPIE" + gl_COMPILER_OPTION_IF([-pie], [ + PIE_CFLAGS="-fPIE -DPIE" + PIE_LDFLAGS="-pie" + ], [ + dnl some versions of clang require -Wl,-pie instead of -pie + gl_COMPILER_OPTION_IF([[-Wl,-pie]], [ + PIE_CFLAGS="-fPIE -DPIE" + PIE_LDFLAGS="-Wl,-pie" + ], [AC_MSG_RESULT([not supported])], + [AC_LANG_PROGRAM()] + ) + ], + [AC_LANG_PROGRAM()] + ) + esac + CFLAGS=$OLD_CFLAGS + ]) + AC_SUBST([PIE_CFLAGS]) + AC_SUBST([PIE_LDFLAGS]) +]) + +dnl +dnl Check for support for Retpoline +dnl + +AC_DEFUN([AC_CC_RETPOLINE],[ + AC_ARG_WITH(retpoline, + AS_HELP_STRING([--with-retpoline=<choice>], [Retpoline mitigation choice (default: keep)]), + with_retpoline=$withval, + with_retpoline=keep) + + AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) + AS_IF([test "$enable_hardening" = yes], [ + case "$host" in + *) + gl_COMPILER_OPTION_IF([-mfunction-return=$with_retpoline], + [CFLAGS="$CFLAGS -mfunction-return=$with_retpoline"], + [], + [AC_LANG_PROGRAM()] + ) + gl_COMPILER_OPTION_IF([-mindirect-branch=$with_retpoline], [ + CFLAGS="$CFLAGS -mindirect-branch=$with_retpoline" + ], + [], + [AC_LANG_PROGRAM()] + ) + esac + ]) +]) + +dnl +dnl Check for support for -fstack-protector or -strong +dnl + +AC_DEFUN([AC_CC_F_STACK_PROTECTOR],[ + AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) + AS_IF([test "$enable_hardening" = yes], [ + case "$host" in + *) + gl_COMPILER_OPTION_IF([-fstack-protector-strong], [ + CFLAGS="$CFLAGS -fstack-protector-strong" + ], + [ + gl_COMPILER_OPTION_IF([-fstack-protector], [ + CFLAGS="$CFLAGS -fstack-protector" + ], [], [AC_LANG_PROGRAM()]) + ], + [AC_LANG_PROGRAM()] + ) + esac + ]) +]) + +AC_DEFUN([DC_DOVECOT_MODULEDIR],[ + AC_ARG_WITH(moduledir, + [ --with-moduledir=DIR Base directory for dynamically loadable modules], + [moduledir="$withval"], + [moduledir="$dovecot_moduledir"] + ) + AC_SUBST(moduledir) +]) + +AC_DEFUN([DC_PLUGIN_DEPS],[ + _plugin_deps=yes + AC_MSG_CHECKING([whether OS supports plugin dependencies]) + case "$host_os" in + darwin*) + dnl OSX loads the plugins twice, which breaks stuff + _plugin_deps=no + ;; + esac + AC_MSG_RESULT([$_plugin_deps]) + AM_CONDITIONAL([DOVECOT_PLUGIN_DEPS], [test "x$_plugin_deps" = "xyes"]) + unset _plugin_deps +]) + +AC_DEFUN([DC_DOVECOT_TEST_WRAPPER],[ + AC_ARG_VAR([VALGRIND], [Path to valgrind]) + AC_PATH_PROG(VALGRIND, valgrind, reject) + AS_IF([test "$VALGRIND" != reject], [ + cat > run-test.sh <<_DC_EOF +#!/bin/sh +top_srcdir=\$[1] +shift + +if test "\$NOUNDEF" != ""; then + noundef="--undef-value-errors=no" +else + noundef="" +fi + +if test "\$NOCHILDREN" != ""; then + trace_children="--trace-children=no" +else + trace_children="--trace-children=yes" +fi + +skip_path="\$top_srcdir/run-test-valgrind.exclude" +if test -r "\$skip_path" && grep -w -q "\$(basename \$[1])" "\$skip_path"; then + NOVALGRIND=true +fi + +if test "\$NOVALGRIND" != ""; then + \$[*] + ret=\$? +else + test_out="test.out~\$\$" + trap "rm -f \$test_out" 0 1 2 3 15 + supp_path="\$top_srcdir/run-test-valgrind.supp" + if test -r "\$supp_path"; then + $VALGRIND -q \$trace_children --error-exitcode=213 --leak-check=full --gen-suppressions=all --suppressions="\$supp_path" --log-file=\$test_out \$noundef \$[*] + else + $VALGRIND -q \$trace_children --error-exitcode=213 --leak-check=full --gen-suppressions=all --log-file=\$test_out \$noundef \$[*] + fi + ret=\$? + if test -s \$test_out; then + cat \$test_out + ret=1 + fi +fi +if test \$ret != 0; then + echo "Failed to run: \$[*]" >&2 +fi +exit \$ret +_DC_EOF + RUN_TEST='$(LIBTOOL) execute $(SHELL) $(top_builddir)/run-test.sh $(top_srcdir)' + ], [ + RUN_TEST='' + ]) + AC_SUBST(RUN_TEST) +]) + +dnl Substitute every var in the given comma separated list +AC_DEFUN([AX_SUBST_L],[ + m4_foreach([__var__], [$@], [AC_SUBST(__var__)]) +]) + +AC_DEFUN([DC_DOVECOT_HARDENING],[ + AC_ARG_ENABLE(hardening, + AS_HELP_STRING([--enable-hardening=yes], [Enable various hardenings (default: yes)]), + enable_hardening=$enableval, + enable_hardening=yes) + + AC_MSG_CHECKING([Whether to enable hardening]) + AC_MSG_RESULT([$enable_hardening]) + + AC_CC_PIE + AC_CC_F_STACK_PROTECTOR + AC_CC_D_FORTIFY_SOURCE + AC_CC_RETPOLINE + AC_LD_RELRO + DOVECOT_WANT_UBSAN +]) + +AC_DEFUN([DC_DOVECOT_FUZZER],[ + AC_ARG_WITH(fuzzer, + AS_HELP_STRING([--with-fuzzer=clang], [Build with clang fuzzer (default: no)]), + with_fuzzer=$withval, + with_fuzzer=no) + AS_IF([test x$with_fuzzer = xclang], [ + CFLAGS="$CFLAGS -fsanitize=fuzzer-no-link" + # use $LIB_FUZZING_ENGINE for linking if it exists + FUZZER_LDFLAGS=${LIB_FUZZING_ENGINE--fsanitize=fuzzer} + # May need to use CXXLINK for linking, which wants sources to + # be compiled with -fPIE + FUZZER_CPPFLAGS='$(AM_CPPFLAGS) -fPIE -DPIE' + ], [test x$with_fuzzer != xno], [ + AC_MSG_ERROR([Unknown fuzzer $with_fuzzer]) + ]) + AC_SUBST([FUZZER_CPPFLAGS]) + AC_SUBST([FUZZER_LDFLAGS]) + AM_CONDITIONAL([USE_FUZZER], [test "x$with_fuzzer" != "xno"]) + +]) + +AC_DEFUN([DC_DOVECOT],[ + AC_ARG_WITH(dovecot, + [ --with-dovecot=DIR Dovecot base directory], + [ dovecotdir="$withval" ], [ + dc_prefix=$prefix + test "x$dc_prefix" = xNONE && dc_prefix=$ac_default_prefix + dovecotdir="$dc_prefix/lib/dovecot" + ] + ) + + AC_ARG_WITH(dovecot-install-dirs, + [AC_HELP_STRING([--with-dovecot-install-dirs], + [Use install directories configured for Dovecot (default)])], + AS_IF([test x$withval = xno], [ + use_install_dirs=no + ], [ + use_install_dirs=yes + ]), + use_install_dirs=yes) + + AC_MSG_CHECKING([for "$dovecotdir/dovecot-config"]) + AS_IF([test -f "$dovecotdir/dovecot-config"], [ + AC_MSG_RESULT([$dovecotdir/dovecot-config]) + ], [ + AC_MSG_RESULT([not found]) + AC_MSG_NOTICE([]) + AC_MSG_NOTICE([Use --with-dovecot=DIR to provide the path to the dovecot-config file.]) + AC_MSG_ERROR([dovecot-config not found]) + ]) + + old=`pwd` + cd $dovecotdir + abs_dovecotdir=`pwd` + cd $old + DISTCHECK_CONFIGURE_FLAGS="--with-dovecot=$abs_dovecotdir --without-dovecot-install-dirs" + + dnl Make sure dovecot-config doesn't accidentically override flags + ORIG_CFLAGS="$CFLAGS" + ORIG_LDFLAGS="$LDFLAGS" + ORIG_BINARY_CFLAGS="$BINARY_CFLAGS" + ORIG_BINARY_LDFLAGS="$BINARY_LDFLAGS" + + eval `grep -i '^dovecot_[[a-z_]]*=' "$dovecotdir"/dovecot-config` + eval `grep '^LIBDOVECOT[[A-Z0-9_]]*=' "$dovecotdir"/dovecot-config` + + CFLAGS="$ORIG_CFLAGS" + LDFLAGS="$ORIG_LDFLAGS" + BINARY_CFLAGS="$ORIG_BINARY_CFLAGS" + BINARY_LDFLAGS="$ORIG_BINARY_LDFLAGS" + + dovecot_installed_moduledir="$dovecot_moduledir" + + AS_IF([test "$use_install_dirs" = "no"], [ + dnl the main purpose of these is to fix make distcheck for plugins + dnl other than that, they don't really make much sense + dovecot_pkgincludedir='$(pkgincludedir)' + dovecot_pkglibdir='$(pkglibdir)' + dovecot_pkglibexecdir='$(libexecdir)/dovecot' + dovecot_docdir='$(docdir)' + dovecot_moduledir='$(moduledir)' + dovecot_statedir='$(statedir)' + ]) + + CC_CLANG + CC_STRICT_BOOL + DC_DOVECOT_CFLAGS + DC_DOVECOT_HARDENING + + AX_SUBST_L([DISTCHECK_CONFIGURE_FLAGS], [dovecotdir], [dovecot_moduledir], [dovecot_installed_moduledir], [dovecot_pkgincludedir], [dovecot_pkglibexecdir], [dovecot_pkglibdir], [dovecot_docdir], [dovecot_statedir]) + AX_SUBST_L([DOVECOT_INSTALLED], [DOVECOT_CFLAGS], [DOVECOT_LIBS], [DOVECOT_SSL_LIBS], [DOVECOT_SQL_LIBS], [DOVECOT_COMPRESS_LIBS], [DOVECOT_BINARY_CFLAGS], [DOVECOT_BINARY_LDFLAGS]) + AX_SUBST_L([LIBDOVECOT], [LIBDOVECOT_LOGIN], [LIBDOVECOT_SQL], [LIBDOVECOT_SSL], [LIBDOVECOT_COMPRESS], [LIBDOVECOT_LDA], [LIBDOVECOT_STORAGE], [LIBDOVECOT_DSYNC], [LIBDOVECOT_LIBFTS]) + AX_SUBST_L([LIBDOVECOT_DEPS], [LIBDOVECOT_LOGIN_DEPS], [LIBDOVECOT_SQL_DEPS], [LIBDOVECOT_SSL_DEPS], [LIBDOVECOT_COMPRESS_DEPS], [LIBDOVECOT_LDA_DEPS], [LIBDOVECOT_STORAGE_DEPS], [LIBDOVECOT_DSYNC_DEPS], [LIBDOVECOT_LIBFTS_DEPS]) + AX_SUBST_L([LIBDOVECOT_INCLUDE], [LIBDOVECOT_LDA_INCLUDE], [LIBDOVECOT_AUTH_INCLUDE], [LIBDOVECOT_DOVEADM_INCLUDE], [LIBDOVECOT_SERVICE_INCLUDE], [LIBDOVECOT_STORAGE_INCLUDE], [LIBDOVECOT_LOGIN_INCLUDE], [LIBDOVECOT_SQL_INCLUDE]) + AX_SUBST_L([LIBDOVECOT_IMAP_LOGIN_INCLUDE], [LIBDOVECOT_CONFIG_INCLUDE], [LIBDOVECOT_IMAP_INCLUDE], [LIBDOVECOT_POP3_INCLUDE], [LIBDOVECOT_SUBMISSION_INCLUDE], [LIBDOVECOT_LMTP_INCLUDE], [LIBDOVECOT_DSYNC_INCLUDE], [LIBDOVECOT_IMAPC_INCLUDE], [LIBDOVECOT_FTS_INCLUDE]) + AX_SUBST_L([LIBDOVECOT_NOTIFY_INCLUDE], [LIBDOVECOT_PUSH_NOTIFICATION_INCLUDE], [LIBDOVECOT_ACL_INCLUDE], [LIBDOVECOT_LIBFTS_INCLUDE], [LIBDOVECOT_LUA_INCLUDE]) + AX_SUBST_L([DOVECOT_LUA_LIBS], [DOVECOT_LUA_CFLAGS], [LIBDOVECOT_LUA], [LIBDOVECOT_LUA_DEPS]) + + AM_CONDITIONAL(DOVECOT_INSTALLED, test "$DOVECOT_INSTALLED" = "yes") + + DC_PLUGIN_DEPS + DC_DOVECOT_TEST_WRAPPER +]) + +AC_DEFUN([DC_CC_WRAPPER],[ + AS_IF([test "$want_shared_libs" != "yes"], [ + dnl want_shared_libs=no is for internal use. the liblib.la check is for plugins + AS_IF([test "$want_shared_libs" = "no" || echo "$LIBDOVECOT" | grep "/liblib.la" > /dev/null], [ + AS_IF([test "$with_gnu_ld" = yes], [ + dnl libtool can't handle using whole-archive flags, so we need to do this + dnl with a CC wrapper.. shouldn't be much of a problem, since most people + dnl are building with shared libs. + cat > cc-wrapper.sh <<_DC_EOF +#!/bin/sh + +if echo "\$[*]" | grep -- -ldl > /dev/null; then + # the binary uses plugins. make sure we include everything from .a libs + exec $CC -Wl,--whole-archive \$[*] -Wl,--no-whole-archive +else + exec $CC \$[*] +fi +_DC_EOF + chmod +x cc-wrapper.sh + CC=`pwd`/cc-wrapper.sh + ]) + ]) + ]) +]) + +AC_DEFUN([DC_PANDOC], [ + AC_ARG_VAR(PANDOC, [Path to pandoc program]) + + dnl Optional tool for making documentation + AC_CHECK_PROGS(PANDOC, [pandoc], [true]) + + AS_IF([test "$PANDOC" = "true"], [ + AS_IF([test ! -e README], [ + AC_MSG_ERROR([Cannot produce documentation without pandoc - disable with PANDOC=false ./configure]) + ]) + ]) +]) +# warnings.m4 serial 11 +dnl Copyright (C) 2008-2015 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Simon Josefsson + +# gl_AS_VAR_APPEND(VAR, VALUE) +# ---------------------------- +# Provide the functionality of AS_VAR_APPEND if Autoconf does not have it. +m4_ifdef([AS_VAR_APPEND], +[m4_copy([AS_VAR_APPEND], [gl_AS_VAR_APPEND])], +[m4_define([gl_AS_VAR_APPEND], +[AS_VAR_SET([$1], [AS_VAR_GET([$1])$2])])]) + + +# gl_COMPILER_OPTION_IF(OPTION, [IF-SUPPORTED], [IF-NOT-SUPPORTED], +# [PROGRAM = AC_LANG_PROGRAM()]) +# ----------------------------------------------------------------- +# Check if the compiler supports OPTION when compiling PROGRAM. +# +# FIXME: gl_Warn must be used unquoted until we can assume Autoconf +# 2.64 or newer. +AC_DEFUN([gl_COMPILER_OPTION_IF], +[AS_VAR_PUSHDEF([gl_Warn], [gl_cv_warn_[]_AC_LANG_ABBREV[]_$1])dnl +AS_VAR_PUSHDEF([gl_Flags], [_AC_LANG_PREFIX[]FLAGS])dnl +AS_LITERAL_IF([$1], + [m4_pushdef([gl_Positive], m4_bpatsubst([$1], [^-Wno-], [-W]))], + [gl_positive="$1" +case $gl_positive in + -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;; +esac +m4_pushdef([gl_Positive], [$gl_positive])])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler handles $1], m4_defn([gl_Warn]), [ + gl_save_compiler_FLAGS="$gl_Flags" + gl_AS_VAR_APPEND(m4_defn([gl_Flags]), + [" $gl_unknown_warnings_are_errors ]m4_defn([gl_Positive])["]) + AC_LINK_IFELSE([m4_default([$4], [AC_LANG_PROGRAM([])])], + [AS_VAR_SET(gl_Warn, [yes])], + [AS_VAR_SET(gl_Warn, [no])]) + gl_Flags="$gl_save_compiler_FLAGS" +]) +AS_VAR_IF(gl_Warn, [yes], [$2], [$3]) +m4_popdef([gl_Positive])dnl +AS_VAR_POPDEF([gl_Flags])dnl +AS_VAR_POPDEF([gl_Warn])dnl +]) + +# gl_UNKNOWN_WARNINGS_ARE_ERRORS +# ------------------------------ +# Clang doesn't complain about unknown warning options unless one also +# specifies -Wunknown-warning-option -Werror. Detect this. +AC_DEFUN([gl_UNKNOWN_WARNINGS_ARE_ERRORS], +[gl_COMPILER_OPTION_IF([-Werror -Wunknown-warning-option], + [gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror'], + [gl_unknown_warnings_are_errors=])]) + +# gl_WARN_ADD(OPTION, [VARIABLE = WARN_CFLAGS], +# [PROGRAM = AC_LANG_PROGRAM()]) +# --------------------------------------------- +# Adds parameter to WARN_CFLAGS if the compiler supports it when +# compiling PROGRAM. For example, gl_WARN_ADD([-Wparentheses]). +# +# If VARIABLE is a variable name, AC_SUBST it. +AC_DEFUN([gl_WARN_ADD], +[AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) +gl_COMPILER_OPTION_IF([$1], + [gl_AS_VAR_APPEND(m4_if([$2], [], [[WARN_CFLAGS]], [[$2]]), [" $1"])], + [], + [$3]) +m4_ifval([$2], + [AS_LITERAL_IF([$2], [AC_SUBST([$2])])], + [AC_SUBST([WARN_CFLAGS])])dnl +]) + +# Local Variables: +# mode: autoconf +# End: +dnl * clang check +AC_DEFUN([CC_CLANG],[ + AC_MSG_CHECKING([whether $CC is clang 3.3+]) + AS_IF([$CC -dM -E -x c /dev/null | grep __clang__ > /dev/null 2>&1], [ + AS_VAR_SET([have_clang], [yes]) + ], [ + AS_VAR_SET([have_clang], [no]) + ]) + AC_MSG_RESULT([$have_clang]) +]) + +AC_DEFUN([CC_STRICT_BOOL], [ + AS_IF([test $have_clang = yes], [ + AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) + gl_COMPILER_OPTION_IF([-Wstrict-bool], [ + AC_DEFINE(HAVE_STRICT_BOOL,, [we have strict bool]) + ]) + ]) +]) + +AC_DEFUN([DOVECOT_WANT_UBSAN], [ + AC_ARG_ENABLE(ubsan, + AS_HELP_STRING([--enable-ubsan], [Enable undefined behaviour sanitizes (default=no)]), + [want_ubsan=yes], [want_ubsan=no]) + AC_MSG_CHECKING([whether we want undefined behaviour sanitizer]) + AC_MSG_RESULT([$want_ubsan]) + AS_IF([test x$want_ubsan = xyes], [ + san_flags="" + gl_COMPILER_OPTION_IF([-fsanitize=undefined], [ + san_flags="$san_flags -fsanitize=undefined" + AC_DEFINE([HAVE_FSANITIZE_UNDEFINED], [1], [Define if your compiler has -fsanitize=undefined]) + ]) + gl_COMPILER_OPTION_IF([-fno-sanitize=nonnull-attribute], [ + san_flags="$san_flags -fno-sanitize=nonnull-attribute" + AC_DEFINE([HAVE_FNO_SANITIZE_NONNULL_ATTRIBUTE], [1], [Define if your compiler has -fno-sanitize=nonnull-attribute]) + ]) + gl_COMPILER_OPTION_IF([-fsanitize=implicit-integer-truncation], [ + san_flags="$san_flags -fsanitize=implicit-integer-truncation" + AC_DEFINE([HAVE_FSANITIZE_IMPLICIT_INTEGER_TRUNCATION], [1], [Define if your compiler has -fsanitize=implicit-integer-truncation]) + ]) + gl_COMPILER_OPTION_IF([-fsanitize=local-bounds], [ + san_flags="$san_flags -fsanitize=local-bounds" + AC_DEFINE([HAVE_FSANITIZE_LOCAL_BOUNDS], [1], [Define if your compiler has -fsanitize=local-bounds]) + ]) + gl_COMPILER_OPTION_IF([-fsanitize=integer], [ + san_flags="$san_flags -fsanitize=integer" + AC_DEFINE([HAVE_FSANITIZE_INTEGER], [1], [Define if your compiler has -fsanitize=integer]) + ]) + gl_COMPILER_OPTION_IF([-fsanitize=nullability], [ + san_flags="$san_flags -fsanitize=nullability" + AC_DEFINE([HAVE_FSANITIZE_NULLABILITY], [1], [Define if your compiler has -fsanitize=nullability]) + ]) + AS_IF([test "$san_flags" != "" ], [ + EXTRA_CFLAGS="$EXTRA_CFLAGS $san_flags -U_FORTIFY_SOURCE -g -ggdb3 -O0 -fno-omit-frame-pointer" + AC_DEFINE([HAVE_UNDEFINED_SANITIZER], [1], [Define if your compiler supports undefined sanitizers]) + ], [ + AC_MSG_ERROR([No undefined sanitizer support in your compiler]) + ]) + san_flags="" + ]) +]) |