From 1bae22f4e3872b695dbe541eb2d9635f2531bcae Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Mon, 15 Aug 2016 19:46:03 +0200 Subject: Test compiler and linker flags with AX_COMPILER_FLAGS_* macros The autoconf macros AX_COMPILER_FLAGS_{CFLAGS|CXXFLAGS|LDFLAGS} test for compiler and linker support of various flags, and add the flags to the generated output. If the command-line option '--enable-compile-warnings' is specified to 'configure', a number of additional warning options is also added to the output. This is the default. The AX_COMPILER_FLAGS_* macros add stricter warnings then before. The patch disables some of them to make dbus build without errors. A later patch set should fix the warnings and remove the compiler flags. This patch integrates all tests for compiler flags into the call to AX_COMPILER_FLAGS_CFLAGS. All tests for compiler flags are now done in a single place. The old macros have been removed. Signed-off-by: Thomas Zimmermann [smcv: add missing $ to DISABLE_WARNINGS] [smcv: drop -Wno-discarded-qualifiers] [smcv: drop non-C++ option -Wpointer-sign in C++ mode] [smcv: work around an AX_COMPILER_FLAGS_CFLAGS bug] [smcv: this source tree is called dbus, not DBus] Signed-off-by: Simon McVittie Bug: https://bugs.freedesktop.org/show_bug.cgi?id=97357 --- configure.ac | 143 ++++++++++++++++++++++----------------------- m4/tp-compiler-flag.m4 | 43 -------------- m4/tp-compiler-warnings.m4 | 49 ---------------- 3 files changed, 71 insertions(+), 164 deletions(-) delete mode 100644 m4/tp-compiler-flag.m4 delete mode 100644 m4/tp-compiler-warnings.m4 diff --git a/configure.ac b/configure.ac index 281fa83..ed9bff2 100644 --- a/configure.ac +++ b/configure.ac @@ -325,14 +325,24 @@ if test x$enable_verbose_mode = xyes; then AC_DEFINE(DBUS_ENABLE_VERBOSE_MODE,1,[Support a verbose mode]) fi +dnl Intentional: +dnl - $DISABLE_WARNINGS disables unused-label warnings if not +dnl checking or not asserting (tested further below) +dnl - missing field initializers being 0 is a C feature, not a bug +dnl - unused-parameter is to make writing callbacks less annoying +DISABLE_WARNINGS="$DISABLE_WARNINGS + -Wno-missing-field-initializers + -Wno-unused-parameter" + if test x$enable_asserts = xno; then AC_DEFINE(DBUS_DISABLE_ASSERT,1,[Disable assertion checking]) - DISABLE_UNUSED_WARNINGS="unused-label" + DISABLE_WARNINGS="$DISABLE_WARNINGS -Wno-unused-label" R_DYNAMIC_LDFLAG="" if test x$enable_embedded_tests = xyes; then - DISABLE_UNUSED_WARNINGS="$DISABLE_UNUSED_WARNINGS \ - unused-but-set-variable unused-variable \ - unused-function" + DISABLE_WARNINGS="$DISABLE_WARNINGS + -Wno-unused-but-set-variable + -Wno-unused-variable + -Wno-unused-function" fi else # -rdynamic is needed for glibc's backtrace_symbols to work. @@ -350,7 +360,7 @@ AC_SUBST(R_DYNAMIC_LDFLAG) if test x$enable_checks = xno; then AC_DEFINE(DBUS_DISABLE_CHECKS,1,[Disable public API sanity checking]) AC_DEFINE(G_DISABLE_CHECKS,1,[Disable GLib public API sanity checking]) - DISABLE_UNUSED_WARNINGS="unused-label" + DISABLE_WARNINGS="$DISABLE_WARNINGS -Wno-unused-label" fi AH_BOTTOM([ @@ -1334,78 +1344,66 @@ fi AC_SUBST([DBUS_X_CFLAGS]) AC_SUBST([DBUS_X_LIBS]) -#### gcc warning flags - -cc_supports_flag() { - AC_MSG_CHECKING(whether $CC supports "$*") - save_CFLAGS="$CFLAGS" - CFLAGS="$*" - AC_TRY_COMPILE([], [], [rc=yes], [rc=no]) - CFLAGS="$save_CFLAGS" - AC_MSG_RESULT([$rc]) - test "x$rc" = xyes -} - -TP_COMPILER_WARNINGS([WARNING_CFLAGS], - dnl Use -Werror by default if: - dnl - we're not on Windows (too many warnings), and - dnl - we're in developer mode (a D-Bus developer, not a distro or end-user) - dnl Override with --enable-Werror or --disable-Werror - [test x$dbus_win != xyes -a x$dbus_cygwin != xyes -a x$enable_developer = xyes], - - dnl Enable these warnings if possible: - [all \ - extra \ - char-subscripts \ - missing-declarations \ - missing-prototypes \ - nested-externs \ - pointer-arith \ - pointer-sign \ - cast-align \ - no-address \ - float-equal \ - declaration-after-statement \ - ], +# We're treating -fno-common like a warning: it makes the linker more +# strict, because on some systems the linker is *always* this strict +TEST_CFLAGS="$TEST_CFLAGS -fno-common" - dnl Disable these warnings if possible, make them non-fatal if possible, - dnl and don't enable -Werror unless we succeeded. - dnl - dnl Intentional: - dnl - $DISABLE_UNUSED_WARNINGS disables unused-label warnings if not - dnl checking or not asserting - dnl - missing field initializers being 0 is a C feature, not a bug - dnl - unused-parameter is to make writing callbacks less annoying - dnl - dnl To be fixed one day: - dnl - pointer-sign is a workaround for fd.o #15522 - dnl - type-limits is probably a bug too, but having the rest of -Wextra - dnl is better than nothing - [$DISABLE_UNUSED_WARNINGS \ - missing-field-initializers \ - unused-parameter \ - type-limits \ +AS_IF([test "x$enable_ansi" = "xyes"],[ + TEST_CFLAGS="$TEST_CFLAGS -ansi -pedantic" + AC_DEFINE([_POSIX_C_SOURCE],[199309L],[Define to enable POSIX features]) + AC_DEFINE([_BSD_SOURCE],[1],[Define to enable BSD features]) ]) -if test "x$GCC" = "xyes"; then - # We're treating -fno-common like a warning: it makes the linker more - # strict, because on some systems the linker is *always* this strict - TP_ADD_COMPILER_FLAG([WARNING_CFLAGS], [-fno-common]) - - # http://bugs.freedesktop.org/show_bug.cgi?id=10599 - TP_ADD_COMPILER_FLAG([WARNING_CFLAGS], [-fno-strict-aliasing]) - - if test "x$enable_ansi" = "xyes"; then - TP_ADD_COMPILER_FLAG([WARNING_CFLAGS], - [-ansi -D_POSIX_C_SOURCE=199309L -D_BSD_SOURCE -pedantic]) - fi -fi - -dnl In principle we should put WARNING_CFLAGS in each Makefile.am like +dnl TODO: The compiler flags below disable warnings that the +dnl compiler emits while building D-Bus. Fix the source +dnl code and remove these flags. +DISABLE_WARNINGS="$DISABLE_WARNINGS + -Wno-address + -Wno-format-nonliteral + -Wno-redundant-decls + -Wno-suggest-attribute=format + -Wno-suggest-attribute=noreturn + -Wno-shadow + -Wno-switch-default + -Wno-switch-enum + -Wno-type-limits + -Wno-undef" + +dnl We are only calling this for its side-effect of setting up +dnl --enable-compile-warnings; the WARN_CFLAGS, etc. are ignored, +dnl to work around https://github.com/peti/autoconf-archive/pull/96 +AX_COMPILER_FLAGS([], [], [$disable_developer]) + +dnl Work around https://github.com/peti/autoconf-archive/pull/96 by using +dnl a non-default variable name here (in particular there is no way to tell +dnl AX_COMPILER_FLAGS to not use WARN_CXXFLAGS) +AX_COMPILER_FLAGS_CFLAGS([EXTRA_CFLAGS], + [$disable_developer], + [$TEST_CFLAGS], + [-Wchar-subscripts \ + -Wfloat-equal \ + -Wpointer-sign \ + $DISABLE_WARNINGS]) + +dnl cc1plus: warning: command line option ‘-Wpointer-sign’ is valid for +dnl C/ObjC but not for C++ +AX_COMPILER_FLAGS_CXXFLAGS([EXTRA_CXXFLAGS], + [$disable_developer], + [], + [-Wchar-subscripts \ + -Wfloat-equal \ + $DISABLE_WARNINGS]) + +AX_COMPILER_FLAGS_LDFLAGS([EXTRA_LDFLAGS], + [$disable_developer]) + +dnl TODO: In principle we should put EXTRA_CFLAGS in each Makefile.am like dnl telepathy-glib does, since CFLAGS is meant to be reserved for the user... dnl but prepending to CFLAGS (so the user can override it with later CFLAGS) -dnl is the next best thing -CFLAGS="$WARNING_CFLAGS $CFLAGS" +dnl is the next best thing. +CFLAGS="$EXTRA_CFLAGS $CFLAGS" +CXXFLAGS="$EXTRA_CXXFLAGS $CXXFLAGS" +LDFLAGS="$EXTRA_LDFLAGS $LDFLAGS" case $host_os in solaris*) @@ -1916,6 +1914,7 @@ echo " cflags: ${CFLAGS} cppflags: ${CPPFLAGS} cxxflags: ${CXXFLAGS} + ldflags: ${LDFLAGS} 64-bit int: ${DBUS_INT64_TYPE} 32-bit int: ${DBUS_INT32_TYPE} 16-bit int: ${DBUS_INT16_TYPE} diff --git a/m4/tp-compiler-flag.m4 b/m4/tp-compiler-flag.m4 deleted file mode 100644 index 06deaba..0000000 --- a/m4/tp-compiler-flag.m4 +++ /dev/null @@ -1,43 +0,0 @@ -dnl A version of AS_COMPILER_FLAG that supports both C and C++. -dnl Based on: - -dnl as-compiler-flag.m4 0.1.0 -dnl autostars m4 macro for detection of compiler flags -dnl David Schleef -dnl $Id: as-compiler-flag.m4,v 1.1 2005/06/18 18:02:46 burgerman Exp $ - -dnl TP_COMPILER_FLAG(CFLAGS, ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) -dnl Tries to compile with the given CFLAGS and CXXFLAGS. -dnl -dnl Runs ACTION-IF-ACCEPTED if the compiler for the currently selected -dnl AC_LANG can compile with the flags, and ACTION-IF-NOT-ACCEPTED otherwise. - -AC_DEFUN([TP_COMPILER_FLAG], -[ - AC_MSG_CHECKING([to see if compiler understands $1]) - - save_CFLAGS="$CFLAGS" - save_CXXFLAGS="$CXXFLAGS" - CFLAGS="$CFLAGS $1" - CXXFLAGS="$CXXFLAGS $1" - - AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no]) - CFLAGS="$save_CFLAGS" - CXXFLAGS="$save_CXXFLAGS" - - if test "X$flag_ok" = Xyes ; then - $2 - true - else - $3 - true - fi - AC_MSG_RESULT([$flag_ok]) -]) - -dnl TP_ADD_COMPILER_FLAG(VARIABLE, CFLAGS) -dnl Append CFLAGS to VARIABLE if the compiler supports them. -AC_DEFUN([TP_ADD_COMPILER_FLAG], -[ - TP_COMPILER_FLAG([$2], [$1="[$]$1 $2"]) -]) diff --git a/m4/tp-compiler-warnings.m4 b/m4/tp-compiler-warnings.m4 deleted file mode 100644 index ee4af31..0000000 --- a/m4/tp-compiler-warnings.m4 +++ /dev/null @@ -1,49 +0,0 @@ -dnl TP_COMPILER_WARNINGS(VARIABLE, WERROR_BY_DEFAULT, DESIRABLE, UNDESIRABLE) -dnl $1 (VARIABLE): the variable to put flags into -dnl $2 (WERROR_BY_DEFAULT): a command returning true if -Werror should be the -dnl default -dnl $3 (DESIRABLE): warning flags we want (e.g. all extra shadow) -dnl $4 (UNDESIRABLE): warning flags we don't want (e.g. -dnl missing-field-initializers unused-parameter) -AC_DEFUN([TP_COMPILER_WARNINGS], -[ - AC_REQUIRE([AC_ARG_ENABLE])dnl - AC_REQUIRE([AC_HELP_STRING])dnl - AC_REQUIRE([TP_COMPILER_FLAG])dnl - - tp_warnings="" - for tp_flag in $3; do - TP_COMPILER_FLAG([-W$tp_flag], [tp_warnings="$tp_warnings -W$tp_flag"]) - done - - tp_error_flags="-Werror" - TP_COMPILER_FLAG([-Werror], [tp_werror=yes], [tp_werror=no]) - - for tp_flag in $4; do - TP_COMPILER_FLAG([-Wno-$tp_flag], - [tp_warnings="$tp_warnings -Wno-$tp_flag"]) -dnl Yes, we do need to use both -Wno-foo and -Wno-error=foo. Simon says: -dnl some warnings we explicitly don't want, like unused-parameter, but -dnl they're in -Wall. when a distro using cdbs compiles us, we have: -dnl -Werror -Wno-unused-parameter -Wall -dnl ^ from us ^ from cdbs -dnl which turns -Wunused-parameter back on, in effect - TP_COMPILER_FLAG([-Wno-error=$tp_flag], - [tp_error_flags="$tp_error_flags -Wno-error=$tp_flag"], [tp_werror=no]) - done - - AC_ARG_ENABLE([Werror], - AC_HELP_STRING([--disable-Werror], - [compile without -Werror (normally enabled in development builds)]), - tp_werror=$enableval, :) - - if test "x$tp_werror" = xyes && $2; then -dnl We put -Wno-error=foo before -Wno-foo because clang interprets -Wall -dnl -Werror -Wno-foo -Wno-error=foo as “make foo a non-fatal warning”, but does -dnl what we want if you reverse them. - $1="$tp_error_flags $tp_warnings" - else - $1="$tp_warnings" - fi - -]) -- 2.7.4