From nobody Tue Dec 16 23:55:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1509111180639456.0108124363793; Fri, 27 Oct 2017 06:33:00 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E0A201213D; Fri, 27 Oct 2017 13:32:58 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BA8FB5C548; Fri, 27 Oct 2017 13:32:58 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 835191804488; Fri, 27 Oct 2017 13:32:58 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v9RDVtFW000942 for ; Fri, 27 Oct 2017 09:31:55 -0400 Received: by smtp.corp.redhat.com (Postfix) id A392A60BEB; Fri, 27 Oct 2017 13:31:55 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-204-199.brq.redhat.com [10.40.204.199]) by smtp.corp.redhat.com (Postfix) with ESMTP id C1FC95FCB7; Fri, 27 Oct 2017 13:31:54 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E0A201213D Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: "Daniel P. Berrange" To: libvir-list@redhat.com Date: Fri, 27 Oct 2017 14:31:41 +0100 Message-Id: <20171027133143.2553-4-berrange@redhat.com> In-Reply-To: <20171027133143.2553-1-berrange@redhat.com> References: <20171027133143.2553-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH dbus 3/5] build: turn on all practical compiler warning flags X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 27 Oct 2017 13:32:59 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Daniel P. Berrange --- .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 =20 /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 @@ =20 SUBDIRS =3D data src test =20 +ACLOCAL_AMFLAGS =3D -I m4 + EXTRA_DIST =3D \ $(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@redhat.com], = [], [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 >=3D $LIBVIRT_REQUIRED) PKG_CHECK_MODULES(SYSTEMD, libsystemd >=3D $SYSTEMD_REQUIRED) =20 +LIBVIRT_COMPILE_WARNINGS + AC_ARG_WITH(dbus-services, [AC_HELP_STRING([--with-dbus-services=3D], [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 =3D LISTVAR \ REMOVEVAR. +AC_DEFUN([gl_MANYWARN_COMPLEMENT], +[ + gl_warn_set=3D + set x $2; shift + for gl_warn_item + do + case " $3 " in + *" $gl_warn_item "*) + ;; + *) + gl_warn_set=3D"$gl_warn_set $gl_warn_item" + ;; + esac + done + $1=3D$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=3D"$CFLAGS" + CFLAGS=3D"$CFLAGS -W -Werror -Wno-missing-field-initializers" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [gl_cv_cc_nomfi_supported=3Dyes], + [gl_cv_cc_nomfi_supported=3Dno]) + CFLAGS=3D"$gl_save_CFLAGS"]) + AC_MSG_RESULT([$gl_cv_cc_nomfi_supported]) + + if test "$gl_cv_cc_nomfi_supported" =3D 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=3D"$CFLAGS" + CFLAGS=3D"$CFLAGS -W -Werror" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[int f (void) + { + typedef struct { int a; int b; } s_t; + s_t s1 =3D { 0, }; + return s1.b; + } + ]], + [[]])], + [gl_cv_cc_nomfi_needed=3Dno], + [gl_cv_cc_nomfi_needed=3Dyes]) + CFLAGS=3D"$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=3D"$CFLAGS" + CFLAGS=3D"$CFLAGS -Werror -Wuninitialized" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [gl_cv_cc_uninitialized_supported=3Dyes], + [gl_cv_cc_uninitialized_supported=3Dno]) + CFLAGS=3D"$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=3Dwarnings | sed -n 's/^ \(-[^ ]*\) .*/\1/p' | sort | + # grep -v -x -f <( + # awk '/^[^#]/ {print $1}' ../build-aux/gcc-warning.spec)) + + gl_manywarn_set=3D + 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=3Dconst \ + -Wsuggest-attribute=3Dformat \ + -Wsuggest-attribute=3Dnoreturn \ + -Wsuggest-attribute=3Dpure \ + -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=3D"$gl_manywarn_set $gl_manywarn_item" + done + + # gcc --help=3Dwarnings outputs an unusual form for these options; list + # them here so that the above 'comm' command doesn't report a false matc= h. + gl_manywarn_set=3D"$gl_manywarn_set -Warray-bounds=3D2" + gl_manywarn_set=3D"$gl_manywarn_set -Wnormalized=3Dnfc" + gl_manywarn_set=3D"$gl_manywarn_set -Wshift-overflow=3D2" + gl_manywarn_set=3D"$gl_manywarn_set -Wunused-const-variable=3D2" + + # 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=3D"$gl_manywarn_set -fdiagnostics-show-option" + gl_manywarn_set=3D"$gl_manywarn_set -funit-at-a-time" + ;; + esac + fi + + # Disable specific options as needed. + if test "$gl_cv_cc_nomfi_needed" =3D yes; then + gl_manywarn_set=3D"$gl_manywarn_set -Wno-missing-field-initializers" + fi + + if test "$gl_cv_cc_uninitialized_supported" =3D no; then + gl_manywarn_set=3D"$gl_manywarn_set -Wno-uninitialized" + fi + + $1=3D$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 . +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][[=3D]][default_action]) + AC_ARG_WITH([check_name_lc], + [AS_HELP_STRING([[--]arg_var], + ]m4_dquote(help_desc)[[ @<:@default=3D]]m4_d= quote(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 for= mer +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, [[ (>=3D ]]min_versi= on[[)]])) + + m4_divert_text([DEFAULTS], [with_var][[=3D]][default_action]) + AC_ARG_WITH([check_name_lc], + [AS_HELP_STRING([[--]arg_var], + [with ]]m4_dquote(help_name)m4_dquote(versio= n_text)[[ support @<:@default=3D]]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][[=3D]][default_action]) + AC_ARG_ENABLE([check_name_lc], + [AS_HELP_STRING([[--]arg_var], + ]m4_dquote(help_desc)[[ @<:@default=3D]]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" =3D "check"; then + if test -d $srcdir/.git; then + is_git_version=3Dtrue + enable_werror=3Dyes + else + enable_werror=3Dno + fi + fi + + # List of warnings that are not relevant / wanted + + # Don't care about C++ compiler compat + dontwarn=3D"$dontwarn -Wc++-compat" + dontwarn=3D"$dontwarn -Wabi" + dontwarn=3D"$dontwarn -Wdeprecated" + # Don't care about ancient C standard compat + dontwarn=3D"$dontwarn -Wtraditional" + # Don't care about ancient C standard compat + dontwarn=3D"$dontwarn -Wtraditional-conversion" + # Ignore warnings in /usr/include + dontwarn=3D"$dontwarn -Wsystem-headers" + # Happy for compiler to add struct padding + dontwarn=3D"$dontwarn -Wpadded" + # GCC very confused with -O2 + dontwarn=3D"$dontwarn -Wunreachable-code" + # Too many to deal with + dontwarn=3D"$dontwarn -Wconversion" + # Too many to deal with + dontwarn=3D"$dontwarn -Wsign-conversion" + # GNULIB gettext.h violates + dontwarn=3D"$dontwarn -Wvla" + # Many GNULIB header violations + dontwarn=3D"$dontwarn -Wundef" + # Need to allow bad cast for execve() + dontwarn=3D"$dontwarn -Wcast-qual" + # We need to use long long in many places + dontwarn=3D"$dontwarn -Wlong-long" + # We allow manual list of all enum cases without default: + dontwarn=3D"$dontwarn -Wswitch-default" + # We allow optional default: instead of listing all enum values + dontwarn=3D"$dontwarn -Wswitch-enum" + # Not a problem since we don't use -fstrict-overflow + dontwarn=3D"$dontwarn -Wstrict-overflow" + # Not a problem since we don't use -funsafe-loop-optimizations + dontwarn=3D"$dontwarn -Wunsafe-loop-optimizations" + # Gnulib's stat-time.h violates this + dontwarn=3D"$dontwarn -Waggregate-return" + # gcc 4.4.6 complains this is C++ only; gcc 4.7.0 implies this from -W= all + dontwarn=3D"$dontwarn -Wenum-compare" + # gcc 5.1 -Wformat-signedness mishandles enums, not ready for prime ti= me + dontwarn=3D"$dontwarn -Wformat-signedness" + # Several conditionals expand the same on both branches + # depending on the particular platform/architecture + dontwarn=3D"$dontwarn -Wduplicated-branches" + # > This warning does not generally indicate that there is anything wr= ong + # > with your code; it merely indicates that GCC's optimizers are unab= le + # > to handle the code effectively. + # Source: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html + dontwarn=3D"$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=3D$CFLAGS + CFLAGS=3D'-Wunknown-pragmas -Werror -Wformat' + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + static __attribute__ ((__format__ (__printf__, 1, 2))) int + foo (const char *fmt, ...) { return !fmt; } + ]], [[ + return foo(NULL); + ]])], + [lv_cv_gcc_wformat_null_works=3Dyes], + [lv_cv_gcc_wformat_null_works=3Dno]) + CFLAGS=3D$save_CFLAGS]) + + AC_CACHE_CHECK([whether gcc gives bogus warnings for -Wlogical-op], + [lv_cv_gcc_wlogical_op_equal_expr_broken], [ + save_CFLAGS=3D"$CFLAGS" + CFLAGS=3D"-O2 -Wlogical-op -Werror" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #define TEST1 1 + #define TEST2 TEST1 + ]], [[ + int test =3D 0; + return test =3D=3D TEST1 || test =3D=3D TEST2;]])], + [lv_cv_gcc_wlogical_op_equal_expr_broken=3Dno], + [lv_cv_gcc_wlogical_op_equal_expr_broken=3Dyes]) + CFLAGS=3D"$save_CFLAGS"]) + + AC_CACHE_CHECK([whether clang gives bogus warnings for -Wdouble-promot= ion], + [lv_cv_clang_double_promotion_broken], [ + save_CFLAGS=3D"$CFLAGS" + CFLAGS=3D"-O2 -Wdouble-promotion -Werror" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + ]], [[ + float f =3D 0.0; + return isnan(f);]])], + [lv_cv_clang_double_promotion_broken=3Dno], + [lv_cv_clang_double_promotion_broken=3Dyes]) + CFLAGS=3D"$save_CFLAGS"]) + + if test "$lv_cv_clang_double_promotion_broken" =3D "yes"; + then + dontwarn=3D"$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=3D"$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=3D"$wantwarn -Wjump-misses-init" + + # GNULIB turns on -Wformat=3D2 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=3D"$wantwarn -Wno-format-nonliteral" + if test $lv_cv_gcc_wformat_null_works =3D no; then + wantwarn=3D"$wantwarn -Wno-format" + fi + + # -Wformat enables this by default, and we should keep it, + # but need to rewrite various areas of code first + wantwarn=3D"$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=3D4096], [STRICT_FRAME_LIMIT_CFLAGS]) + gl_WARN_ADD([-Wframe-larger-than=3D25600], [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 [-Werro= r]" + ;; + *-*-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=3D"$wantwarn --param=3Dssp-buffer-size=3D4" + wantwarn=3D"$wantwarn -fstack-protector-strong" + ;; + *-*-freebsd*) + dnl FreeBSD ships old gcc 4.2.1 which doesn't handle + dnl -fstack-protector-all well + wantwarn=3D"$wantwarn -fstack-protector" + + wantwarn=3D"$wantwarn -Wno-unused-command-line-argument" + ;; + esac + wantwarn=3D"$wantwarn -fexceptions" + wantwarn=3D"$wantwarn -fasynchronous-unwind-tables" + + # Need -fipa-pure-const in order to make -Wsuggest-attribute=3Dpure + # fire even without -O. + wantwarn=3D"$wantwarn -fipa-pure-const" + + if test "$enable_werror" =3D "yes" + then + wantwarn=3D"$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=3Dformat*) + AC_DEFINE([HAVE_SUGGEST_ATTRIBUTE_FORMAT], [1], [Whether -Wsugg= est-attribute=3Dformat 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 warning= s, + 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 =3D 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=3D"$1" +case $gl_positive in + -Wno-*) gl_positive=3D-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=3D"$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=3D"$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=3D'-Wunknown-warning-option -Werror'], + [gl_unknown_warnings_are_errors=3D])]) + +# gl_WARN_ADD(OPTION, [VARIABLE =3D WARN_CFLAGS], +# [PROGRAM =3D 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 =3D $(DAEMON_SOURCES) =20 libvirt_dbus_CFLAGS =3D \ $(SYSTEMD_CFLAGS) \ - $(LIBVIRT_CFLAGS) + $(LIBVIRT_CFLAGS) \ + $(WARN_CFLAGS) \ + $(NULL) =20 libvirt_dbus_LDFLAGS =3D \ $(SYSTEMD_LDFLAGS) \ --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list