Enable all warnings permanently & default to -Werror for GIT builds

Given that we auto-detect whether each -Wxxxx flag is supported by
GCC, and we are warning-free and use automake silent rules, there
is no compelling reason to allow compile warnings to be disabled.

Replace the --enable-compile-warnings flag with a simpler
--enable-werror flag, which defaults to 'yes' if building
from GIT, or 'no' if building from tar.gz

This helps ensure that everyone writing patches for libvirt will
take care to fix their warning problems before submitting for
review

* autobuild.sh: Force -Werror
* configure.ac: Update for LIBVIRT_COMPILE_WARNINGS macro change
* m4/virt-compile-warnings.m4: Permanently enable all warnings,
  auto-enable Werror for GIT builds
This commit is contained in:
Daniel P. Berrange 2012-03-27 16:47:11 +01:00
parent 3a2fc2770b
commit 851117bd7a
3 changed files with 118 additions and 124 deletions

View File

@ -20,7 +20,7 @@ cd build
../autogen.sh --prefix="$AUTOBUILD_INSTALL_ROOT" \ ../autogen.sh --prefix="$AUTOBUILD_INSTALL_ROOT" \
--enable-test-coverage \ --enable-test-coverage \
--disable-nls \ --disable-nls \
--enable-compile-warnings=error --enable-werror
# If the MAKEFLAGS envvar does not yet include a -j option, # If the MAKEFLAGS envvar does not yet include a -j option,
# add -jN where N depends on the number of processors. # add -jN where N depends on the number of processors.
@ -74,7 +74,7 @@ if [ -x /usr/bin/i686-pc-mingw32-gcc ]; then
--build=$(uname -m)-pc-linux \ --build=$(uname -m)-pc-linux \
--host=i686-pc-mingw32 \ --host=i686-pc-mingw32 \
--prefix="$AUTOBUILD_INSTALL_ROOT/i686-pc-mingw32/sys-root/mingw" \ --prefix="$AUTOBUILD_INSTALL_ROOT/i686-pc-mingw32/sys-root/mingw" \
--enable-compile-warnings=error \ --enable-werror \
--without-libvirtd \ --without-libvirtd \
--without-python --without-python

View File

