Add lots of warnings to GNOME_COMPILE_WARNINGS
authorDavid King <amigadave@amigadave.com>
Sat, 28 Jul 2012 14:19:55 +0000 (15:19 +0100)
committerDavid King <amigadave@amigadave.com>
Fri, 2 Nov 2012 16:27:12 +0000 (16:27 +0000)
Following Colin Walters' thread on desktop-devel-list:

https://mail.gnome.org/archives/desktop-devel-list/2012-July/msg00100.html

Add a selection of more strict warnings to the default level of
GNOME_COMPILE_WARNINGS. Check all the warnings by passing them to GCC,
and ignore those which fail. Set the severity of some of the warnings to
errors, so that particularly bad code is rejected (set the warning level
to â€˜minimum’ is you wish to avoid this behaviour). Fixes bug 568546 and
bug 608953.

macros2/gnome-compiler-flags.m4

index b9db2fd..1dbfa1a 100644 (file)
@@ -1,5 +1,6 @@
 dnl GNOME_COMPILE_WARNINGS
-dnl Turn on many useful compiler warnings
+dnl Turn on many useful compiler warnings and substitute the result into
+dnl WARN_CFLAGS
 dnl For now, only works on GCC
 AC_DEFUN([GNOME_COMPILE_WARNINGS],[
     dnl ******************************
@@ -11,7 +12,6 @@ AC_DEFUN([GNOME_COMPILE_WARNINGS],[
                                  [Turn on compiler warnings]),,
                   [enable_compile_warnings="m4_default([$1],[yes])"])
 
-    warnCFLAGS=
     if test "x$GCC" != xyes; then
        enable_compile_warnings=no
     fi
@@ -27,38 +27,40 @@ AC_DEFUN([GNOME_COMPILE_WARNINGS],[
        warning_flags="-Wall"
        ;;
     yes)
-       warning_flags="-Wall -Wmissing-prototypes"
+       warning_flags="-Wall -Wstrict-prototypes -Waggregate-return -Werror=missing-prototypes -Werror=implicit-function-declaration -Werror=pointer-arith -Werror=init-self -Werror=format-security -Werror=format=2 -Werror=missing-include-dirs"
        ;;
     maximum|error)
-       warning_flags="-Wall -Wmissing-prototypes -Wnested-externs -Wpointer-arith"
-       CFLAGS="$warning_flags $CFLAGS"
-       for option in -Wno-sign-compare; do
-               SAVE_CFLAGS="$CFLAGS"
-               CFLAGS="$CFLAGS $option"
-               AC_MSG_CHECKING([whether gcc understands $option])
-               AC_TRY_COMPILE([], [],
-                       has_option=yes,
-                       has_option=no,)
-               CFLAGS="$SAVE_CFLAGS"
-               AC_MSG_RESULT($has_option)
-               if test $has_option = yes; then
-                 warning_flags="$warning_flags $option"
-               fi
-               unset has_option
-               unset SAVE_CFLAGS
-       done
-       unset option
-       if test "$enable_compile_warnings" = "error" ; then
-           warning_flags="$warning_flags -Werror"
-       fi
+       warning_flags="-Wall -Wstrict-prototypes -Waggregate-return -Wdeclaration-after-statement -Werror=missing-prototypes -Werror=implicit-function-declaration -Werror=pointer-arith -Werror=init-self -Werror=format-security -Werror=format=2 -Werror=missing-include-dirs -Wnested-externs -Wno-sign-compare"
        ;;
     *)
        AC_MSG_ERROR(Unknown argument '$enable_compile_warnings' to --enable-compile-warnings)
        ;;
     esac
+
+    if test "$enable_compile_warnings" = "error" ; then
+        warning_flags="$warning_flags -Werror"
+    fi
+
+    dnl Check whether GCC supports the warning options
+    for option in $warning_flags; do
+       save_CFLAGS="$CFLAGS"
+       CFLAGS="$CFLAGS $option"
+       AC_MSG_CHECKING([whether gcc understands $option])
+       AC_TRY_COMPILE([], [],
+           has_option=yes,
+           has_option=no,)
+       CFLAGS="$save_CFLAGS"
+       AC_MSG_RESULT([$has_option])
+       if test $has_option = yes; then
+           tested_warning_flags="$tested_warning_flags $option"
+       fi
+       unset has_option
+       unset save_CFLAGS
+    done
+    unset option
     CFLAGS="$realsave_CFLAGS"
     AC_MSG_CHECKING(what warning flags to pass to the C compiler)
-    AC_MSG_RESULT($warning_flags)
+    AC_MSG_RESULT($tested_warning_flags)
 
     AC_ARG_ENABLE(iso-c,
                   AC_HELP_STRING([--enable-iso-c],
@@ -81,7 +83,7 @@ AC_DEFUN([GNOME_COMPILE_WARNINGS],[
     fi
     AC_MSG_RESULT($complCFLAGS)
 
-    WARN_CFLAGS="$warning_flags $complCFLAGS"
+    WARN_CFLAGS="$tested_warning_flags $complCFLAGS"
     AC_SUBST(WARN_CFLAGS)
 ])