0
|
1 #! /bin/sh
|
|
2 #
|
|
3 # Check that the warning flags documented in invoke.texi match up
|
|
4 # with what the compiler accepts.
|
|
5 #
|
|
6 # Copyright (C) 2008, 2009 Free Software Foundation, Inc.
|
|
7 # Written by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
|
|
8 #
|
|
9 # This script is Free Software, and it can be copied, distributed and
|
|
10 # modified as defined in the GNU General Public License. A copy of
|
|
11 # its license can be downloaded from http://www.gnu.org/copyleft/gpl.html
|
|
12 #
|
|
13 # Call this script as
|
|
14 # check_warning_flags.sh path/to/invoke.texi
|
|
15 # with CC set to the compiler to be tested.
|
|
16 # The script scribbles in the current directory.
|
|
17
|
|
18 progname=`echo "$0" | sed 's,.*/,,'`
|
|
19 usage ()
|
|
20 {
|
|
21 echo "usage: $progname path/to/gcc/doc"
|
|
22 echo "set \$CC to the compiler to be checked"
|
|
23 exit 1
|
|
24 }
|
|
25
|
|
26 ret=0
|
|
27 LC_ALL=C
|
|
28 export LC_ALL
|
|
29 : ${CC=gcc}
|
|
30 test $# = 1 || usage
|
|
31 gcc_docdir=$1
|
|
32 invoke_texi=$gcc_docdir/invoke.texi
|
|
33 test -r "$invoke_texi" || {
|
|
34 echo "$progname: error: cannot read '$invoke_texi'" >&2
|
|
35 usage
|
|
36 }
|
|
37 filebase=check_warning_flags_file$$
|
|
38 stderr=check_warning_flags_stderr$$
|
|
39
|
|
40 remove_problematic_flags='
|
|
41 /-Wlarger-than-/d
|
|
42 /-Wframe-larger-than/d
|
|
43 /-Wdisallowed-function-list/d
|
|
44 /-W[alp],/d
|
|
45 /-Werror/d
|
|
46 /-Wpadded/d
|
|
47 /pedantic-ms-format/d
|
|
48 /=/d'
|
|
49
|
|
50 # Ensure that indexed warnings are accepted.
|
|
51 set x `sed '/^@opindex W/{
|
|
52 s/^@opindex /-/
|
|
53 '"$remove_problematic_flags"'
|
|
54 /-W[alp]$/d
|
|
55 p
|
|
56 }
|
|
57 d' <"$invoke_texi"`
|
|
58 shift
|
|
59 : >$filebase.c
|
|
60 $CC -c $filebase.c "$@" 2>&1 |
|
|
61 grep -v 'command line option.*is valid for.*but not for' >$stderr
|
|
62 if test -s $stderr; then
|
|
63 echo "options listed in @opindex but not accepted by the compiler:" >&2
|
|
64 cat $stderr >&2
|
|
65 ret=1
|
|
66 fi
|
|
67 rm -f $filebase.c $stderr
|
|
68
|
|
69 # Check documentation of warning options.
|
|
70 for lang in c c++ objc obj-c++; do
|
|
71 case $lang in
|
|
72 c) ext=c; langmatch='[^-]C[^+].*only' ;;
|
|
73 c++) ext=C; langmatch='[^-]C++.*only' ;;
|
|
74 objc) ext=m; langmatch='Objective-C[^+].*only' ;;
|
|
75 obj-c++) ext=M; langmatch='Objective-C++.*only' ;;
|
|
76 esac
|
|
77 file=$filebase.$ext
|
|
78 : >$file
|
|
79 $CC -c $file 2>$stderr
|
|
80 if grep 'not installed on this system' $stderr >/dev/null ||
|
|
81 grep 'installation problem, cannot exec' $stderr >/dev/null ||
|
|
82 grep 'error trying to exec' $stderr >/dev/null
|
|
83 then
|
|
84 echo "$progname: $CC is not configured for language $lang, skipping checks" >&2
|
|
85 rm -f $file $filebase.o $filebase.obj $stderr
|
|
86 continue
|
|
87 fi
|
|
88
|
|
89 # Verify good warning flags.
|
|
90 set x `sed '
|
|
91 t a
|
|
92 :a
|
|
93 /^@item -W/{
|
|
94 /'"$langmatch"'/b x
|
|
95 / only)/d
|
|
96 b x
|
|
97 }
|
|
98 d
|
|
99 :x
|
|
100 '"$remove_problematic_flags"'
|
|
101 s/^@item //
|
|
102 s/ .*//
|
|
103 ' <"$invoke_texi"`
|
|
104 shift
|
|
105 $CC -c $file -O "$@" 2>$stderr
|
|
106 if test -s $stderr; then
|
|
107 echo failures: >&2
|
|
108 cat $stderr >&2
|
|
109 ret=1
|
|
110 fi
|
|
111
|
|
112 # Verify bad warning flags.
|
|
113 set x `sed '
|
|
114 t a
|
|
115 :a
|
|
116 /^@item -W/{
|
|
117 / only)/!d
|
|
118 /'"$langmatch"'/d
|
|
119 b x
|
|
120 }
|
|
121 d
|
|
122 :x
|
|
123 '"$remove_problematic_flags"'
|
|
124 s/^@item //
|
|
125 s/ .*//
|
|
126 ' <"$invoke_texi"`
|
|
127 shift
|
|
128 $CC -c $file -O "$@" 2>$stderr
|
|
129 # cat $stderr >&2
|
|
130 test $# = `grep 'command line option.*valid.*but not for' <$stderr | wc -l` || {
|
|
131 for warning
|
|
132 do
|
|
133 grep "command line option.*$warning.*valid" <$stderr >&2 ||
|
|
134 echo "valid for $lang but not annotated as such: $warning"
|
|
135 done
|
|
136 ret=1
|
|
137 }
|
|
138 rm -f $file $filebase.o $filebase.obj $stderr
|
|
139 done
|
|
140
|
|
141
|
|
142 remove_problematic_help_flags='
|
|
143 /^W$/d
|
|
144 /^W[alp]$/d
|
|
145 /^Werror-implicit-function-declaration$/d
|
|
146 /^Wsynth$/d
|
|
147 /-$/d
|
|
148 /=/d'
|
|
149 help_flags=`
|
|
150 $CC --help -v 2>/dev/null | tr ' ' '\n' |
|
|
151 sed -n '
|
|
152 b a
|
|
153 :a
|
|
154 s/^-\(W[^<,]*\).*/\1/
|
|
155 t x
|
|
156 d
|
|
157 :x
|
|
158 '"$remove_problematic_help_flags"'
|
|
159 p' | sort -u`
|
|
160 : >$filebase.c
|
|
161 for flag in $help_flags; do
|
|
162 $CC -c $filebase.c -$flag 2>/dev/null || {
|
|
163 echo "warning -$flag not supported" >&2
|
|
164 ret=1
|
|
165 }
|
|
166 grep "@item.*$flag" $gcc_docdir/../*/*.texi >/dev/null || {
|
|
167 # For @item, we are satisfied with either -Wfoo or -Wno-foo.
|
|
168 inverted_flag=`echo "$flag" | sed '
|
|
169 s/^Wno-/W/
|
|
170 t
|
|
171 s/^W/Wno-/'`
|
|
172 grep "@item.*$inverted_flag" $gcc_docdir/../*/*.texi >/dev/null || {
|
|
173 echo "warning -$flag not documented in $gcc_docdir/../*/*.texi" >&2
|
|
174 ret=1
|
|
175 }
|
|
176 }
|
|
177 done
|
|
178 rm -f $filebase.c $filebase.o
|
|
179
|
|
180 exit $ret
|