Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何通过遍历列表在Makefile中生成目标?_Shell_Makefile - Fatal编程技术网

Shell 如何通过遍历列表在Makefile中生成目标?

Shell 如何通过遍历列表在Makefile中生成目标?,shell,makefile,Shell,Makefile,代码: 预期结果: LIST=0 1 2 3 4 5 PREFIX=rambo # some looping logic to interate over LIST 因为我的列表有6个元素,所以应该生成6个目标。将来,如果我想添加更多目标,我希望能够修改我的列表,而不触及代码的任何其他部分 循环逻辑应该如何编写?使用。使用patsubst可以进行非常一般的转换。对于构建文件名,addsuffix和addprefix都很方便 对于规则,请使用 总体结果可能如下所示: rambo0: s

代码:

预期结果:

LIST=0 1 2 3 4 5
PREFIX=rambo

# some looping logic to interate over LIST
因为我的列表有6个元素,所以应该生成6个目标。将来,如果我想添加更多目标,我希望能够修改我的列表,而不触及代码的任何其他部分

循环逻辑应该如何编写?

使用。使用
patsubst
可以进行非常一般的转换。对于构建文件名,
addsuffix
addprefix
都很方便

对于规则,请使用

总体结果可能如下所示:

rambo0:
    sh rambo_script0.sh

rambo1:
    sh rambo_script1.sh
LIST=0 1 3 4 5
目标=$(添加前缀rambo,$(列表))
全部:$(目标)
$(目标):rambo%:rambo%.sh
嘘$<

如果使用GNU make,则可以在运行时生成任意目标:

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

all: $(targets)

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

只要我的2美分到@Idelic答案,如果你需要使用Make
$cmd
你必须使用
$$
来转义它们 e、 g

注:此处规则由Make as“查看”

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))))
rambo0:$(addprefix rambo_脚本,$(addsuffix.sh,0))
嘘$<
但在这里,我们可以写而不逃避,即

rambo0: $(addprefix rambo_script, $(addsuffix .sh, 0))
    sh $<
rambo$1:$(addprefix rambo_脚本,$(addsuffix.sh,$1))
嘘$$<
因此,规则“被视为”如下:

rambo0:rambo_script0.sh
嘘$<

当Make解析时。

谢谢,有没有办法查看目标的最终生成形式?@Lazer我不知道,但我远不是Make的专家。
-n
(干运行)选项可能会告诉您想要什么。@Lazer,
$(信息目标是$(目标))
对于所问的问题不是最优雅的解决方案,但这正是我想要的答案:一种在运行时生成目标的方法。这对于所问的问题来说效率非常低,但如果这是您真正想要做的,这是一个很好的例子。@BUFU效率低下的可怕原因是什么?@'idelic'定义了一个定义多个特定目标的宏,而不是所有这些(系统命名的)目标的模式规则。这是如何效率低下的?此外,问题不在于如何对系统命名的目标使用模式规则,而在于如何以编程方式生成这些目标。
rambo0: $(addprefix rambo_script, $(addsuffix .sh, 0))
    sh $<
rambo$1: $(addprefix rambo_script, $(addsuffix .sh, $1))
    sh $$<
rambo0 : rambo_script0.sh
    sh $<