@ -106,7 +106,7 @@ VERSION_SCRIPT_FLAGS=-Wl,--version-script=
VERSION_SCRIPT_FLAGS="-Wl,-M -Wl," VERSION_SCRIPT_FLAGS="-Wl,-M -Wl,"
AC_MSG_RESULT([$VERSION_SCRIPT_FLAGS]) AC_MSG_RESULT([$VERSION_SCRIPT_FLAGS])
LIBVIRT_COMPILE_WARNINGS([maximum]) LIBVIRT_COMPILE_WARNINGS
AC_MSG_CHECKING([for CPUID instruction]) AC_MSG_CHECKING([for CPUID instruction])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM( AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
@ -2820,7 +2820,7 @@ AC_MSG_NOTICE([])
AC_MSG_NOTICE([Miscellaneous]) AC_MSG_NOTICE([Miscellaneous])
AC_MSG_NOTICE([]) AC_MSG_NOTICE([])
AC_MSG_NOTICE([ Debug: $enable_debug]) AC_MSG_NOTICE([ Debug: $enable_debug])
AC_MSG_NOTICE([ Warnings: $enable_compile_warnings]) AC_MSG_NOTICE([ Use -Werror: $set_werror])
AC_MSG_NOTICE([Warning Flags: $WARN_CFLAGS]) AC_MSG_NOTICE([Warning Flags: $WARN_CFLAGS])
AC_MSG_NOTICE([ Readline: $lv_use_readline]) AC_MSG_NOTICE([ Readline: $lv_use_readline])
AC_MSG_NOTICE([ Python: $with_python]) AC_MSG_NOTICE([ Python: $with_python])

View File

@ -7,139 +7,133 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
dnl More compiler warnings dnl More compiler warnings
dnl ****************************** dnl ******************************
AC_ARG_ENABLE(compile-warnings, AC_ARG_ENABLE([werror],
[AC_HELP_STRING([--enable-compile-warnings=@<:@no/yes/error@:>@], AS_HELP_STRING([--enable-werror], [Use -Werror (if supported)]),
[Turn on compiler warnings])],, [set_werror="$enableval"],
[enable_compile_warnings="m4_default([$1],[yes])"]) [if test -d $srcdir/.git; then
is_git_version=true
set_werror=yes
else
set_werror=no
fi])
case "$enable_compile_warnings" in # List of warnings that are not relevant / wanted
no)
try_compiler_flags=""
;;
yes|minimum|maximum|error)
# 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"
# Too many to deal with
dontwarn="$dontwarn -Wconversion"
# Too many to deal with
dontwarn="$dontwarn -Wsign-conversion"
# GNULIB gettext.h violates
dontwarn="$dontwarn -Wvla"
# Many GNULIB header violations
dontwarn="$dontwarn -Wundef"
# Need to allow bad cast for execve()
dontwarn="$dontwarn -Wcast-qual"
# We need to use long long in many places
dontwarn="$dontwarn -Wlong-long"
# We allow manual list of all enum cases without default:
dontwarn="$dontwarn -Wswitch-default"
# We allow optional default: instead of listing all enum values
dontwarn="$dontwarn -Wswitch-enum"
# Not a problem since we don't use -fstrict-overflow
dontwarn="$dontwarn -Wstrict-overflow"
# Not a problem since we don't use -funsafe-loop-optimizations
dontwarn="$dontwarn -Wunsafe-loop-optimizations"
# Things like virAsprintf mean we can't use this
dontwarn="$dontwarn -Wformat-nonliteral"
# Don't care about C++ compiler compat # We might fundamentally need some of these disabled forever, but
dontwarn="$dontwarn -Wc++-compat" # ideally we'd turn many of them on
dontwarn="$dontwarn -Wabi" dontwarn="$dontwarn -Wfloat-equal"
dontwarn="$dontwarn -Wdeprecated" dontwarn="$dontwarn -Wdeclaration-after-statement"
# Don't care about ancient C standard compat dontwarn="$dontwarn -Wcast-qual"
dontwarn="$dontwarn -Wtraditional" dontwarn="$dontwarn -Wconversion"
# Don't care about ancient C standard compat dontwarn="$dontwarn -Wsign-conversion"
dontwarn="$dontwarn -Wtraditional-conversion" dontwarn="$dontwarn -Wpacked"
# Ignore warnings in /usr/include dontwarn="$dontwarn -Wunused-macros"
dontwarn="$dontwarn -Wsystem-headers" dontwarn="$dontwarn -Woverlength-strings"
# Happy for compiler to add struct padding dontwarn="$dontwarn -Wstack-protector"
dontwarn="$dontwarn -Wpadded"
# GCC very confused with -O2
dontwarn="$dontwarn -Wunreachable-code"
# Too many to deal with
dontwarn="$dontwarn -Wconversion"
# Too many to deal with
dontwarn="$dontwarn -Wsign-conversion"
# GNULIB gettext.h violates
dontwarn="$dontwarn -Wvla"
# Many GNULIB header violations
dontwarn="$dontwarn -Wundef"
# Need to allow bad cast for execve()
dontwarn="$dontwarn -Wcast-qual"
# We need to use long long in many places
dontwarn="$dontwarn -Wlong-long"
# We allow manual list of all enum cases without default:
dontwarn="$dontwarn -Wswitch-default"
# We allow optional default: instead of listing all enum values
dontwarn="$dontwarn -Wswitch-enum"
# Not a problem since we don't use -fstrict-overflow
dontwarn="$dontwarn -Wstrict-overflow"
# Not a problem since we don't use -funsafe-loop-optimizations
dontwarn="$dontwarn -Wunsafe-loop-optimizations"
# Things like virAsprintf mean we can't use this
dontwarn="$dontwarn -Wformat-nonliteral"
# We might fundamentally need some of these disabled forever, but # Get all possible GCC warnings
# ideally we'd turn many of them on gl_MANYWARN_ALL_GCC([maybewarn])
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"
# Get all possible GCC warnings # Remove the ones we don't want, blacklisted earlier
gl_MANYWARN_ALL_GCC([maybewarn]) gl_MANYWARN_COMPLEMENT([wantwarn], [$maybewarn], [$dontwarn])
# Remove the ones we don't want, blacklisted earlier # Check for $CC support of each warning
gl_MANYWARN_COMPLEMENT([wantwarn], [$maybewarn], [$dontwarn]) for w in $wantwarn; do
gl_WARN_ADD([$w])
done
# Check for $CC support of each warning # GNULIB uses '-W' (aka -Wextra) which includes a bunch of stuff.
for w in $wantwarn; do # Unfortunately, this means you can't simply use '-Wsign-compare'
gl_WARN_ADD([$w]) # with gl_MANYWARN_COMPLEMENT
done # So we have -W enabled, and then have to explicitly turn off...
gl_WARN_ADD([-Wno-sign-compare])
# GNULIB uses '-W' (aka -Wextra) which includes a bunch of stuff. # GNULIB expects this to be part of -Wc++-compat, but we turn
# Unfortunately, this means you can't simply use '-Wsign-compare' # that one off, so we need to manually enable this again
# with gl_MANYWARN_COMPLEMENT gl_WARN_ADD([-Wjump-misses-init])
# So we have -W enabled, and then have to explicitly turn off...
gl_WARN_ADD([-Wno-sign-compare])
# GNULIB expects this to be part of -Wc++-compat, but we turn # GNULIB turns on -Wformat=2 which implies -Wformat-nonliteral,
# that one off, so we need to manually enable this again # so we need to manually re-exclude it.
gl_WARN_ADD([-Wjump-misses-init]) gl_WARN_ADD([-Wno-format-nonliteral])
# GNULIB turns on -Wformat=2 which implies -Wformat-nonliteral, # This should be < 256 really. Currently we're down to 4096,
# so we need to manually re-exclude it. # but using 1024 bytes sized buffers (mostly for virStrerror)
gl_WARN_ADD([-Wno-format-nonliteral]) # stops us from going down further
gl_WARN_ADD([-Wframe-larger-than=4096])
dnl gl_WARN_ADD([-Wframe-larger-than=256])
# This should be < 256 really. Currently we're down to 4096, # Silence certain warnings in gnulib, and use improved glibc headers
# but using 1024 bytes sized buffers (mostly for virStrerror) AC_DEFINE([lint], [1],
# stops us from going down further [Define to 1 if the compiler is checking for lint.])
gl_WARN_ADD([-Wframe-larger-than=4096]) AC_DEFINE([_FORTIFY_SOURCE], [2],
dnl gl_WARN_ADD([-Wframe-larger-than=256]) [enable compile-time and run-time bounds-checking, and some warnings])
# Silence certain warnings in gnulib, and use improved glibc headers # Extra special flags
AC_DEFINE([lint], [1], dnl -fstack-protector stuff passes gl_WARN_ADD with gcc
[Define to 1 if the compiler is checking for lint.]) dnl on Mingw32, but fails when actually used
AC_DEFINE([_FORTIFY_SOURCE], [2], case $host in
[enable compile-time and run-time bounds-checking, and some warnings]) *-*-linux*)
dnl Fedora only uses -fstack-protector, but doesn't seem to
# Extra special flags dnl be great overhead in adding -fstack-protector-all instead
dnl -fstack-protector stuff passes gl_WARN_ADD with gcc dnl gl_WARN_ADD([-fstack-protector])
dnl on Mingw32, but fails when actually used gl_WARN_ADD([-fstack-protector-all])
case $host in gl_WARN_ADD([--param=ssp-buffer-size=4])
*-*-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 "$enable_compile_warnings" = "error"
then
gl_WARN_ADD([-Werror])
fi
;;
*)
AC_MSG_ERROR(Unknown argument '$enable_compile_warnings' to --enable-compile-warnings)
;;
esac 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 WARN_LDFLAGS=$WARN_CFLAGS
AC_SUBST([WARN_CFLAGS]) AC_SUBST([WARN_CFLAGS])