#! /usr/bin/env sh
#
#
# $TOG: mdepend.cpp /main/13 1997/06/20 21:12:18 kaleb $
#
#	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]
#
#	Notes:
#
#	The C compiler used can be overridden with the environment
#	variable "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).
#
# $XFree86: xc/config/util/mdepend.cpp,v 3.2 1997/06/29 07:54:20 dawes Exp $

CPPARGS="-Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE  -D_GNU_SOURCE  "
CPPARGS="-traditional $CPPARGS"

CC="cpp $CPPARGS"
if test -x /lib/cpp ; then
    CC="/lib/cpp $CPPARGS"
fi

silent='-'

#TMP=./mdep$$
#- try to put temporary files in system-local /tmp dir
TMP=/tmp/mdep$$
touch $TMP ; retVal=$?
if [ $retVal -eq 0 ] ; then
  if test ! -r $TMP ; then TMP=./mdep$$ ; fi
else
  TMP=./mdep$$
fi
rm -f $TMP
#echo "temp files: $TMP"

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

trap "rm -f ${TMP}*; exit 1" 1 2 15
trap "rm -f ${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

while [ $# != 0 ]
do
    if [ "$endmarker"x != x ] && [ "$endmarker" = "$1" ]; then
	endmarker=""
    else
	case "$1" in
	    -D*|-I*)
		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="-"
			    else
				makefile="$2"
				shift
			    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
			    ;;

			-cpp)
			    CC="$2 $CPPARGS"
			    shift
			    ;;

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

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
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")

	    {
	    ofile = $1
	    sub(/\.[^.]*$/, "'"$objsuffix"'", ofile)
	    print ofile, $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

trap "" 1 2 13 15	# Now we are committed
case "$makefile" in
    $TMPMAKEFILE)
	;;
    *)
	if [ "$append" = "n" ]
	then
	  rm -f $makefile.bak
	  cp $makefile $makefile.bak
	fi
	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 -h > /dev/null 2>&1
  which ed > /dev/null 2>&1
  RETVAL=$?
  if test x"$RETVAL" = x0 ; then
    if [ $verbose = y ]; then echo ' using line editor "ed"' ; fi
    ed $silent $makefile << END_OF_ED_SCRIPT
/^$magic_string/+1,\$d
w
q
END_OF_ED_SCRIPT
  else
    if [ $verbose = y ]; then echo ' using sed command' ; fi
    sed -n "1,/^$magic_string/p" $makefile > $HEAD_MKFILE
    mv $HEAD_MKFILE $makefile
  fi
    echo '' >>$makefile
fi

cat $DEPENDLINES >>$makefile

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

rm -f ${TMP}*
exit 0
