如何通过迭代列表来生成Makefile中的目标?
问题描述:
LIST=0 1 2 3 4 5
PREFIX=rambo
# some looping logic to interate over LIST
预期的结果:
rambo0:
sh rambo_script0.sh
rambo1:
sh rambo_script1.sh
由于我的列表中有6个元素,应该产生6个目标。在将来,如果我想添加更多目标,我希望能够修改我的LIST,而不是触及代码的任何其他部分。
应如何写入循环逻辑?
答
使用text-transforming functions。通过patsubst
,您可以进行相当一般的转换。为了构建文件名,addsuffix
和addprefix
都很方便。
有关规则,请使用pattern rules。
总的结果可能会是这个样子:
LIST = 0 1 3 4 5
targets = $(addprefix rambo, $(LIST))
all: $(targets)
$(targets): rambo%: rambo%.sh
sh $<
答
如果您使用了GNU make,你可以生成在运行时任意目标:
LIST = 0 1 2 3 4 5
define make-rambo-target
rambo$1:
sh rambo_script$1.sh
all:: rambo$1
endef
$(foreach element,$(LIST),$(eval $(call make-rambo-target,$(element))))
感谢,有什么办法以最终生成的形式查看目标? – Lazer 2012-04-16 11:29:09
@Lazer不是我所知道的,但是我远离一位专家。 '-n'(空转)选项可能会告诉你你想要什么。 – 2012-04-16 11:36:59
@Lazer,'$(info目标是$(目标))' – Beta 2012-04-16 12:40:25