[Spice-devel] [PATCH spice-gtk 15/15] Import GNULIB's GCC warning macros

Daniel P. Berrange berrange at redhat.com
Tue Mar 13 06:40:13 PDT 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

GNULIB has a helpful module 'manywarnings' which makes it easy
to turn on every single GCC warning. The general goal is that
every possible GCC warning should be enabled, except for certain
blacklisted warnings.

This imports the GNULIB m4 macros, and updates configure.ac to
use this new capability. As & when new GCC warnings are created,
the 'manywarnings.m4' can be refreshed from upstream GNULIB

* m4/manywarnings.m4, m4/warnings.m4: GNULIB warning macros
* configure.ac: Remove custom compiler warning checks
* m4/spice-compile-warnings.m4: Decide what GCC warnings to enable
---
 configure.ac                 |   70 +----------------
 m4/manywarnings.m4           |  184 ++++++++++++++++++++++++++++++++++++++++++
 m4/spice-compile-warnings.m4 |  140 ++++++++++++++++++++++++++++++++
 m4/warnings.m4               |   37 +++++++++
 4 files changed, 362 insertions(+), 69 deletions(-)
 create mode 100644 m4/manywarnings.m4
 create mode 100644 m4/spice-compile-warnings.m4
 create mode 100644 m4/warnings.m4

diff --git a/configure.ac b/configure.ac
index 13f33e6..2d062b1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -572,76 +572,8 @@ AM_CONDITIONAL(WITH_PYTHON, [test "$WITH_PYTHON" = "yes"])
 dnl ===========================================================================
 dnl check compiler flags
 
-AC_DEFUN([SPICE_CC_TRY_FLAG], [
-  AC_MSG_CHECKING([whether $CC supports $1])
+SPICE_COMPILE_WARNINGS
 
-  spice_save_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS $1"
-
-  AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ])], [spice_cc_flag=yes], [spice_cc_flag=no])
-  CFLAGS="$spice_save_CFLAGS"
-
-  if test "x$spice_cc_flag" = "xyes"; then
-    ifelse([$2], , :, [$2])
-  else
-    ifelse([$3], , :, [$3])
-  fi
-  AC_MSG_RESULT([$spice_cc_flag])
-])
-
-
-dnl Use lots of warning flags with with gcc and compatible compilers
-
-dnl Note: if you change the following variable, the cache is automatically
-dnl skipped and all flags rechecked.  So there's no need to do anything
-dnl else.  If for any reason you need to force a recheck, just change
-dnl MAYBE_WARN in an ignorable way (like adding whitespace)
-
-dnl MAYBE_WARN="-Wall -Wno-sign-compare -Werror -Wno-deprecated-declarations"
-
-MAYBE_WARN="-Wall -Wno-sign-compare -Wno-deprecated-declarations"
-
-AC_ARG_ENABLE([werror],
-  AS_HELP_STRING([--enable-werror], [Use -Werror (if supported)]),
-  [set_werror="$enableval"],
-  [if test -d $srcdir/.git; then
-     is_git_version=true
-     set_werror=yes
-   else
-     set_werror=no
-   fi])
-
-# invalidate cached value if MAYBE_WARN has changed
-if test "x$spice_cv_warn_maybe" != "x$MAYBE_WARN"; then
-	unset spice_cv_warn_cflags
-fi
-AC_CACHE_CHECK([for supported warning flags], spice_cv_warn_cflags, [
-	echo
-	WARN_CFLAGS=""
-
-	# Some warning options are not supported by all versions of
-	# gcc, so test all desired options against the current
-	# compiler.
-	#
-	# Note that there are some order dependencies
-	# here. Specifically, an option that disables a warning will
-	# have no net effect if a later option then enables that
-	# warnings, (perhaps implicitly). So we put some grouped
-	# options (-Wall and -Wextra) up front and the -Wno options
-	# last.
-
-	for W in $MAYBE_WARN; do
-		SPICE_CC_TRY_FLAG([$W], [WARN_CFLAGS="$WARN_CFLAGS $W"])
-	done
-	if test "$set_werror" != "no"; then
-		SPICE_CC_TRY_FLAG(["-Werror"], [WARN_CFLAGS="$WARN_CFLAGS -Werror"])
-	fi
-
-	spice_cv_warn_cflags=$WARN_CFLAGS
-	spice_cv_warn_maybe=$MAYBE_WARN
-
-	AC_MSG_CHECKING([which warning flags were supported])])
-WARN_CFLAGS="$spice_cv_warn_cflags"
 SPICE_CFLAGS="$SPICE_CFLAGS $WARN_CFLAGS"
 
 AC_SUBST(SPICE_CFLAGS)
