Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Loops 是否有一个Makefile级别;至于;环_Loops_For Loop_Makefile - Fatal编程技术网

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