代码之家  ›  专栏  ›  技术社区  ›  Christoffer

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

  •  3
  • Christoffer  · 技术社区  · 14 年前

    下面是一个骨架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 $*
    

    所以我有一个测试运行程序,它生成一个包含详细结果的文件,然后有一个过滤机制来创建一个摘要文件。

    现在,如果测试集中的任何项失败,testrunner应用程序将返回一个错误代码,这将正确中止“all\u tests”目标,并且永远不会调用其他的\u测试目标。但是,我希望无条件地运行详细信息->摘要转换,因为这即使对于失败的测试运行也是相关的。

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   Gintautas Miliauskas    14 年前

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

    .PHONY: test
    test :
        make all_tests ; make summary
    

    唯一的缺点是top make进程的退出状态将不再指示测试的成功/失败,但是如果您想通过使用$?shell变量。

        2
  •  4
  •   slowdog    14 年前

    test_harness 通过在 - 到命令(请参见 the manual ). 如果这样做,make将不会认为“details”目标失败,因此将继续执行“summary”步骤。

    大概吧 createSummary.pl 创建摘要.pl 如果检测到任何故障,则返回非零。