[comp.bugs.sys5] make depend script for SysV

david@ms.uky.edu (David Herron -- One of the vertebrae) (03/21/89)

I just came up with a make depend script for use on System V
and other systems whose cc/cpp gives the following two flags:

	-E	Run cpp only
	-H	print on stderr a list of included files.

With suitable munging this works fine in the MMDF sources.


Is anybody interested in having this??
-- 
<-- David Herron; an MMDF guy                              <david@ms.uky.edu>
<-- ska: David le casse\*'      {rutgers,uunet}!ukma!david, david@UKMA.BITNET
<-- 
<-- The problem with mnemonics is they mean different things to different people.

david@ms.uky.edu (David Herron -- One of the vertebrae) (03/25/89)

In article <11300@s.ms.uky.edu>, david@ms.uky.edu (David Herron -- One of the vertebrae) writes:
> I just came up with a make depend script for use on System V
> and other systems whose cc/cpp gives the following two flags:

Well, a buncha people asked for it so here it is ... The following is the make depend
from my working copy of MMDF.  (MMDF users, this will be 'official' shortly :-)).
The uncommented sections are what I am using right now on a ATT6386 with SysVr3.2
to which I'm porting MMDF.

The idea is to run "cc -E -H" and munge the output of that to be "file.o: the-include-file"
and feed that into a duplicate of the original awk script written on cc -M sites.
Output from cc -E -H is:

	stdout:		the result from cpp on the source file
	stderr:		any error messages go here as does a list of included files.
			the included files are output one per line.

I throw stdout to /dev/null and massage stderr with an awk script which either
munges an included file to "file.o: the-include-file" or prints an error message
on /dev/tty.  Hopefully there won't be any error messages.

A kudo.  In the middle of the script I "rm -f $$i.deps $$i.out".  "$$i.out" isn't
used anylonger but was there during my debugging.

Originally this scripthad the "-M" hard coded, but since the Ultrix people changed it
to be "-Em" I introduced the "THE_M_FLAG" business.


Finally, I don't claim any ownership over this.  I've seen these same scripts
floating around in many a Makefile.  I *hope* that everybody puts these to use
in their own Makefile's.  I'd like to know if someone can clean this up any.



#
#  #include dependencies
#
#  Two versions are supplied.  One for sites with cc -M (4.3BSD)
#  and one for those that don't have it.  Comment out the one
#  you do not want.

#  This one is for sites without cc -M
# depend:
# 	cat </dev/null >x.c
# 	for i in $(MODULES); do \
# 		(echo $$i.o: $$i.c >>makedep; \
# 		grep '^#[ 	]*include' x.c $$i.c | sed \
# 			-e 's,c:[^"]*"\./\([^"]*\)".*,o: \1,' \
# 			-e 's,c:[^"]*"/\([^"]*\)".*,o: /\1,' \
# 			-e 's,c:[^"]*"\([^"]*\)".*,o: ../../h/\1,' \
# 			-e 's,c:[^<]*<\(.*\)>.*,o: /usr/include/\1,' \
# 			>>makedep); done
# 	echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep
# 	echo '$$r makedep' >>eddep
# 	echo 'w' >>eddep
# 	cp Makefile.real Makefile.bak
# 	ed - Makefile.real < eddep
# 	rm eddep makedep x.c
# 	echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile.real
# 	echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile.real
# 	echo '# see make depend above' >> Makefile.real

THE_M_FLAG= -E -H

#  This one is for sites with cc -M
depend:
# 	( for i in ${MODULES} ; do \
# 		${CC} ${THE_M_FLAG} ${CFLAGS} $$i.c ; done ) | \
# 	awk ' { if ($$1 != prev) { print rec; rec = $$0; prev = $$1; } \
# 		else { if (length(rec $$2) > 78) { print rec; rec = $$0; } \
# 		       else rec = rec " " $$2 } } \
#	      END { print rec } ' > makedep
	( for i in ${MODULES} ; do \
		echo $$i >/tmp/curfile; echo "$$i.o: $$i.c" ; \
		${CC} ${THE_M_FLAG} ${CFLAGS} $$i.c >/dev/null 2>$$i.deps; \
		awk <$$i.deps 'NF > 1 { print >"/dev/tty"; next } \
			{print "'`cat /tmp/curfile`'.o: " $$1}' ; \
		rm -f $$i.deps $$i.out; done ) | \
	awk ' { if ($$1 != prev) { print rec; rec = $$0; prev = $$1; } \
		else { if (length(rec $$2) > 78) { print rec; rec = $$0; } \
		       else rec = rec " " $$2 } } \
	      END { print rec } ' > makedep
#		awk 'NF == 2 { file = $$2; next } \
#		     NF == 1 { if (length(rec) == 0) { rec = file ".o: " } \
#				if (length(rec $$1) > 70) { \
#					print rec $$1; rec = "" } else { \
#					rec = rec " " $$1 } \
#				}'; done ) >makedep
	echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep
	echo '$$r makedep' >>eddep
	echo 'w' >>eddep
	cp Makefile.real Makefile.bak
	ed - Makefile.real < eddep
	rm eddep makedep
	echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile.real
	echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile.real
	echo '# see make depend above' >> Makefile.real

-- 
<- David Herron; an MMDF guy                              <david@ms.uky.edu>
<- ska: David le casse\*'      {rutgers,uunet}!ukma!david, david@UKMA.BITNET
<- 
<- The problem with mnemonics is they mean different things to different people.