181 lines
4.1 KiB
Bash
Executable File
181 lines
4.1 KiB
Bash
Executable File
#! /bin/sh
|
|
#
|
|
# Check that the warning flags documented in invoke.texi match up
|
|
# with what the compiler accepts.
|
|
#
|
|
# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
|
|
# Written by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
|
|
#
|
|
# This script is Free Software, and it can be copied, distributed and
|
|
# modified as defined in the GNU General Public License. A copy of
|
|
# its license can be downloaded from http://www.gnu.org/copyleft/gpl.html
|
|
#
|
|
# Call this script as
|
|
# check_warning_flags.sh path/to/invoke.texi
|
|
# with CC set to the compiler to be tested.
|
|
# The script scribbles in the current directory.
|
|
|
|
progname=`echo "$0" | sed 's,.*/,,'`
|
|
usage ()
|
|
{
|
|
echo "usage: $progname path/to/gcc/doc"
|
|
echo "set \$CC to the compiler to be checked"
|
|
exit 1
|
|
}
|
|
|
|
ret=0
|
|
LC_ALL=C
|
|
export LC_ALL
|
|
: ${CC=gcc}
|
|
test $# = 1 || usage
|
|
gcc_docdir=$1
|
|
invoke_texi=$gcc_docdir/invoke.texi
|
|
test -r "$invoke_texi" || {
|
|
echo "$progname: error: cannot read '$invoke_texi'" >&2
|
|
usage
|
|
}
|
|
filebase=check_warning_flags_file$$
|
|
stderr=check_warning_flags_stderr$$
|
|
|
|
remove_problematic_flags='
|
|
/-Wlarger-than-/d
|
|
/-Wframe-larger-than/d
|
|
/-Wdisallowed-function-list/d
|
|
/-W[alp],/d
|
|
/-Werror/d
|
|
/-Wpadded/d
|
|
/pedantic-ms-format/d
|
|
/=/d'
|
|
|
|
# Ensure that indexed warnings are accepted.
|
|
set x `sed '/^@opindex W/{
|
|
s/^@opindex /-/
|
|
'"$remove_problematic_flags"'
|
|
/-W[alp]$/d
|
|
p
|
|
}
|
|
d' <"$invoke_texi"`
|
|
shift
|
|
: >$filebase.c
|
|
$CC -c $filebase.c "$@" 2>&1 |
|
|
grep -v 'command line option.*is valid for.*but not for' >$stderr
|
|
if test -s $stderr; then
|
|
echo "options listed in @opindex but not accepted by the compiler:" >&2
|
|
cat $stderr >&2
|
|
ret=1
|
|
fi
|
|
rm -f $filebase.c $stderr
|
|
|
|
# Check documentation of warning options.
|
|
for lang in c c++ objc obj-c++; do
|
|
case $lang in
|
|
c) ext=c; langmatch='[^-]C[^+].*only' ;;
|
|
c++) ext=C; langmatch='[^-]C++.*only' ;;
|
|
objc) ext=m; langmatch='Objective-C[^+].*only' ;;
|
|
obj-c++) ext=M; langmatch='Objective-C++.*only' ;;
|
|
esac
|
|
file=$filebase.$ext
|
|
: >$file
|
|
$CC -c $file 2>$stderr
|
|
if grep 'not installed on this system' $stderr >/dev/null ||
|
|
grep 'installation problem, cannot exec' $stderr >/dev/null ||
|
|
grep 'error trying to exec' $stderr >/dev/null
|
|
then
|
|
echo "$progname: $CC is not configured for language $lang, skipping checks" >&2
|
|
rm -f $file $filebase.o $filebase.obj $stderr
|
|
continue
|
|
fi
|
|
|
|
# Verify good warning flags.
|
|
set x `sed '
|
|
t a
|
|
:a
|
|
/^@item -W/{
|
|
/'"$langmatch"'/b x
|
|
/ only)/d
|
|
b x
|
|
}
|
|
d
|
|
:x
|
|
'"$remove_problematic_flags"'
|
|
s/^@item //
|
|
s/ .*//
|
|
' <"$invoke_texi"`
|
|
shift
|
|
$CC -c $file -O "$@" 2>$stderr
|
|
if test -s $stderr; then
|
|
echo failures: >&2
|
|
cat $stderr >&2
|
|
ret=1
|
|
fi
|
|
|
|
# Verify bad warning flags.
|
|
set x `sed '
|
|
t a
|
|
:a
|
|
/^@item -W/{
|
|
/ only)/!d
|
|
/'"$langmatch"'/d
|
|
b x
|
|
}
|
|
d
|
|
:x
|
|
'"$remove_problematic_flags"'
|
|
s/^@item //
|
|
s/ .*//
|
|
' <"$invoke_texi"`
|
|
shift
|
|
$CC -c $file -O "$@" 2>$stderr
|
|
# cat $stderr >&2
|
|
test $# = `grep 'command line option.*valid.*but not for' <$stderr | wc -l` || {
|
|
for warning
|
|
do
|
|
grep "command line option.*$warning.*valid" <$stderr >&2 ||
|
|
echo "valid for $lang but not annotated as such: $warning"
|
|
done
|
|
ret=1
|
|
}
|
|
rm -f $file $filebase.o $filebase.obj $stderr
|
|
done
|
|
|
|
|
|
remove_problematic_help_flags='
|
|
/^W$/d
|
|
/^W[alp]$/d
|
|
/^Werror-implicit-function-declaration$/d
|
|
/^Wsynth$/d
|
|
/-$/d
|
|
/=/d'
|
|
help_flags=`
|
|
$CC --help -v 2>/dev/null | tr ' ' '\012' |
|
|
sed -n '
|
|
b a
|
|
:a
|
|
s/^-\(W[^<,]*\).*/\1/
|
|
t x
|
|
d
|
|
:x
|
|
'"$remove_problematic_help_flags"'
|
|
p' | sort -u`
|
|
: >$filebase.c
|
|
for flag in $help_flags; do
|
|
$CC -c $filebase.c -$flag 2>/dev/null || {
|
|
echo "warning -$flag not supported" >&2
|
|
ret=1
|
|
}
|
|
grep "@item.*$flag" $gcc_docdir/../*/*.texi >/dev/null || {
|
|
# For @item, we are satisfied with either -Wfoo or -Wno-foo.
|
|
inverted_flag=`echo "$flag" | sed '
|
|
s/^Wno-/W/
|
|
t
|
|
s/^W/Wno-/'`
|
|
grep "@item.*$inverted_flag" $gcc_docdir/../*/*.texi >/dev/null || {
|
|
echo "warning -$flag not documented in $gcc_docdir/../*/*.texi" >&2
|
|
ret=1
|
|
}
|
|
}
|
|
done
|
|
rm -f $filebase.c $filebase.o
|
|
|
|
exit $ret
|