From: Christophe CURIS <[email protected]>

This attribute helps the compiler checking the type matching between
arguments and the specification in a printf-like format string, to
avoid invalid output. This attribute is optional, but some compilers
can suggest functions that could have it.

This patch adds the appropriate compiler flags if they are supported when
the source is being compiled with DEBUG enabled.

The patch also introduces a new macro WM_CFLAGS_CHECK_FIRST because in some
cases AX_CFLAGS_GCC_OPTION is not really efficient and in present case it
does not fits the job.

Signed-off-by: Christophe CURIS <[email protected]>
---
 configure.ac          |  6 ++++
 m4/wm_cflags_check.m4 | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+)
 create mode 100644 m4/wm_cflags_check.m4

diff --git a/configure.ac b/configure.ac
index bbcdcbb..81ff837 100644
--- a/configure.ac
+++ b/configure.ac
@@ -129,6 +129,12 @@ AS_IF([test "x$debug" = "xyes"],
      dnl Having more than 1 prototype for a function makes code updates
      dnl more difficult, so try to avoid it
      AX_CFLAGS_GCC_OPTION([-Wredundant-decls])
+     dnl
+     dnl Proper attributes helps the compiler to produce better code
+     WM_CFLAGS_CHECK_FIRST([format attribute suggest],
+         [-Wsuggest-attribute=format  dnl new gcc syntax
+          -Wmissing-format-attribute  dnl old gcc syntax, clang
+         ])
 ], [dnl
      dnl When debug not enabled, we try to avoid some non-necessary
      dnl messages from the compiler
diff --git a/m4/wm_cflags_check.m4 b/m4/wm_cflags_check.m4
new file mode 100644
index 0000000..d46511a
--- /dev/null
+++ b/m4/wm_cflags_check.m4
@@ -0,0 +1,77 @@
+# wm_cflags_check.m4 - Macros to check options for the compiler into CFLAGS
+#
+# Copyright (c) 2013 Christophe CURIS
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
+# WM_CFLAGS_CHECK_FIRST
+# ---------------------
+#
+# For each option provided, check which one is supported and stops when
+# found, adding it to CFLAGS. It extends AX_CFLAGS_GCC_OPTION which does
+# not checks for fallbacks; as a bonus it uses a shared function to
+# produce smaller configure script.
+#
+# Usage: WM_CFLAGS_CHECK_FIRST([message], [option alt_option...])
+#   $1 message: required, message displayed in 'Checking for...'
+#   $2 option_list: list of options, tested in given order
+#
+# The first option that works is added to CFLAGS
+AC_DEFUN([WM_CFLAGS_CHECK_FIRST],
+[AC_REQUIRE([_WM_SHELLFN_CHKCFLAGS])
+m4_define([_wm_optlist], m4_split([$2]))dnl
+AS_VAR_PUSHDEF([VAR], [wm_cv_c_check_compopt[]m4_car(_wm_optlist)])dnl
+m4_define([_wm_trimmed_optlist], m4_join([ ], _wm_optlist))dnl
+AC_CACHE_CHECK([CFLAGS for m4_ifnblank($1,$1,m4_car(_wm_optlist))], VAR,
+  [VAR="no, unknown"
+   for wm_option in _wm_trimmed_optlist ; do
+     AS_IF([wm_fn_c_try_compile_cflag "$wm_option"],
+           [VAR="$wm_option" ; break])
+   done])
+AS_CASE([$VAR],
+  [no,*], [],
+  [AS_IF([echo " $CFLAGS " | grep " $VAR " 2>&1 > /dev/null],
+    [AC_MSG_WARN([option $VAR already present in \$CFLAGS, not appended])],
+    [CFLAGS="$CFLAGS $VAR"]) ])
+AS_VAR_POPDEF([VAR])dnl
+m4_undefine([_wm_optlist])dnl
+m4_undefine([_wm_trimmed_optlist])dnl
+])
+
+
+# _WM_SHELLFN_CHKCFLAGS
+# ---------------------
+# (internal shell function)
+#
+# Create a shell function that tries compiling a simple program with the
+# specified compiler option. Assumes the current compilation language is
+# already set to C
+AC_DEFUN_ONCE([_WM_SHELLFN_CHKCFLAGS],
+[@%:@ wm_fn_c_try_compile_cflag CC_OPTION
+@%:@ -----------------------------------
+@%:@ Try compiling a function using CC_OPTION in the compiler's options
+wm_fn_c_try_compile_cflag ()
+{
+  wm_save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -Werror $[]1"
+  AC_COMPILE_IFELSE(
+    [AC_LANG_PROGRAM([], [])],
+    [wm_retval=0],
+    [wm_retval=1])
+  CFLAGS="$wm_save_CFLAGS"
+  AS_SET_STATUS([$wm_retval])
+}
+])
-- 
1.8.4.rc3


-- 
To unsubscribe, send mail to [email protected].

Reply via email to