#!/bin/sh 
#
# $Id: gendep.sh,v 1.6 90/02/26 16:41:56 christos Exp $
#
# gendep : Generate dependencies for c programs
#
#	Usage: gendep [-m Makefile] [CFLAGS] <cfiles>
#
# Typical use is to place a line of the form:
#
# depend :
#	gendep ${CFLAGS} ${CFILES}
#
# and the type 'make depend'
#
# $Log:	gendep.sh,v $
# Revision 1.6  90/02/26  16:41:56  christos
# Fixed for c++, and check if we
# are given any source files.
# Also ignore object and assembly files.
# 
# Revision 1.6  90/02/26  16:17:17  christos
# Fixed for c++
# 
# Revision 1.5  89/12/10  13:52:56  christos
# Added gcc stuff..
# 
# Revision 1.4  89/08/28  15:14:29  christos
# Now we ignore sun's inline files.
# 
# Revision 1.3  89/04/03  15:41:27  christos
# Fixed bug with -m flag
# 
# Revision 1.2  89/04/01  01:45:01  christos
# Removed carrot from Makefile string.
# 
# Revision 1.1  89/04/01  01:42:27  christos
# Initial revision
# 
#


#
#	Initialize
#
DEPEND=`basename $0`
CPP=/lib/cpp
CC=/bin/cc
CPLUS=/usr/local/bin/CC
TMP=/tmp
MAKEFILE=Makefile
DEFINE=
UNDEF=
INCLUDE=
CFILELIST=
CPLUSFILELIST=
GCC=/usr/local/bin/gcc
GPLUS=/usr/local/bin/g++

EDDEP=$TMP/depend.$$.eddep
MAKEDEP=$TMP/depend.$$.makedep
TMPFILES="$EDDEP $MAKEDEP"

#
#	Cleanup on death
#
trap "echo $DEPEND: Cleaning up.;rm -f $TMPFILES; exit 1;" 1 2 3 15

#
# 	See if we have enough arguments
#
if [ $# -lt 2 ] 
then
    echo "Usage: $DEPEND [-m <Makefile>] [CFLAGS] <file-list>."
    exit 1
fi

#
# 	Take a guess for type of system
#
RET=`echo -n`
if [ "x$RET" = "x" ]
then
#	BSD type echo
    p='-n'
    q=
#	Are we ultrix??
    MFLAG=`strings $CPP | grep ultrix`
    if [ "x$MFLAG" = "x" ]
    then
	MFLAG=-M		# BSD 4.x
    else
	MFLAG=-Em		# Ultrix
    fi
else
#	SVR type echo
    p=
    q='\c'
    MFLAG='-E -H'
fi
    
#
# If we have gcc we use it!!
#
if [ -r $GCC ]
then
    CC=$GCC
    MFLAG=-M
fi

#
# If we have g++ we use it!!
#
if [ -r $GPLUS ]
then
    CPLUS=$GPLUS
    MFLAG=-M
fi

#
#	Parse arguments
#
NEXT="0"
for i do 
    case $i in
	-D*)	DEFINE="$DEFINE $i";;
	-U*)	UNDEF="$UNDEF $i";;
	-I*)	INCLUDE="$INCLUDE $i";;
	-m)	NEXT="1";;
	-*)	;; # ignore the rest of the cc flags
	*.c)	CFILELIST="$CFILELIST $i";;
	*.C)	CPLUSFILELIST="$CPLUSFILELIST $i";;
	*.cc)	CPLUSFILELIST="$CPLUSFILELIST $i";;
	*.il)	;; # ignore sun's inline files
	*.s)   	;; # ignore assembly files
	*.o)   	;; # ignore object files
	*)	if [ $NEXT = "1" ]
	    	then
		    MAKEFILE=$i;
		    NEXT="0";
		else
		    echo "$DEPEND: Unrecognized parameter $i."; 
		    exit 1;
		fi;;
    esac
done

#
#  Look if we have a Makefile
#
if [ ! -w $MAKEFILE ]
then
    echo "$DEPEND: $MAKEFILE does not exist or is not writeable."
    exit 1
fi

if [ "x$CFILELIST" = "x" -a "x$CPLUSFILELIST" = "x" ]
then
    echo "$DEPEND: No c or c++ files specified"
    exit 1
fi
#
# Repair the Makefile, if broken.
#
RET=`grep '^# DO NOT DELETE THIS LINE' $MAKEFILE`
if [ "x$RET" = "x" ]
then
    echo '# DO NOT DELETE THIS LINE'   >> $MAKEFILE
fi
echo ""					>> $MAKEFILE
echo ""					>> $MAKEFILE

#
# Run dependencies
#
echo $p "$DEPEND $q"

touch $MAKEDEP
if [ "x$CFILELIST" != "x" ]
then
    for i in $CFILELIST
    do
	echo $p "$i $q" 1>&2 
	echo "#" 
	echo "# $i"
	echo "#"
	$CC $MFLAG $DEFINE $UNDEF $INCLUDE $i
    done  >> $MAKEDEP
fi

if [ "x$CPLUSFILELIST" != "x" ]
then
    for i in $CPLUSFILELIST
    do
	echo $p "$i $q" 1>&2 
	echo "#" 
	echo "# $i"
	echo "#"
	$CPLUS $MFLAG $DEFINE $UNDEF $INCLUDE $i
    done  >> $MAKEDEP
fi
#
# Edit the Makefile
#
echo "> $MAKEFILE"
echo '/^# DO NOT DELETE THIS LINE/+1,$d' > $EDDEP
echo '$r '$MAKEDEP >> $EDDEP
echo 'w' >> $EDDEP
cp $MAKEFILE $MAKEFILE.bak
ed - $MAKEFILE < $EDDEP
echo '# DEPENDENCIES MUST END AT END OF FILE'  >> $MAKEFILE
echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> $MAKEFILE
echo '# see make depend above'                 >> $MAKEFILE

rm -f $TMPFILES

