2012-04-16 211 views
5

CODE:如何通过迭代列表来生成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,而不是触及代码的任何其他部分。

应如何写入循环逻辑?

回答

9

使用text-transforming functions。通过patsubst,您可以进行相当一般的转换。为了构建文件名,addsuffixaddprefix都很方便。

有关规则,请使用pattern rules

总的结果可能会是这个样子:

LIST = 0 1 3 4 5 
targets = $(addprefix rambo, $(LIST)) 

all: $(targets) 

$(targets): rambo%: rambo%.sh 
    sh $< 
+0

感谢,有什么办法以最终生成的形式查看目标? – Lazer 2012-04-16 11:29:09

+0

@Lazer不是我所知道的,但是我远离一位专家。 '-n'(空转)选项可能会告诉你你想要什么。 – 2012-04-16 11:36:59

+1

@Lazer,'$(info目标是$(目标))' – Beta 2012-04-16 12:40:25

12

如果您使用了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))))