I just discovered GNU make's $(foreach) function, and I'm following the foreach-eval-call pattern used in the documentation; for instance,
graphviz_progs := dot neato circo fdp
define LAYOUT_template
%-$(1).dot: %.dot
$(1) -Tdot $$? > $$@
endef
$(foreach p, $(graphviz_progs), \
$(eval $(call LAYOUT_template,$(p))) \
)
This works pretty well: $(foreach) function treats $(graphviz_progs) as a space-separated list of items and iterates over each of them.
Now my problem is that I frequently want to iterate over a list of items one of which is the empty string.
Is this possible in GNU make? (I can think of a workaround, but having the empty item in my list would be cleaner.)
I think the only way to get the behavior you want is by adding a level of indirection. Either crudely:
graphviz_progs := dot neato circo fdp
gplist := gp1 gp2 gp3 gp4 gp5
gp1 := dot
gp2 := neato
gp3 := circo
gp4 := fdp
gp5 :=
$(foreach p, $(gplist), \
$(eval $(call LAYOUT_template,$($(p)))))
or a little more neatly:
graphviz_progs := dot neato circo fdp
gplist := gp1 gp2 gp3 gp4 gp5
NUMBERS = 1 2 3 4 5
$(foreach n,$(NUMBERS), \
$(eval $(word $(n),$(gplist)) = $(word $(n),$(graphviz_progs))))
$(foreach p, $(gplist), \
$(eval $(call LAYOUT_template,$($(p)))))
There are a few more tricks, e.g. to do without NUMBERS
or make it automatically, but they get kind of ugly.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With