Subject: make
To: None <current-users@sun-lamp.cs.berkeley.edu>
From: Christos Zoulas <christos@deshaw.com>
List: current-users
Date: 12/16/1993 05:35:12
Are there any plans to upgrade to the current version of make from 4.4?
A while ago, I added "for" loops to the 4.4BSD make. I use them extensively
in my makefiles because they facilitate writing rules like the ones found
in /usr/src/include:

	@-for i in ${DIRS}; do \
		if [ ! -d ${DESTDIR}/usr/include/$$i ]; \
		then \
			mkdir ${DESTDIR}/usr/include/$$i; \
		fi; \
		(cd $$i; for j in *.[ih]; do \
			cmp -s $$j ${DESTDIR}/usr/include/$$i/$$j || \
			install -c -m 644 $$j ${DESTDIR}/usr/include/$$i/$$j; \
		done); \
	done


could be written as (minus the mkdir portion):

.for d in ${DIRS}

FILES_$d != cd $d && echo *.[ih]

.	for j in ${FILES_$d}

install:: ${DESTDIR}/$d/$j

${DESTDIR}/$d/$j: $d/$j
	install -c -m 644 ${.ALLSRC} ${.TARGET}

.	endfor

.endfor


[and I would argue that the 644 should be 444...]

This can be done for most install rules (programs libraries etc.) where
there is currently no checking for the source being newer than the target.
Currently "make install" in a program directory will *always* install the
program even if the binary in the source tree is the same or older than
the one installed.

Note that the "for" loop is more general than gnu-make's pattern rules
and eliminates the need for them.

christos

------------------------------------------------------------------------------