17

代码:

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

由于我的 LIST 有 6 个元素,因此应该生成 6 个目标。将来,如果我想添加更多目标,我希望能够只修改我的 LIST 而不会触及代码的任何其他部分。

循环逻辑应该怎么写?

4

3 回答 3

31

如果您使用 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))))
于 2012-04-16T17:54:25.233 回答
20

使用文本转换功能。有了patsubst您,您可以进行非常一般的转换。用于构建文件名,addsuffix并且addprefix都很方便。

对于规则,使用模式规则

总体结果可能如下所示:

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

all: $(targets)

$(targets): rambo%: rambo%.sh
    sh $<
于 2012-04-16T10:51:41.560 回答
0

只是我对@Idelic 答案的 2 美分,如果你需要使用一些 Make ,你必须使用 例如$cmd逃避它们$$

LIST = 0 1 2 3 4 5
define make-rambo-target
$(info create target: $(addprefix rambo_script, $(addsuffix .sh, $1)).)
rambo$1: $$(addprefix rambo_script, $$(addsuffix .sh, $1))
    sh $$<
endef

all: $(addprefix rambo, $(LIST))

$(foreach element, $(LIST), $(eval $(call make-rambo-target,$(element))))

输出:

$ make
create target: rambo_script0.sh.
create target: rambo_script1.sh.
create target: rambo_script2.sh.
create target: rambo_script3.sh.
create target: rambo_script4.sh.
create target: rambo_script5.sh.
sh rambo_script0.sh
sh rambo_script1.sh
sh rambo_script2.sh
sh rambo_script3.sh
sh rambo_script4.sh
sh rambo_script5.sh

注意:这里的规则“被 Make 看到”为

rambo0: $(addprefix rambo_script, $(addsuffix .sh, 0))
    sh $<

但是在这里我们可以写而不转义,即

rambo$1: $(addprefix rambo_script, $(addsuffix .sh, $1))
    sh $$<

所以规则“被视为”为:

rambo0 : rambo_script0.sh
    sh $<

Make解析它的时候。

于 2020-03-25T11:14:33.250 回答