#!/bin/sh
#
#	Do the equivalent of the 'makedepend' program, but do it right.
#
#	Usage:
#
#	makedepend [cpp-flags] [-w width] [-s magic-string] [-f makefile]
#	  [-o object-suffix] [-v] [-a] [-cc compiler] [-d dependencyflag]
#
#	Notes:
#
#	The C compiler used can be overridden with the environment
#	variable "CC" or the command line flag -cc.
#
#	The "-v" switch of the "makedepend" program is not supported.
#
#
#	This script should
#	work on both USG and BSD systems.  However, when System V.4 comes out,
#	USG users will probably have to change "silent" to "-s" instead of
#	"-" (at least, that is what the documentation implies).
#

CC="gcc -E -traditional"

silent='-'

TMP=`pwd`/.mdep$$

rm -rf ${TMP}
if ! mkdir -p ${TMP}; then
  echo "$0: cannot create ${TMP}, exit." >&2
fi

CPPCMD=${TMP}/a
DEPENDLINES=${TMP}/b
TMPMAKEFILE=${TMP}/c
MAGICLINE=${TMP}/d
ARGS=${TMP}/e

trap "rm -rf ${TMP}; exit 1" 1 2 15
trap "rm -rf ${TMP}; exit 0" 1 2 13

echo " \c" > $CPPCMD
if [ `wc -c < $CPPCMD` -eq 1 ]
then
    c="\c"
    n=
else
    c=
    n="-n"
fi

echo $n "$c" >$ARGS

files=
makefile=
magic_string='# DO NOT DELETE'
objsuffix='.o'
width=78
endmarker=""
verbose=n
append=n
compilerlistsdepends=n

while [ $# != 0 ]
do
    if [ "$endmarker"x != x ] && [ "$endmarker" = "$1" ]; then
	endmarker=""
    else
	case "$1" in
	    -D*|-I*|-U*)
		echo $n " '$1'$c" >> $ARGS
		;;

	    -g|-O)	# ignore so we can just pass $(CFLAGS) in
		;;

	    *)
		if [ "$endmarker"x = x ]; then
		    case "$1" in
			-w)
			    width="$2"
			    shift
			    ;;
			-s)
			    magic_string="$2"
			    shift
			    ;;
			-f*)
			    if [ "$1" = "-f-" ]; then
				makefile="-"
			    elif [ "$1" = "-f" ]; then
				makefile="$2"
				shift
			    else
				echo "$1" | sed 's/^\-f//' >${TMP}arg
				makefile="`cat ${TMP}arg`"
				rm -f ${TMP}arg
			    fi
			    ;;
			-o)
			    objsuffix="$2"
			    shift
			    ;;

			--*)
			    echo "$1" | sed 's/^\-\-//' >${TMP}end
			    endmarker="`cat ${TMP}end`"
			    rm -f ${TMP}end
			    if [ "$endmarker"x = x ]; then
				endmarker="--"
			    fi
			    ;;
			-v)
			    verbose="y"
			    ;;

			-a)
			    append="y"
			    ;;

			-cc)
			    CC="$2"
			    shift
			    ;;

			# Flag to tell compiler to output dependencies directly
			# For example, with Sun compilers, -xM or -xM1 or
			# with gcc, -M
		        -d)
			    compilerlistsdepends="y"
			    compilerlistdependsflag="$2"
			    shift
			    ;;

			-*)
			    echo "Unknown option '$1' ignored" 1>&2
			    ;;
			*)
			    files="$files $1"
			    ;;
		    esac
		fi
		;;
	esac
    fi
    shift
done
echo ' $*' >> $ARGS

if [ "$compilerlistsdepends"x = "y"x ] ; then
  CC="$CC $compilerlistdependsflag"
fi

echo "#!/bin/sh" > $CPPCMD
echo "exec $CC `cat $ARGS`" >> $CPPCMD
chmod +x $CPPCMD
rm $ARGS

case "$makefile" in
    '')
	if [ -r makefile ]
	then
	    makefile=makefile
	elif [ -r Makefile ]
	then
	    makefile=Makefile
	else
	    echo 'no makefile or Makefile found' 1>&2
	    exit 1
	fi
	;;
    -)
	makefile=$TMPMAKEFILE
	;;
esac

if [ "$verbose"x = "y"x ]; then
    cat $CPPCMD
fi

echo '' > $DEPENDLINES

if [ "$compilerlistsdepends"x = "y"x ] ; then
    for i in $files
    do
	$CPPCMD $i >> $DEPENDLINES
    done
else
for i in $files
do
    $CPPCMD $i       | sed -n "/^#/s;^;$i ;p"

done   | sed -e 's|/[^/.][^/]*/\.\.||g' -e 's|/\.[^.][^/]*/\.\.||g'     -e 's|"||g' -e 's| \./| |'   | awk '{



	if ($1 != $4  &&  $2 != "#ident" && $2 != "#pragma")
	    {
	    numparts = split( $1, ofileparts, "\." )
	    ofile = ""
	    for ( i = 1; i < numparts; i = i+1 )
		{
		if (i != 1 )
		    ofile = ofile "."
		ofile = ofile ofileparts[i]
		}
	    print ofile "'"$objsuffix"'", $4
	    }
	}'   | sort -u   | awk '


	    {
	    newrec = rec " " $2
	    if ($1 != old1)
		{
		old1 = $1
		if (rec != "")
		    print rec
		rec = $1 ": " $2
		}
	    else if (length (newrec) > '"$width"')
		{
		print rec
		rec = $1 ": " $2
		}
	    else
		rec = newrec
	    }
	END 	    {

	    if (rec != "")
		print rec
	    }'   | egrep -v '^[^:]*:[ 	]*$' >> $DEPENDLINES

fi

trap "" 1 2 13 15	# Now we are committed
case "$makefile" in
    $TMPMAKEFILE)
	;;
    *)
	rm -f $makefile.bak
	cp $makefile $makefile.bak
	echo "Appending dependencies to $makefile"
	;;
esac

#
# If not -a, append the magic string and a blank line so that
# /^$magic_string/+1,\$d can be used to delete everything from after
# the magic string to the end of the file.  Then, append a blank
# line again and then the dependencies.
#
if [ "$append" = "n" ]
then
    cat >> $makefile << END_OF_APPEND

$magic_string

END_OF_APPEND
    ed $silent $makefile << END_OF_ED_SCRIPT
/^$magic_string/+1,\$d
w
q
END_OF_ED_SCRIPT
    echo '' >>$makefile
fi

cat $DEPENDLINES >>$makefile

case "$makefile" in
    $TMPMAKEFILE)
	cat $TMPMAKEFILE
	;;

esac

rm -rf ${TMP}*
exit 0
