用GNU make的$(foreach)遍历一个空项目

rei*_*ost 5 makefile

我刚发现GNU make的$(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))) \
)
Run Code Online (Sandbox Code Playgroud)

这很好用:$(foreach)函数将$(graphviz_progs)视为以空格分隔的项目列表,并在每个项目上进行迭代。

现在我的问题是,我经常想遍历项目列表,其中一个是空字符串

GNU make有可能吗?(我可以考虑一种解决方法,但是将空项目放在列表中会更干净。)

Bet*_*eta 3

我认为获得您想要的行为的唯一方法是添加一定程度的间接性。或者粗略地说:

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)))))
Run Code Online (Sandbox Code Playgroud)

或者更简洁一点:

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)))))
Run Code Online (Sandbox Code Playgroud)

还有一些技巧,例如不使用NUMBERS或自动制作,但它们有点难看。