warnings: Add gl_WARN_COMPLEMENT and gl_WARN_SUPPORTED.
[gnulib.git] / m4 / warnings.m4
1 # warnings.m4 serial 1
2 dnl Copyright (C) 2008 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 dnl From Simon Josefsson
8
9 # gl_AS_VAR_IF(VAR, VALUE, [IF-MATCH], [IF-NOT-MATCH])
10 # ----------------------------------------------------
11 # Provide the functionality of AS_VAR_IF if Autoconf does not have it.
12 m4_ifdef([AS_VAR_IF],
13 [m4_copy([AS_VAR_IF], [gl_AS_VAR_IF])],
14 [m4_define([gl_AS_VAR_IF],
15 [AS_IF([test x"AS_VAR_GET([$1])" = x""$2], [$3], [$4])])])
16
17 # gl_AS_VAR_APPEND(VAR, VALUE)
18 # ----------------------------
19 # Provide the functionality of AS_VAR_APPEND if Autoconf does not have it.
20 m4_ifdef([AS_VAR_APPEND],
21 [m4_copy([AS_VAR_APPEND], [gl_AS_VAR_APPEND])],
22 [m4_define([gl_AS_VAR_APPEND],
23 [AS_VAR_SET([$1], [AS_VAR_GET([$1])$2])])])
24
25 # gl_WARN_ADD(PARAMETER, [VARIABLE = WARN_CFLAGS])
26 # ------------------------------------------------
27 # Adds parameter to WARN_CFLAGS if the compiler supports it.  For example,
28 # gl_WARN_ADD([-Wparentheses]).
29 AC_DEFUN([gl_WARN_ADD],
30 [AS_VAR_PUSHDEF([gl_Warn], [gl_cv_warn_$1])dnl
31 AC_CACHE_CHECK([whether compiler handles $1], [gl_Warn], [
32   save_CFLAGS="$CFLAGS"
33   CFLAGS="${CFLAGS} $1"
34   AC_PREPROC_IFELSE([AC_LANG_PROGRAM([])],
35                     [AS_VAR_SET([gl_Warn], [yes])],
36                     [AS_VAR_SET([gl_Warn], [no])])
37   CFLAGS="$save_CFLAGS"
38 ])
39 AS_VAR_PUSHDEF([gl_Flags], m4_if([$2], [], [[WARN_CFLAGS]], [[$2]]))dnl
40 gl_AS_VAR_IF([gl_Warn], [yes], [gl_AS_VAR_APPEND([gl_Flags], [" $1"])])
41 AS_VAR_POPDEF([gl_Flags])dnl
42 AS_VAR_POPDEF([gl_Warn])dnl
43 m4_ifval([$2], [AS_LITERAL_IF([$2], [AC_SUBST([$2])], [])])dnl
44 ])
45
46 # gl_WARN_SUPPORTED(VARIABLE)
47 # ----------------------
48 # Add all supported warning parameters to variable VARIABLE
49 # using gl_WARN_ADD.
50 AC_DEFUN([gl_WARN_SUPPORTED],
51 [
52  # List of all supported warning parameters according to GCC 4.3.2 manual.
53  for w in \
54    -Wall \
55    -W \
56    -Wformat-y2k \
57    -Wformat-nonliteral \
58    -Wformat-security \
59    -Winit-self \
60    -Wmissing-include-dirs \
61    -Wswitch-default \
62    -Wswitch-enum \
63    -Wunused \
64    -Wunknown-pragmas \
65    -Wstrict-aliasing \
66    -Wstrict-overflow \
67    -Wsystem-headers \
68    -Wfloat-equal \
69    -Wtraditional \
70    -Wtraditional-conversion \
71    -Wdeclaration-after-statement \
72    -Wundef \
73    -Wshadow \
74    -Wunsafe-loop-optimizations \
75    -Wpointer-arith \
76    -Wbad-function-cast \
77    -Wc++-compat \
78    -Wcast-qual \
79    -Wcast-align \
80    -Wwrite-strings \
81    -Wconversion \
82    -Wsign-conversion \
83    -Wlogical-op \
84    -Waggregate-return \
85    -Wstrict-prototypes \
86    -Wold-style-definition \
87    -Wmissing-prototypes \
88    -Wmissing-declarations \
89    -Wmissing-noreturn \
90    -Wmissing-format-attribute \
91    -Wpacked \
92    -Wpadded \
93    -Wredundant-decls \
94    -Wnested-externs \
95    -Wunreachable-code \
96    -Winline \
97    -Winvalid-pch \
98    -Wlong-long \
99    -Wvla \
100    -Wvolatile-register-var \
101    -Wdisabled-optimization \
102    -Wstack-protector \
103    -Woverlength-strings \
104   ; do
105     gl_WARN_ADD($w, $1)
106   done
107 ])
108
109 # gl_WARN_COMPLEMENT(OUTVAR, LISTVAR, REMOVEVAR)
110 # ----------------------
111 # Copy LISTVAR to OUTVAR except for the entries in REMOVEVAR.
112 # Elements separated by whitespace.  In set logic terms, the function
113 # does OUTVAR = LISTVAR \ REMOVEVAR.
114 AC_DEFUN([gl_WARN_COMPLEMENT],
115 [
116   FOO=
117   set -- "$2"
118   for w in $_; do
119     case "$3" in
120       *" $w "* | *" $w" | "$w "*)
121         ;;
122       *)
123         FOO="$FOO $w"
124         ;;
125     esac
126   done
127   $1=$FOO
128 ])