我刚发现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有可能吗?(我可以考虑一种解决方法,但是将空项目放在列表中会更干净。)
我认为获得您想要的行为的唯一方法是添加一定程度的间接性。或者粗略地说:
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或自动制作,但它们有点难看。