这是一个骨架Makefile,只是为了更容易描述问题:
all_tests : unit_tests other_tests_1 other_tests_2 ... other_tests_N
unit_tests : set1_summary.txt set2_summary.txt ... setN_summary.txt
%_summary.txt : %_details.txt
perl createSummary.pl --in $^ -out $@
%_details.txt : test_harness
./test_harness --test-set $*
所以我有一个测试运行器,它生成一个包含详细结果的文件,然后是一个过滤机制来创建一个摘要文件。
现在,如果测试集中的任何项目失败,测试运行器应用程序将返回错误代码,这将正确中止“all_tests”目标并永远不会调用other_test目标。但是,我想运行详细信息 - >无条件地进行汇总转换,因为即使对于测试运行失败也是如此。
我尝试了一些不同的变体,但我唯一可以使用的方法是将整个命令链包装到Perl脚本中,存储第一个命令的结果并将其用作整个脚本的返回值。 / p>
但这并不是一个非常简洁的解决方案,特别是因为“实际”命令集比这个骨架显示的要复杂得多。你知道任何纯粹基于GNU Make的方法吗?
答案 0 :(得分:4)
你可以告诉make test_harness
可以通过在命令前加-
来返回非零值(参见the manual)。如果你这样做,make将不会认为“细节”目标失败了,所以将继续做“摘要”步骤。
据推测,createSummary.pl
可以判断测试是否因查看生成的“详细信息”文件而失败。如果您想在测试失败时生成make错误,那么如果检测到任何失败,您可以让createSummary.pl
返回非零值。
答案 1 :(得分:2)
你可以有一个特殊的规则,可以递归调用两次,如下所示:
.PHONY: test
test :
make all_tests ; make summary
唯一的缺点是顶级制作过程的退出状态将不再表示测试的成功/失败,但如果你想通过一些额外的脚本使用$,你甚至可以解决这个问题。 shell变量。