Итерация по пустому объекту с $ make's GNU (foreach)

Я просто обнаружил $ 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, делают? (Я могу думать об обходном решении, но наличие пустого объекта в моем списке было бы более чистым.)

5
задан reinierpost 6 July 2010 в 14:42
поделиться

1 ответ

Я думаю, что единственный способ добиться желаемого поведения - это добавить уровень косвенности. Либо грубо:

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)))))

Есть еще несколько приемов, например обойтись без НОМЕРОВ или сделать это автоматически, но они становятся некрасивыми.

3
ответ дан 15 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: