Перебор пустого элемента с помощью GNU make's $ (foreach) - PullRequest
3 голосов
/ 06 июля 2010

Я только что обнаружил функцию $ (foreach) GNU make, и я следую шаблону 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 make?(Я могу придумать обходной путь, но наличие пустого элемента в моем списке будет чище.)

1 Ответ

1 голос
/ 06 июля 2010

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

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

Есть еще несколько хитростей, например, обойтись без NUMBERS или сделать это автоматически, но они получаются добрымибезобразный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...