shell 如何在makefile目标中保存和返回退出代码

qmb5sa22  于 2023-03-13  发布在  Shell
关注(0)|答案(2)|浏览(204)

我有一个make目标,看起来像这样:

.PHONY: run-my-test
run-my-test: all
    run_test_suite.sh --all --log-to-file
    post_process_logs.sh

如果测试用例失败,run_test_suite.sh的退出代码将导致Make无法继续运行post_process_logs.sh。这是一个问题,因为我想获得已处理的日志,即使是失败的测试。我应该如何更新我的目标来做到这一点?
我考虑过以某种方式保存退出代码,也许在目标定义的末尾用它退出,或者我把调用拆分到单独的目标中?
我可以补充一点,由于我们的构建系统的工作方式,我几乎不得不从Make中完成这些工作,而且我不希望添加更多的目标,因为make文件往往会被这些目标弄得乱七八糟。

bq8i3lrv

bq8i3lrv1#

如果您希望构建在运行post_process_logs.sh * 之后 * 失败,请将这两个命令放在同一条目中。

.PHONY: run-my-test
run-my-test: all
        run_test_suite.sh --all --log-to-file; \
        e=$$?; \
        post_process_logs.sh; \
        exit $$e

run_test_suite.sh的退出状态保存在shell变量e中,该变量用作post_process_logs.sh之后exit的参数,以设置整个命令的退出状态。

ewm0tg9j

ewm0tg9j2#

当你有一个大的逻辑,不想处理所有这些地狱:

.PHONY: run-my-test
run-my-test: all
    mkdir -p test_reports;
    run_test_suite.sh --all --log-to-file ||\
        echo $$? > test_reports/exit_code.txt && echo "ERROR Tests failed";

    # do some other logic, i.e. make a coverage report
    go tool cover -html=test_reports/coverage.out -o test_reports/coverage.html;

    # more and more other logic

    echo "Exiting with $$(cat test_reports/exit_code.txt)" && exit $$(cat test_reports/exit_code.txt)

相关问题