Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- .gitignore | 1 + Makefile.am | 2 + configure.ac | 3 + m4/manywarnings.m4 | 276 ++++++++++++++++++++++++++++++++++++++++++++ m4/virt-arg.m4 | 154 ++++++++++++++++++++++++ m4/virt-compile-warnings.m4 | 225 ++++++++++++++++++++++++++++++++++++ m4/warnings.m4 | 79 +++++++++++++ src/Makefile.am | 4 +- 8 files changed, 743 insertions(+), 1 deletion(-) create mode 100644 m4/manywarnings.m4 create mode 100644 m4/virt-arg.m4 create mode 100644 m4/virt-compile-warnings.m4 create mode 100644 m4/warnings.m4 diff --git a/.gitignore b/.gitignore index 727877b..95b2271 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ vgcore.* /configure /libvirt-dbus-*.tar.gz /libvirt-dbus.spec +/m4/aclocal\.m4 /stamp-h1 /data/session/org.libvirt.service diff --git a/Makefile.am b/Makefile.am index 065334f..d2c3fc5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,8 @@ SUBDIRS = data src test +ACLOCAL_AMFLAGS = -I m4 + EXTRA_DIST = \ $(PACKAGE).spec \ $(PACKAGE).spec.in \ diff --git a/configure.ac b/configure.ac index 4c654fa..4c96fbe 100644 --- a/configure.ac +++ b/configure.ac @@ -3,6 +3,7 @@ AC_INIT([libvirt-dbus], [0.0.1], [libvir-list@xxxxxxxxxx], [], [http://libvirt.o AC_CONFIG_SRCDIR(src/main.c) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_MACRO_DIR([m4]) dnl Make automake keep quiet about wildcards & other GNUmake-isms AM_INIT_AUTOMAKE([foreign -Wno-portability]) AC_CANONICAL_HOST @@ -35,6 +36,8 @@ AM_PROG_CC_C_O PKG_CHECK_MODULES(LIBVIRT, libvirt >= $LIBVIRT_REQUIRED) PKG_CHECK_MODULES(SYSTEMD, libsystemd >= $SYSTEMD_REQUIRED) +LIBVIRT_COMPILE_WARNINGS + AC_ARG_WITH(dbus-services, [AC_HELP_STRING([--with-dbus-services=<dir>], [where D-BUS session services directory is])]) diff --git a/m4/manywarnings.m4 b/m4/manywarnings.m4 new file mode 100644 index 0000000..0f06ade --- /dev/null +++ b/m4/manywarnings.m4 @@ -0,0 +1,276 @@ +# manywarnings.m4 serial 8 +dnl Copyright (C) 2008-2017 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 for some issues that only occur when combining multiple + dnl gcc warning categories. + AC_REQUIRE([AC_PROG_CC]) + if test -n "$GCC"; then + + dnl Check if -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( + [[int f (void) + { + typedef struct { int a; int b; } s_t; + s_t s1 = { 0, }; + return s1.b; + } + ]], + [[]])], + [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 + + dnl Next, check if -Werror -Wuninitialized is useful with the + dnl user's choice of $CFLAGS; some versions of gcc warn that it + dnl has no effect if -O is not also used + AC_MSG_CHECKING([whether -Wuninitialized is supported]) + AC_CACHE_VAL([gl_cv_cc_uninitialized_supported], [ + gl_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror -Wuninitialized" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [gl_cv_cc_uninitialized_supported=yes], + [gl_cv_cc_uninitialized_supported=no]) + CFLAGS="$gl_save_CFLAGS"]) + AC_MSG_RESULT([$gl_cv_cc_uninitialized_supported]) + + fi + + # List all gcc warning categories. + # To compare this list to your installed GCC's, run this Bash command: + # + # comm -3 \ + # <(sed -n 's/^ *\(-[^ ]*\) .*/\1/p' manywarnings.m4 | sort) \ + # <(gcc --help=warnings | sed -n 's/^ \(-[^ ]*\) .*/\1/p' | sort | + # grep -v -x -f <( + # awk '/^[^#]/ {print $1}' ../build-aux/gcc-warning.spec)) + + gl_manywarn_set= + for gl_manywarn_item in \ + -fno-common \ + -W \ + -Wabi \ + -Waddress \ + -Waggressive-loop-optimizations \ + -Wall \ + -Wattributes \ + -Wbad-function-cast \ + -Wbool-compare \ + -Wbuiltin-macro-redefined \ + -Wcast-align \ + -Wchar-subscripts \ + -Wchkp \ + -Wclobbered \ + -Wcomment \ + -Wcomments \ + -Wcoverage-mismatch \ + -Wcpp \ + -Wdate-time \ + -Wdeprecated \ + -Wdeprecated-declarations \ + -Wdesignated-init \ + -Wdisabled-optimization \ + -Wdiscarded-array-qualifiers \ + -Wdiscarded-qualifiers \ + -Wdiv-by-zero \ + -Wdouble-promotion \ + -Wduplicated-cond \ + -Wempty-body \ + -Wendif-labels \ + -Wenum-compare \ + -Wextra \ + -Wformat-contains-nul \ + -Wformat-extra-args \ + -Wformat-nonliteral \ + -Wformat-security \ + -Wformat-signedness \ + -Wformat-y2k \ + -Wformat-zero-length \ + -Wframe-address \ + -Wfree-nonheap-object \ + -Whsa \ + -Wignored-attributes \ + -Wignored-qualifiers \ + -Wimplicit \ + -Wimplicit-function-declaration \ + -Wimplicit-int \ + -Wincompatible-pointer-types \ + -Winit-self \ + -Winline \ + -Wint-conversion \ + -Wint-to-pointer-cast \ + -Winvalid-memory-model \ + -Winvalid-pch \ + -Wjump-misses-init \ + -Wlogical-not-parentheses \ + -Wlogical-op \ + -Wmain \ + -Wmaybe-uninitialized \ + -Wmemset-transposed-args \ + -Wmisleading-indentation \ + -Wmissing-braces \ + -Wmissing-declarations \ + -Wmissing-field-initializers \ + -Wmissing-include-dirs \ + -Wmissing-parameter-type \ + -Wmissing-prototypes \ + -Wmultichar \ + -Wnarrowing \ + -Wnested-externs \ + -Wnonnull \ + -Wnonnull-compare \ + -Wnull-dereference \ + -Wodr \ + -Wold-style-declaration \ + -Wold-style-definition \ + -Wopenmp-simd \ + -Woverflow \ + -Woverlength-strings \ + -Woverride-init \ + -Wpacked \ + -Wpacked-bitfield-compat \ + -Wparentheses \ + -Wpointer-arith \ + -Wpointer-sign \ + -Wpointer-to-int-cast \ + -Wpragmas \ + -Wreturn-local-addr \ + -Wreturn-type \ + -Wscalar-storage-order \ + -Wsequence-point \ + -Wshadow \ + -Wshift-count-negative \ + -Wshift-count-overflow \ + -Wshift-negative-value \ + -Wsizeof-array-argument \ + -Wsizeof-pointer-memaccess \ + -Wstack-protector \ + -Wstrict-aliasing \ + -Wstrict-overflow \ + -Wstrict-prototypes \ + -Wsuggest-attribute=const \ + -Wsuggest-attribute=format \ + -Wsuggest-attribute=noreturn \ + -Wsuggest-attribute=pure \ + -Wsuggest-final-methods \ + -Wsuggest-final-types \ + -Wswitch \ + -Wswitch-bool \ + -Wswitch-default \ + -Wsync-nand \ + -Wsystem-headers \ + -Wtautological-compare \ + -Wtrampolines \ + -Wtrigraphs \ + -Wtype-limits \ + -Wuninitialized \ + -Wunknown-pragmas \ + -Wunsafe-loop-optimizations \ + -Wunused \ + -Wunused-but-set-parameter \ + -Wunused-but-set-variable \ + -Wunused-function \ + -Wunused-label \ + -Wunused-local-typedefs \ + -Wunused-macros \ + -Wunused-parameter \ + -Wunused-result \ + -Wunused-value \ + -Wunused-variable \ + -Wvarargs \ + -Wvariadic-macros \ + -Wvector-operation-performance \ + -Wvla \ + -Wvolatile-register-var \ + -Wwrite-strings \ + \ + ; do + gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item" + done + + # gcc --help=warnings outputs an unusual form for these options; list + # them here so that the above 'comm' command doesn't report a false match. + gl_manywarn_set="$gl_manywarn_set -Warray-bounds=2" + gl_manywarn_set="$gl_manywarn_set -Wnormalized=nfc" + gl_manywarn_set="$gl_manywarn_set -Wshift-overflow=2" + gl_manywarn_set="$gl_manywarn_set -Wunused-const-variable=2" + + # These are needed for older GCC versions. + if test -n "$GCC"; then + case `($CC --version) 2>/dev/null` in + 'gcc (GCC) '[[0-3]].* | \ + 'gcc (GCC) '4.[[0-7]].*) + gl_manywarn_set="$gl_manywarn_set -fdiagnostics-show-option" + gl_manywarn_set="$gl_manywarn_set -funit-at-a-time" + ;; + esac + fi + + # Disable specific options as needed. + if test "$gl_cv_cc_nomfi_needed" = yes; then + gl_manywarn_set="$gl_manywarn_set -Wno-missing-field-initializers" + fi + + if test "$gl_cv_cc_uninitialized_supported" = no; then + gl_manywarn_set="$gl_manywarn_set -Wno-uninitialized" + fi + + $1=$gl_manywarn_set +]) diff --git a/m4/virt-arg.m4 b/m4/virt-arg.m4 new file mode 100644 index 0000000..d626d72 --- /dev/null +++ b/m4/virt-arg.m4 @@ -0,0 +1,154 @@ +dnl +dnl virt-arg.m4: Helper macros for adding configure arguments +dnl +dnl Copyright (C) 2012-2014 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 + + +dnl +dnl To be used instead of AC_ARG_WITH +dnl +dnl See LIBVIRT_ARG_WITH_FEATURE if the argument you're adding is going to +dnl be used for switching a feature on and off. +dnl +dnl LIBVIRT_ARG_WITH([CHECK_NAME], [HELP_DESC], [DEFAULT_ACTION]) +dnl +dnl CHECK_NAME: Suffix/prefix used for variables/flags, in uppercase. +dnl HELP_DESC: Description that will appear in configure --help +dnl DEFAULT_ACTION: Default configure action +dnl +dnl LIBVIRT_ARG_WITH([PACKAGER], [Extra packager name], [no]) +dnl LIBVIRT_ARG_WITH([HTML_DIR], [path to base html directory], [$(datadir)/doc]) +dnl +AC_DEFUN([LIBVIRT_ARG_WITH], [ + m4_pushdef([check_name], [$1]) + m4_pushdef([help_desc], [[$2]]) + m4_pushdef([default_action], [$3]) + + m4_pushdef([check_name_lc], m4_tolower(check_name)) + m4_pushdef([check_name_dash], m4_translit(check_name_lc, [_], [-])) + + m4_pushdef([arg_var], [with-]check_name_dash) + m4_pushdef([with_var], [with_]check_name_lc) + + m4_divert_text([DEFAULTS], [with_var][[=]][default_action]) + AC_ARG_WITH([check_name_lc], + [AS_HELP_STRING([[--]arg_var], + ]m4_dquote(help_desc)[[ @<:@default=]]m4_dquote(default_action)[[@:>@])]) + + m4_popdef([with_var]) + m4_popdef([arg_var]) + + m4_popdef([check_name_dash]) + m4_popdef([check_name_lc]) + + m4_popdef([default_action]) + m4_popdef([help_desc]) + m4_popdef([check_name]) +]) + +dnl +dnl To be used instead of AC_ARG_WITH +dnl +dnl The difference between LIBVIRT_ARG_WITH and this macro is that the former +dnl is mostly an enhanced drop-in replacement for AC_ARG_WITH, whereas the +dnl latter is tailored for adding an argument that is going to be used to +dnl switch a feature on and off: as a consequence, it optionally supports +dnl specifying the minimum version for libraries the feature depends on and +dnl automatically builds a suitable description from the feature name. +dnl +dnl LIBVIRT_ARG_WITH_FEATURE([CHECK_NAME], [HELP_NAME], [DEFAULT_ACTION], [MIN_VERSION]) +dnl +dnl CHECK_NAME: Suffix/prefix used for variables/flags, in uppercase. +dnl HELP_NAME: Name that will appear in configure --help +dnl DEFAULT_ACTION: Default configure action +dnl MIN_VERSION: Specify minimal version that will be added to +dnl configure --help (optional) +dnl +dnl LIBVIRT_ARG_WITH_FEATURE([SELINUX], [SeLinux], [check]) +dnl LIBVIRT_ARG_WITH_FEATURE([GLUSTERFS], [glusterfs], [check], [3.4.1]) +dnl +AC_DEFUN([LIBVIRT_ARG_WITH_FEATURE], [ + m4_pushdef([check_name], [$1]) + m4_pushdef([help_name], [[$2]]) + m4_pushdef([default_action], [$3]) + m4_pushdef([min_version], [$4]) + + m4_pushdef([check_name_lc], m4_tolower(check_name)) + m4_pushdef([check_name_dash], m4_translit(check_name_lc, [_], [-])) + + m4_pushdef([arg_var], [with-]check_name_dash) + m4_pushdef([with_var], [with_]check_name_lc) + + m4_pushdef([version_text], m4_ifnblank(min_version, [[ (>= ]]min_version[[)]])) + + m4_divert_text([DEFAULTS], [with_var][[=]][default_action]) + AC_ARG_WITH([check_name_lc], + [AS_HELP_STRING([[--]arg_var], + [with ]]m4_dquote(help_name)m4_dquote(version_text)[[ support @<:@default=]]m4_dquote(default_action)[[@:>@])]) + + m4_popdef([version_text]) + + m4_popdef([with_var]) + m4_popdef([arg_var]) + + m4_popdef([check_name_dash]) + m4_popdef([check_name_lc]) + + m4_popdef([min_version]) + m4_popdef([default_action]) + m4_popdef([help_name]) + m4_popdef([check_name]) +]) + +dnl +dnl To be used instead of AC_ARG_ENABLE +dnl +dnl LIBVIRT_ARG_ENABLE([CHECK_NAME], [HELP_DESC], [DEFAULT_ACTION]) +dnl +dnl CHECK_NAME: Suffix/prefix used for variables/flags, in uppercase. +dnl HELP_DESC: Description that will appear in configure --help +dnl DEFAULT_ACTION: Default configure action +dnl +dnl LIBVIRT_ARG_ENABLE([DEBUG], [enable debugging output], [yes]) +dnl +AC_DEFUN([LIBVIRT_ARG_ENABLE], [ + m4_pushdef([check_name], [$1]) + m4_pushdef([help_desc], [[$2]]) + m4_pushdef([default_action], [$3]) + + m4_pushdef([check_name_lc], m4_tolower(check_name)) + m4_pushdef([check_name_dash], m4_translit(check_name_lc, [_], [-])) + + m4_pushdef([arg_var], [enable-]check_name_dash) + m4_pushdef([enable_var], [enable_]check_name_lc) + + m4_divert_text([DEFAULTS], [enable_var][[=]][default_action]) + AC_ARG_ENABLE([check_name_lc], + [AS_HELP_STRING([[--]arg_var], + ]m4_dquote(help_desc)[[ @<:@default=]]m4_dquote(default_action)[[@:>@])]) + + m4_popdef([enable_var]) + m4_popdef([arg_var]) + + m4_popdef([check_name_dash]) + m4_popdef([check_name_lc]) + + m4_popdef([default_action]) + m4_popdef([help_desc]) + m4_popdef([check_name]) +]) diff --git a/m4/virt-compile-warnings.m4 b/m4/virt-compile-warnings.m4 new file mode 100644 index 0000000..4d96a0e --- /dev/null +++ b/m4/virt-compile-warnings.m4 @@ -0,0 +1,225 @@ +dnl +dnl Enable all known GCC compiler warnings, except for those +dnl we can't yet cope with +dnl +AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[ + dnl ****************************** + dnl More compiler warnings + dnl ****************************** + + LIBVIRT_ARG_ENABLE([WERROR], [Use -Werror (if supported)], [check]) + if test "$enable_werror" = "check"; then + if test -d $srcdir/.git; then + is_git_version=true + enable_werror=yes + else + enable_werror=no + fi + 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" + # 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" + # Gnulib's stat-time.h violates this + dontwarn="$dontwarn -Waggregate-return" + # gcc 4.4.6 complains this is C++ only; gcc 4.7.0 implies this from -Wall + dontwarn="$dontwarn -Wenum-compare" + # gcc 5.1 -Wformat-signedness mishandles enums, not ready for prime time + dontwarn="$dontwarn -Wformat-signedness" + # Several conditionals expand the same on both branches + # depending on the particular platform/architecture + dontwarn="$dontwarn -Wduplicated-branches" + # > This warning does not generally indicate that there is anything wrong + # > with your code; it merely indicates that GCC's optimizers are unable + # > to handle the code effectively. + # Source: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html + dontwarn="$dontwarn -Wdisabled-optimization" + + # gcc 4.2 treats attribute(format) as an implicit attribute(nonnull), + # which triggers spurious warnings for our usage + AC_CACHE_CHECK([whether the C compiler's -Wformat allows NULL strings], + [lv_cv_gcc_wformat_null_works], [ + save_CFLAGS=$CFLAGS + CFLAGS='-Wunknown-pragmas -Werror -Wformat' + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include <stddef.h> + static __attribute__ ((__format__ (__printf__, 1, 2))) int + foo (const char *fmt, ...) { return !fmt; } + ]], [[ + return foo(NULL); + ]])], + [lv_cv_gcc_wformat_null_works=yes], + [lv_cv_gcc_wformat_null_works=no]) + CFLAGS=$save_CFLAGS]) + + AC_CACHE_CHECK([whether gcc gives bogus warnings for -Wlogical-op], + [lv_cv_gcc_wlogical_op_equal_expr_broken], [ + save_CFLAGS="$CFLAGS" + CFLAGS="-O2 -Wlogical-op -Werror" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #define TEST1 1 + #define TEST2 TEST1 + ]], [[ + int test = 0; + return test == TEST1 || test == TEST2;]])], + [lv_cv_gcc_wlogical_op_equal_expr_broken=no], + [lv_cv_gcc_wlogical_op_equal_expr_broken=yes]) + CFLAGS="$save_CFLAGS"]) + + AC_CACHE_CHECK([whether clang gives bogus warnings for -Wdouble-promotion], + [lv_cv_clang_double_promotion_broken], [ + save_CFLAGS="$CFLAGS" + CFLAGS="-O2 -Wdouble-promotion -Werror" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include <math.h> + ]], [[ + float f = 0.0; + return isnan(f);]])], + [lv_cv_clang_double_promotion_broken=no], + [lv_cv_clang_double_promotion_broken=yes]) + CFLAGS="$save_CFLAGS"]) + + if test "$lv_cv_clang_double_promotion_broken" = "yes"; + then + dontwarn="$dontwarn -Wdouble-promotion" + fi + + # 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]) + + # 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... + wantwarn="$wantwarn -Wno-sign-compare" + + # GNULIB expects this to be part of -Wc++-compat, but we turn + # that one off, so we need to manually enable this again + wantwarn="$wantwarn -Wjump-misses-init" + + # GNULIB turns on -Wformat=2 which implies -Wformat-nonliteral, + # so we need to manually re-exclude it. Also, older gcc 4.2 + # added an implied ATTRIBUTE_NONNULL on any parameter marked + # ATTRIBUTE_FMT_PRINT, which causes -Wformat failure on our + # intentional use of virReportError(code, NULL). + wantwarn="$wantwarn -Wno-format-nonliteral" + if test $lv_cv_gcc_wformat_null_works = no; then + wantwarn="$wantwarn -Wno-format" + fi + + # -Wformat enables this by default, and we should keep it, + # but need to rewrite various areas of code first + wantwarn="$wantwarn -Wno-format-truncation" + + # This should be < 256 really. Currently we're down to 4096, + # but using 1024 bytes sized buffers (mostly for virStrerror) + # stops us from going down further + gl_WARN_ADD([-Wframe-larger-than=4096], [STRICT_FRAME_LIMIT_CFLAGS]) + gl_WARN_ADD([-Wframe-larger-than=25600], [RELAXED_FRAME_LIMIT_CFLAGS]) + + # Extra special flags + dnl -fstack-protector stuff passes gl_WARN_ADD with gcc + dnl on Mingw32, but fails when actually used + case $host in + aarch64-*-*) + dnl "error: -fstack-protector not supported for this target [-Werror]" + ;; + *-*-linux*) + dnl Prefer -fstack-protector-strong if it's available. + dnl There doesn't seem to be great overhead in adding + dnl -fstack-protector-all instead of -fstack-protector. + dnl + dnl We also don't need ssp-buffer-size with -all or -strong, + dnl since functions are protected regardless of buffer size. + dnl wantwarn="$wantwarn --param=ssp-buffer-size=4" + wantwarn="$wantwarn -fstack-protector-strong" + ;; + *-*-freebsd*) + dnl FreeBSD ships old gcc 4.2.1 which doesn't handle + dnl -fstack-protector-all well + wantwarn="$wantwarn -fstack-protector" + + wantwarn="$wantwarn -Wno-unused-command-line-argument" + ;; + esac + wantwarn="$wantwarn -fexceptions" + wantwarn="$wantwarn -fasynchronous-unwind-tables" + + # Need -fipa-pure-const in order to make -Wsuggest-attribute=pure + # fire even without -O. + wantwarn="$wantwarn -fipa-pure-const" + + if test "$enable_werror" = "yes" + then + wantwarn="$wantwarn -Werror" + fi + + # Check for $CC support of each warning + for w in $wantwarn; do + gl_WARN_ADD([$w]) + done + + case $host in + *-*-linux*) + dnl Fall back to -fstack-protector-all if -strong is not available + case $WARN_CFLAGS in + *-fstack-protector-strong*) + ;; + *) + gl_WARN_ADD([-fstack-protector-all]) + ;; + esac + ;; + esac + + case $WARN_CFLAGS in + *-Wsuggest-attribute=format*) + AC_DEFINE([HAVE_SUGGEST_ATTRIBUTE_FORMAT], [1], [Whether -Wsuggest-attribute=format works]) + ;; + esac + + # Silence certain warnings in gnulib, and use improved glibc headers + AH_VERBATIM([FORTIFY_SOURCE], + [/* Enable compile-time and run-time bounds-checking, and some warnings, + without upsetting newer glibc. */ + #if !defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__ + # define _FORTIFY_SOURCE 2 + #endif + ]) +]) diff --git a/m4/warnings.m4 b/m4/warnings.m4 new file mode 100644 index 0000000..e697174 --- /dev/null +++ b/m4/warnings.m4 @@ -0,0 +1,79 @@ +# warnings.m4 serial 11 +dnl Copyright (C) 2008-2017 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: diff --git a/src/Makefile.am b/src/Makefile.am index 917c46d..17b4fe1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,7 +18,9 @@ libvirt_dbus_SOURCES = $(DAEMON_SOURCES) libvirt_dbus_CFLAGS = \ $(SYSTEMD_CFLAGS) \ - $(LIBVIRT_CFLAGS) + $(LIBVIRT_CFLAGS) \ + $(WARN_CFLAGS) \ + $(NULL) libvirt_dbus_LDFLAGS = \ $(SYSTEMD_LDFLAGS) \ -- 2.13.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list