我试图make
通过生成如下所示的 Makefile 来并行运行一些作业:
test_all: test_1 test_2 test_3
test_1:
@echo "Starting test 1"
@run_some_job > test_1.log 2>&1
# if run_some_job passed, print "Test 1 passed", else print "Test 1 failed"
test_2:
@echo "Starting test 2"
@run_some_job > test_2.log 2>&1
# if run_some_job passed, print "Test 2 passed", else print "Test 2 failed"
test_3:
@echo "Starting test 3"
@run_some_job > test_3.log 2>&1
# if run_some_job passed, print "Test 3 passed", else print "Test 3 failed"
我将调用 usingmake -j10
以便所有这些并行运行,在各个日志文件中捕获它们的 stdout+stderr。
问题:我怎样才能在上面的评论中做我想做的事情?请注意,这里我只是进行打印,但实际上我可能想根据上一个命令是通过还是失败在下一个命令中执行自定义操作。
if run_some_job passed, print "Test N passed", else print "Test N failed"
您必须将其包含在同一个 shell 脚本中。一旦 make 检测到配方中的某些行失败,它将停止运行配方,因此打印“失败”的额外行将永远不会运行。所以你必须自己做检查,如下所示:
这是 shell 语言的问题,makefile 配方是在 shell 语言中表达的,而不是
make
本身的问题。它有两个组成部分:run_some_job
必须通过其退出状态指示测试是否通过或失败。最自然的情况是成功时以状态 0 退出,失败时以任何其他状态(例如 1)退出。使用 shell 条件命令来选择要执行的替代命令。
后者稍微复杂一点,因为它
make
在自己的 shell 中运行每个(逻辑)配方行,但是您可以;
在 shell 语言中将分号 () 与换行符互换使用以实现大多数用途,并make
提供将多个物理行连接成单个逻辑行的功能。一,满足您的目的。例如:您实际上不需要明确执行任何操作。
make
将在第一个失败的命令上终止配方。因此,只需将命令放在可能失败的命令下方,就会导致在上面的命令失败时跳过该命令。@
我在主命令之前取出了fugly ;它使调试变得更加困难,如果您不想看到make
正在做什么,您可以简单地使用make -s
.如果除了
make
出现故障时已打印的通知之外,您还想显式打印故障通知,那就有点麻烦了:但同样,
make
当出现故障时会打印一条错误消息,所以这似乎完全没有必要。正如您所看到的,错误消息包括失败的目标的名称及其特定的退出代码。
(回过头来,如果您取出 ,似乎也没有必要打印显式的成功指示符,
@
这样您就可以看到已运行的内容以及是否成功。)