Loops 是否有一个Makefile级别;至于;环
目前,我知道如何在Loops 是否有一个Makefile级别;至于;环,loops,for-loop,makefile,Loops,For Loop,Makefile,目前,我知道如何在Makefiles中循环的唯一方法是调用shell的for循环: BIN_TARGETS=foo bar baz bin: $(BIN_TARGETS) run: bin for FILE in $(BIN_TARGETS) ; do ./$$FILE ; done 问题在于,make将简单地调用shell的for循环,回显整个for循环,然后每个程序运行并输出其输出(如果有任何错误,则仅在循环结束时报告,并且仅针对循环中的最后一个程序): 对于循环,是否
Makefile
s中循环的唯一方法是调用shell的for循环:
BIN_TARGETS=foo bar baz
bin: $(BIN_TARGETS)
run: bin
for FILE in $(BIN_TARGETS) ; do ./$$FILE ; done
问题在于,make
将简单地调用shell的for循环,回显整个for循环,然后每个程序运行并输出其输出(如果有任何错误,则仅在循环结束时报告,并且仅针对循环中的最后一个程序):
对于循环,是否存在本质上与此完全相同的Makefile
级别的:
run: bin
./foo
./bar
./baz
这将输出以下内容:
$ make run
./foo
output of foo
./bar
output of bar
./baz
output of baz
并且会在发生任何错误时报告。make确实有一个循环,但没有一个循环可以执行您想要的操作
make有$(foreach)
,但这是一个make级别的构造,它将循环make语法等,而不是shell级别的东西
一个define
可以让你以你想要的方式定义食谱的主体,并在你的食谱中使用它,但是我想不出从make中生成多行define的方法
这将起作用(就期望的行为而言),但我无法在make运行期间创建它
define RECIPE
./foo
./bar
./baz
endef
all:
$(RECIPE)
我想出的一种方法是使用带有后缀的假目标:
run: $(addsuffix .run,$(BIN_TARGETS))
%.run: %
./$*
然而,当像foo.run
这样的东西有多个可能的匹配时,这就变得很混乱。唯一不同的是,它编译并运行一个文件,然后运行下一个文件,而不是编译所有文件,然后运行所有文件。您可以这样做:
BIN_TARGETS:=foo bar baz
define CMD
$1
endef
bin: $(BIN_TARGETS)
run: bin
$(foreach t, $(BIN_TARGETS), $(call CMD,./$(t)))
CMD
变量是在命令之间提供正确分隔所必需的。我还没有找到一种更简洁的方法
如果foo
,bar
,baz
包含:
#!/bin/bash
echo output of $0
然后运行make run
输出:
./foo
output of ./foo
./bar
output of ./bar
./baz
output of ./baz
“报告错误”是指“中止”吗?因为shell循环会在错误发生时输出错误/等,但make不会在错误上中止。@EtanReisner:基本上是的。“报告”的意思是目标“运行”的方法失败了。
Makefile:**[run]错误27
消息。通过使用/$FILE | | exit$?
作为循环体,您可以在shell循环中获得失败行为。我相信。@EtanReisner:但这并不能解决其他问题。还有哪些问题?开始时整个循环的回声?谢谢!我将查看定义,看看我能用它做些什么。
./foo
output of ./foo
./bar
output of ./bar
./baz
output of ./baz