#!/bin/sh

# gcc      ver. 2.8.1
# egcs gcc ver. 1.1.2
# gcc      ver. 2.95.3
# gcc      ver. 2.95.4
# gcc      ver. 3.0.4
# gcc      ver. 3.1
# gcc      ver. 3.2
# gcc      ver. 3.3
# gcc      ver. 3.4
# gcc      ver. 4.0
GCC_COMMAND=${GCC:-gcc}

UNAME=${CROSS_OS:-`uname`}


add_warn_flags='true'
print_command_line_options="false"

options=''
for opt in ${@}
do
	if [ X"${opt}" = X'--no-warning-options' ]; then
		add_warn_flags='false'
	elif [ X"${opt}" = X'--print-command-line-options' ]; then
		print_command_line_options='true'
	else
		options="${options} ${opt}"
	fi
done


#
# -ansi option
#
if [ X"${add_warn_flags}" = X'true' \
  -a X${UNAME} = X'FreeBSD' ]; then	# XXX
	gcc_ansi_option='-ansi'
else
	gcc_ansi_option=''
fi


#
# -pedantic option
#
if [ ! $add_warn_flags = 'true' \
  -o X${UNAME} = X'Linux' \
  -o X${UNAME} = X'NetBSD' ]; then
	# not available -pedantic option because of warnings in system headers.
	gcc_pedantic_option=''
else
	gcc_pedantic_option='-pedantic'
fi

gcc_version=`LC_ALL=C LANG=C ${GCC_COMMAND} --version`


COMMON_WARN_FLAGS="-Wall \
		   -W \
		   -Wpointer-arith \
		   -Wcast-qual \
		   -Wwrite-strings \
		   -Wconversion \
		   -Wsign-compare \
		  "

NORMAL_VERSION_WARN_FLAGS="-Wcast-align \
			   -Wundef \
			  "

UNDER_2_WARN_FLAGS="-Wid-clash-31 \
		   "

UNDER_33_OR_C_ONLY_WARN_FLAGS="-Wmissing-prototypes \
			      "

UNDER_33_NORMAL_VERSION_OR_C_ONLY_WARN_FLAGS="-Wmissing-prototypes \
					     "

COMMON_C_ONLY_WARN_FLAGS="-Wbad-function-cast \
			  -Wnested-externs \
			  -Wmissing-declarations \
			 "

COMMON_CXX_ONLY_WARN_FLAGS="-Woverloaded-virtual \
			    -Wsign-promo \
			   "

#-Wshadow
#-Weffc++
#-Wfloat-equal
#-Wold-style-cast
#-Wmissing-noreturn
#-Wmissing-format-attribute
#-Wpadded
#-Wunreachable-code


if echo ${gcc_version} | egrep '(3\.[4-9])|(4\.[0-9])' 1> /dev/null; then
	GCCWARNFLAGS="${COMMON_WARN_FLAGS} \
		      ${NORMAL_VERSION_WARN_FLAGS} \
		      ${COMMON_C_ONLY_WARN_FLAGS} \
		      ${UNDER_33_OR_C_ONLY_WARN_FLAGS} \
		      ${UNDER_33_NORMAL_VERSION_OR_C_ONLY_WARN_FLAGS} \
		      -Wredundant-decls \
		      -Wpacked \
		      -Wdisabled-optimization \
		     "
elif echo ${gcc_version} | grep '3\.[123]' 1> /dev/null; then
	GCCWARNFLAGS="${COMMON_WARN_FLAGS} \
		      ${NORMAL_VERSION_WARN_FLAGS} \
		      ${COMMON_C_ONLY_WARN_FLAGS} \
		      ${UNDER_33_OR_C_ONLY_WARN_FLAGS} \
		      ${UNDER_33_NORMAL_VERSION_OR_C_ONLY_WARN_FLAGS} \
		      -Wredundant-decls \
		      -Wpacked \
		      -Wdisabled-optimization \
		     "
elif echo ${gcc_version} | grep '2\.96' 1> /dev/null; then
	# ver. 2.96 (experimental version of gcc)
	GCCWARNFLAGS="${COMMON_WARN_FLAGS} \
		      ${COMMON_C_ONLY_WARN_FLAGS} \
		      ${UNDER_33_OR_C_ONLY_WARN_FLAGS} \
		      ${UNDER_2_WARN_FLAGS} \
		     "
elif echo ${gcc_version} | grep '2\.95\.4' 1> /dev/null; then
	GCCWARNFLAGS="${COMMON_WARN_FLAGS} \
		      ${NORMAL_VERSION_WARN_FLAGS} \
		      ${COMMON_C_ONLY_WARN_FLAGS} \
		      ${COMMON_CXX_ONLY_WARN_FLAGS} \
		      ${UNDER_33_OR_C_ONLY_WARN_FLAGS} \
		      ${UNDER_33_NORMAL_VERSION_OR_C_ONLY_WARN_FLAGS} \
		      ${UNDER_2_WARN_FLAGS} \
		      -Wno-undef \
		      -Wno-long-long \
		     "
		      # -Wundef option is not available
		      # because of warnings in system headers.
else
	GCCWARNFLAGS="${COMMON_WARN_FLAGS} \
		      ${NORMAL_VERSION_WARN_FLAGS} \
		      ${COMMON_C_ONLY_WARN_FLAGS} \
		      ${COMMON_CXX_ONLY_WARN_FLAGS} \
		      ${UNDER_33_OR_C_ONLY_WARN_FLAGS} \
		      ${UNDER_33_NORMAL_VERSION_OR_C_ONLY_WARN_FLAGS} \
		      ${UNDER_2_WARN_FLAGS} \
		     "
fi


exec_command='exec'

if [ X"${print_command_line_options}" = X'true' ]; then
	exec_command='echo'
fi

if [ X"${add_warn_flags}" = X'true' ]; then
	${exec_command} ${GCC_COMMAND} \
			${gcc_ansi_option} ${gcc_pedantic_option} \
			${GCCWARNFLAGS} ${options}
else
	${exec_command} ${GCC_COMMAND} ${options}
fi