diff --git a/m4/manywarnings.m4 b/m4/manywarnings.m4
new file mode 100644
index 0000000..fd0e372
--- /dev/null
+++ b/m4/manywarnings.m4
@@ -0,0 +1,184 @@
+# manywarnings.m4 serial 3
+dnl Copyright (C) 2008-2012 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_MANYWARN_COMPLEMENT(OUTVAR, LISTVAR, REMOVEVAR)
+# --------------------------------------------------
+# Copy LISTVAR to OUTVAR except for the entries in REMOVEVAR.
+# Elements separated by whitespace.  In set logic terms, the function
+# does OUTVAR = LISTVAR \ REMOVEVAR.
+AC_DEFUN([gl_MANYWARN_COMPLEMENT],
+[
+  gl_warn_set=
+  set x $2; shift
+  for gl_warn_item
+  do
+    case " $3 " in
+      *" $gl_warn_item "*)
+        ;;
+      *)
+        gl_warn_set="$gl_warn_set $gl_warn_item"
+        ;;
+    esac
+  done
+  $1=$gl_warn_set
+])
+
+# gl_MANYWARN_ALL_GCC(VARIABLE)
+# -----------------------------
+# Add all documented GCC warning parameters to variable VARIABLE.
+# Note that you need to test them using gl_WARN_ADD if you want to
+# make sure your gcc understands it.
+AC_DEFUN([gl_MANYWARN_ALL_GCC],
+[
+  dnl First, check if -Wno-missing-field-initializers is needed.
+  dnl -Wmissing-field-initializers is implied by -W, but that issues
+  dnl warnings with GCC version before 4.7, for the common idiom
+  dnl of initializing types on the stack to zero, using { 0, }
+  AC_REQUIRE([AC_PROG_CC])
+  if test -n "$GCC"; then
+
+    dnl First, check -W -Werror -Wno-missing-field-initializers is supported
+    dnl with the current $CC $CFLAGS $CPPFLAGS.
+    AC_MSG_CHECKING([whether -Wno-missing-field-initializers is supported])
+    AC_CACHE_VAL([gl_cv_cc_nomfi_supported], [
+      gl_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS -W -Werror -Wno-missing-field-initializers"
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[]], [[]])],
+        [gl_cv_cc_nomfi_supported=yes],
+        [gl_cv_cc_nomfi_supported=no])
+      CFLAGS="$gl_save_CFLAGS"])
+    AC_MSG_RESULT([$gl_cv_cc_nomfi_supported])
+
+    if test "$gl_cv_cc_nomfi_supported" = yes; then
+      dnl Now check whether -Wno-missing-field-initializers is needed
+      dnl for the { 0, } construct.
+      AC_MSG_CHECKING([whether -Wno-missing-field-initializers is needed])
+      AC_CACHE_VAL([gl_cv_cc_nomfi_needed], [
+        gl_save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS -W -Werror"
+        AC_COMPILE_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[void f (void)
+               {
+                 typedef struct { int a; int b; } s_t;
+                 s_t s1 = { 0, };
+               }
+             ]],
+             [[]])],
+          [gl_cv_cc_nomfi_needed=no],
+          [gl_cv_cc_nomfi_needed=yes])
+        CFLAGS="$gl_save_CFLAGS"
+      ])
+      AC_MSG_RESULT([$gl_cv_cc_nomfi_needed])
+    fi
+  fi
+
+  gl_manywarn_set=
+  for gl_manywarn_item in \
+    -Wall \
+    -W \
+    -Wformat-y2k \
+    -Wformat-nonliteral \
+    -Wformat-security \
+    -Winit-self \
+    -Wmissing-include-dirs \
+    -Wswitch-default \
+    -Wswitch-enum \
+    -Wunused \
+    -Wunknown-pragmas \
+    -Wstrict-aliasing \
+    -Wstrict-overflow \
+    -Wsystem-headers \
+    -Wfloat-equal \
+    -Wtraditional \
+    -Wtraditional-conversion \
+    -Wdeclaration-after-statement \
+    -Wundef \
+    -Wshadow \
+    -Wunsafe-loop-optimizations \
+    -Wpointer-arith \
+    -Wbad-function-cast \
+    -Wc++-compat \
+    -Wcast-qual \
+    -Wcast-align \
+    -Wwrite-strings \
+    -Wconversion \
+    -Wsign-conversion \
+    -Wlogical-op \
+    -Waggregate-return \
+    -Wstrict-prototypes \
+    -Wold-style-definition \
+    -Wmissing-prototypes \
+    -Wmissing-declarations \
+    -Wmissing-noreturn \
+    -Wmissing-format-attribute \
+    -Wpacked \
+    -Wpadded \
+    -Wredundant-decls \
+    -Wnested-externs \
+    -Wunreachable-code \
+    -Winline \
+    -Winvalid-pch \
+    -Wlong-long \
+    -Wvla \
+    -Wvolatile-register-var \
+    -Wdisabled-optimization \
+    -Wstack-protector \
+    -Woverlength-strings \
+    -Wbuiltin-macro-redefined \
+    -Wmudflap \
+    -Wpacked-bitfield-compat \
+    -Wsync-nand \
+    ; do
+    gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item"
+  done
+  # The following are not documented in the manual but are included in
+  # output from gcc --help=warnings.
+  for gl_manywarn_item in \
+    -Wattributes \
+    -Wcoverage-mismatch \
+    -Wmultichar \
+    -Wunused-macros \
+    ; do
+    gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item"
+  done
+  # More warnings from gcc 4.6.2 --help=warnings.
+  for gl_manywarn_item in \
+    -Wabi \
+    -Wcpp \
+    -Wdeprecated \
+    -Wdeprecated-declarations \
+    -Wdiv-by-zero \
+    -Wdouble-promotion \
+    -Wendif-labels \
+    -Wextra \
+    -Wformat-contains-nul \
+    -Wformat-extra-args \
+    -Wformat-zero-length \
+    -Wformat=2 \
+    -Wmultichar \
+    -Wnormalized=nfc \
+    -Woverflow \
+    -Wpointer-to-int-cast \
+    -Wpragmas \
+    -Wsuggest-attribute=const \
+    -Wsuggest-attribute=noreturn \
+    -Wsuggest-attribute=pure \
+    -Wtrampolines \
+    ; do
+    gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item"
+  done
+
+  # Disable the missing-field-initializers warning if needed
+  if test "$gl_cv_cc_nomfi_needed" = yes; then
+    gl_manywarn_set="$gl_manywarn_set -Wno-missing-field-initializers"
+  fi
+
+  $1=$gl_manywarn_set
+])
diff --git a/m4/spice-compile-warnings.m4 b/m4/spice-compile-warnings.m4
new file mode 100644
index 0000000..074eafe
--- /dev/null
+++ b/m4/spice-compile-warnings.m4
@@ -0,0 +1,140 @@
+dnl
+dnl Enable all known GCC compiler warnings, except for those
+dnl we can't yet cope with
+dnl
+AC_DEFUN([SPICE_COMPILE_WARNINGS],[
+    dnl ******************************
+    dnl More compiler warnings
+    dnl ******************************
+
+    AC_ARG_ENABLE([werror],
+                  AS_HELP_STRING([--enable-werror], [Use -Werror (if supported)]),
+                  [set_werror="$enableval"],
+                  [if test -d $srcdir/.git; then
+                     is_git_version=true
+                     set_werror=yes
+                   else
+                     set_werror=no
+                   fi])
+
+    # List of warnings that are not relevant / wanted
+
+    # Don't care about C++ compiler compat
+    dontwarn="$dontwarn -Wc++-compat"
+    dontwarn="$dontwarn -Wabi"
+    dontwarn="$dontwarn -Wdeprecated"
+    # Don't care about ancient C standard compat
+    dontwarn="$dontwarn -Wtraditional"
+    # Don't care about ancient C standard compat
+    dontwarn="$dontwarn -Wtraditional-conversion"
+    # Ignore warnings in /usr/include
+    dontwarn="$dontwarn -Wsystem-headers"
+    # Happy for compiler to add struct padding
+    dontwarn="$dontwarn -Wpadded"
+    # GCC very confused with -O2
+    dontwarn="$dontwarn -Wunreachable-code"
+
+
+    dontwarn="$dontwarn -Wconversion"
+    dontwarn="$dontwarn -Wsign-conversion"
+    dontwarn="$dontwarn -Wvla"
+    dontwarn="$dontwarn -Wundef"
+    dontwarn="$dontwarn -Wcast-qual"
+    dontwarn="$dontwarn -Wlong-long"
+    dontwarn="$dontwarn -Wswitch-default"
+    dontwarn="$dontwarn -Wswitch-enum"
+    dontwarn="$dontwarn -Wstrict-overflow"
+    dontwarn="$dontwarn -Wunsafe-loop-optimizations"
+    dontwarn="$dontwarn -Wformat-nonliteral"
+    dontwarn="$dontwarn -Wfloat-equal"
+    dontwarn="$dontwarn -Wdeclaration-after-statement"
+    dontwarn="$dontwarn -Wcast-qual"
+    dontwarn="$dontwarn -Wconversion"
+    dontwarn="$dontwarn -Wsign-conversion"
+    dontwarn="$dontwarn -Wpacked"
+    dontwarn="$dontwarn -Wunused-macros"
+    dontwarn="$dontwarn -Woverlength-strings"
+    dontwarn="$dontwarn -Wstack-protector"
+    dontwarn="$dontwarn -Winline"
+    dontwarn="$dontwarn -Wbad-function-cast"
+    dontwarn="$dontwarn -Wshadow"
+
+    # We want to enable thse, but need to sort out the
+    # decl mess with  gtk/generated_*.c
+    dontwarn="$dontwarn -Wmissing-prototypes"
+    dontwarn="$dontwarn -Wmissing-declarations"
+
+    # Get all possible GCC warnings
+    gl_MANYWARN_ALL_GCC([maybewarn])
+
+    # Remove the ones we don't want, blacklisted earlier
+    gl_MANYWARN_COMPLEMENT([wantwarn], [$maybewarn], [$dontwarn])
+
+    # Check for $CC support of each warning
+    for w in $wantwarn; do
+      gl_WARN_ADD([$w])
+    done
+
+    # GNULIB uses '-W' (aka -Wextra) which includes a bunch of stuff.
+    # Unfortunately, this means you can't simply use '-Wsign-compare'
+    # with gl_MANYWARN_COMPLEMENT
+    # So we have -W enabled, and then have to explicitly turn off...
+    gl_WARN_ADD([-Wno-sign-compare])
+    gl_WARN_ADD([-Wno-unused-parameter])
+    # We can't enable this due to horrible spice_usb_device_get_description
+    # signature
+    gl_WARN_ADD([-Wno-format-nonliteral])
+
+
+
+    # GNULIB expects this to be part of -Wc++-compat, but we turn
+    # that one off, so we need to manually enable this again
+    gl_WARN_ADD([-Wjump-misses-init])
+
+    # GNULIB turns on -Wformat=2 which implies -Wformat-nonliteral,
+    # so we need to manually re-exclude it.
+    gl_WARN_ADD([-Wno-format-nonliteral])
+
+    # This should be < 1024 really. pixman_utils is the blackspot
+    # preventing lower usage
+    gl_WARN_ADD([-Wframe-larger-than=1152])
+
+    # Use improved glibc headers
+    AC_DEFINE([_FORTIFY_SOURCE], [2],
+      [enable compile-time and run-time bounds-checking, and some warnings])
+
+    # Extra special flags
+    dnl -fstack-protector stuff passes gl_WARN_ADD with gcc
+    dnl on Mingw32, but fails when actually used
+    case $host in
+       *-*-linux*)
+       dnl Fedora only uses -fstack-protector, but doesn't seem to
+       dnl be great overhead in adding -fstack-protector-all instead
+       dnl gl_WARN_ADD([-fstack-protector])
+       gl_WARN_ADD([-fstack-protector-all])
+       gl_WARN_ADD([--param=ssp-buffer-size=4])
+       ;;
+    esac
+    gl_WARN_ADD([-fexceptions])
+    gl_WARN_ADD([-fasynchronous-unwind-tables])
+    gl_WARN_ADD([-fdiagnostics-show-option])
+    gl_WARN_ADD([-funit-at-a-time])
+
+    # Need -fipa-pure-const in order to make -Wsuggest-attribute=pure
+    # fire even without -O.
+    gl_WARN_ADD([-fipa-pure-const])
+
+    # We should eventually enable this, but right now there are at
+    # least 75 functions triggering warnings.
+    gl_WARN_ADD([-Wno-suggest-attribute=pure])
+    gl_WARN_ADD([-Wno-suggest-attribute=const])
+
+    if test "$set_werror" = "yes"
+    then
+      gl_WARN_ADD([-Werror])
+    fi
+
+    WARN_LDFLAGS=$WARN_CFLAGS
+    AC_SUBST([WARN_CFLAGS])
+    AC_SUBST([WARN_LDFLAGS])
+])
diff --git a/m4/warnings.m4 b/m4/warnings.m4
new file mode 100644
index 0000000..69d05a6
--- /dev/null
+++ b/m4/warnings.m4
@@ -0,0 +1,37 @@
+# warnings.m4 serial 5
+dnl Copyright (C) 2008-2012 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_WARN_ADD(PARAMETER, [VARIABLE = WARN_CFLAGS])
+# ------------------------------------------------
+# Adds parameter to WARN_CFLAGS if the compiler supports it.  For example,
+# gl_WARN_ADD([-Wparentheses]).
+AC_DEFUN([gl_WARN_ADD],
+dnl FIXME: gl_Warn must be used unquoted until we can assume
+dnl autoconf 2.64 or newer.
+[AS_VAR_PUSHDEF([gl_Warn], [gl_cv_warn_$1])dnl
+AC_CACHE_CHECK([whether compiler handles $1], m4_defn([gl_Warn]), [
+  gl_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="${CPPFLAGS} $1"
+  AC_PREPROC_IFELSE([AC_LANG_PROGRAM([])],
+                    [AS_VAR_SET(gl_Warn, [yes])],
+                    [AS_VAR_SET(gl_Warn, [no])])
+  CPPFLAGS="$gl_save_CPPFLAGS"
+])
+AS_VAR_IF(gl_Warn, [yes],
+  [gl_AS_VAR_APPEND(m4_if([$2], [], [[WARN_CFLAGS]], [[$2]]), [" $1"])])
+AS_VAR_POPDEF([gl_Warn])dnl
+m4_ifval([$2], [AS_LITERAL_IF([$2], [AC_SUBST([$2])], [])])dnl
+])
-- 
1.7.7.6



More information about the Spice-devel mailing list