On Tue, Aug 03, 2004 at 12:31:14PM +0200, Hyams Iftach wrote: > The formed solution: > > LIST = $(wildcard *CDU*) > LIST1 = $(subst CDU,CDU_1,$(LIST)) > LIST2 = $(subst CDU,CDU_2,$(LIST)) > > all: $(LIST1) $(LIST2) > > $(LIST1): $(LIST) > sed -e "s/CDU/CDU_1/g" $(subst CDU_1,CDU,$@) > $@
SED_1 = sed -e "s/CDU/CDU_1/g" SED_2 = sed -e "s/CDU/CDU_2/g" Or simpler: set -x; \ for file in $(LIST); do \ $(SED_1) $$file >`echo $$file | $(SED_1)` \ done But also see my next comment. > > $(LIST2): $(LIST) > sed -e "s/CDU/CDU_2/g" $(subst CDU_2,CDU,$@) > $@ > > > Now the problem is the processing of the newly created > files upon next execution. If something in the original > changes - I don't care to remove all outputs and reprocess, > otherwise, skip. So what you get here is basically a glorified shell script. It would have been much simpler to write it as a simple shell script and be done with that. However make can give you more than that: conditional execution and a different sort of error notification. With a properly written makefile it should be safe and relatively cheap to re-run make after you corrected a small problem. Some problems I can think of: * some of the files in *CDU* will actually be directories * some of the files in *CDU* will actually be dandling links * re-running the script, or verifying that all has been done The problems I could think of with the schema I proposed in my previous mail were: Problem 1: how to create the original list of files. Maybe you have some external way of doing it? E.g: feeding that list to a certain file beforehand? Let's try something: LIST_ALL := $(wildcard *CDU*) LIST := $(filter_out _1 _2,$(LIST_ALL) # even a simple subst will do. patsubst will work just as well, # naturally: LIST1 := $(subst CDU,CDU_1,$(LIST) LIST2 := $(subst CDU,CDU_2,$(LIST) all: $(LIST1) $(LIST2) # the following reduces duplication in rules. This will allow you to use # $(NUM) as _1 or _2 in automatic targets, because per-target variables # are inherited with dependencies phoney1: $(LIST1) phoney2: $(LIST2) phoney1: NUM:=_1 phoney2: NUM:=_2 (that can also be done in a simple pipe in a shell script , of course) Problem 2: An pattern rule can only include one % . This means that automatic rules cannot be used here (unless someone here has a better idea. The following command is slightly better than the loop I used above as it uses $? to remake only targets that need remaking: # note: '=' and not ':=', as I use $(NUM) and $? which are target-specific SED_N = sed -e 's/CDU/CDU$(NUM)/g' COMMAND = \ set -x;\ for file in $?; do \ $(SED_N) <$$file >`echo $$file | $(SED_N)`; \ done $(LIST2): $(LIST) $(COMMAND) $(LIST1): $(LIST) $(COMMAND) Thus if you add/update just one file and re-run make (or if make had an error along the way and you re-run it after fixing the problem) you'll only create the files need creating. 'set -x' is used to emulate make's error handling: stop as soon as anything goes wrong. The operator should then fix the problem and re-run 'make'. Thus remaking should have a minimal overhead. -- Tzafrir Cohen +---------------------------+ http://www.technion.ac.il/~tzafrir/ |vim is a mutt's best friend| mailto:[EMAIL PROTECTED] +---------------------------+ ================================================================= To unsubscribe, send mail to [EMAIL PROTECTED] with the word "unsubscribe" in the message body, e.g., run the command echo unsubscribe | mail [EMAIL PROTECTED]