CODE:
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而不是触及代码的任何其他部分。
如何编写循环逻辑?
答案 0 :(得分:19)
如果您正在使用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))))
答案 1 :(得分:12)
使用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 $<
答案 2 :(得分: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 as视为“可见”
rambo0: $(addprefix rambo_script, $(addsuffix .sh, 0))
sh $<
但是在这里我们可以写而不必逃避
rambo$1: $(addprefix rambo_script, $(addsuffix .sh, $1))
sh $$<
因此规则“被视为”为:
rambo0 : rambo_script0.sh
sh $<
进行解析时