#!/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"

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
       ;;




          -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
