即使先决条件失败,Makefile目标能否调用命令?

即使先决条件失败,Makefile目标能否调用命令?,makefile,gnu-make,Makefile,Gnu Make,下面是一个骨架生成文件,以便更容易地描述问题: 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

下面是一个骨架生成文件,以便更容易地描述问题:

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 $*
所以我有一个测试运行程序,它生成一个包含详细结果的文件,然后有一个过滤机制来创建一个摘要文件

现在,如果测试集中的任何项目失败,测试运行程序将返回一个错误代码,这将正确中止“所有测试”目标,并且永远不会调用其他测试目标。但是,我希望无条件地运行details->summary转换,因为即使是失败的测试运行,这也是相关的

我尝试了一些不同的变体,但我唯一可以使用的方法是将整个命令链包装到一个Perl脚本中,存储第一个命令的结果,并将其用作整个脚本的返回值


但这并不是一个很好的解决方案,特别是因为“实际”命令集比这个框架显示的要复杂一些。您知道任何纯粹基于GNU Make的方法来实现这一点吗?

您可以有一个特殊的规则,递归调用Make两次,如下所示:

.PHONY: test
test :
    make all_tests ; make summary

唯一的缺点是top make进程的退出状态将不再表示测试的成功/失败,但是如果您想通过使用$进行一点额外的脚本编写来修复它,您甚至可以这样做?shell变量。

您可以通过在命令前面加上一个
-
,告诉make测试线束可以返回非零(请参阅)。如果你这样做,就不会考虑“细节”目标已经失败,所以会继续做“总结”一步。p>
大概
createSummary.pl
可以通过查看生成的“详细信息”文件来判断测试是否失败。如果您想在测试失败时生成一个make错误,那么可以让
createSummary.pl
在检测到任何失败时返回非零。

我认为
make all_测试;状态=$?;总结;退出$STATUS
可能会执行您想要的操作。它需要是
进行所有测试;状态=$?;总结;退出$$STATUS
否则Make会吃掉美元并且不会将其传递给shell:)请检查要进行的嵌套调用的选项。它尝试运行所有这些程序,但如果有任何程序失败,它将报告失败。