Я просто обнаружил $ make's GNU (foreach) функция, и я следую за foreach-eval-call шаблоном, используемым в документации; например,
graphviz_progs := dot neato circo fdp
define LAYOUT_template
%-$(1).dot: %.dot
$(1) -Tdot $$? > $$@
endef
$(foreach p, $(graphviz_progs), \
$(eval $(call LAYOUT_template,$(p))) \
)
Это работает вполне прилично: $ (foreach) функция рассматривает $ (graphviz_progs) как разделенный пробелом список объектов и выполняет итерации по каждому из них.
Теперь моя проблема состоит в том, что я часто хочу выполнить итерации по списку объектов, один из которых является пустой строкой.
Действительно ли это возможно в GNU, делают? (Я могу думать об обходном решении, но наличие пустого объекта в моем списке было бы более чистым.)
Я думаю, что единственный способ добиться желаемого поведения - это добавить уровень косвенности. Либо грубо:
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)))))
, либо чуть более аккуратно:
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)))))
Есть еще несколько приемов, например обойтись без НОМЕРОВ
или сделать это автоматически, но они становятся некрасивыми.