#!/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_COMMAND=${GCC:-gcc}

UNAME=${CROSS_OS:-`uname`}


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


#
# -pedantic option
#
if [ 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=`${GCC_COMMAND} --version`


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

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

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

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

UNDER_2_WARN_FLAGS="-Wid-clash-31 \
		   "

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


if echo ${gcc_version} | grep '3\.[123]' 1> /dev/null; then
	GCCWARNFLAGS="${COMMON_WARN_FLAGS} \
		      ${NORMAL_VERSION_WARN_FLAGS} \
		      ${COMMON_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} \
		      ${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_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_2_WARN_FLAGS} \
		     "
fi


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


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