You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Makefile如何根据前序命令退出码在目标中执行额外命令?

Makefile并行任务中根据命令退出码执行后续操作

你当前的Makefile通过make -j10并行运行多个测试任务,每个任务的输出已捕获到单独日志文件中。要实现根据run_some_job的退出码执行后续操作(如打印成功/失败提示、自定义逻辑),可以通过以下两种方式实现:

方式一:直接修改单个测试目标

针对每个test_N目标,使用Shell的条件判断语句,结合命令退出码实现逻辑:

test_all: test_1 test_2 test_3

test_1:
    @echo "Starting test 1"
    @run_some_job > test_1.log 2>&1; \
    RET=$$?; \
    if [ $$RET -eq 0 ]; then \
        echo "Test 1 passed"; \
    else \
        echo "Test 1 failed"; \
        # 在这里添加自定义失败操作,例如复制失败日志到指定目录:\
        # cp test_1.log failed_tests/; \
        exit $$RET; \
    fi

test_2:
    @echo "Starting test 2"
    @run_some_job > test_2.log 2>&1; \
    RET=$$?; \
    if [ $$RET -eq 0 ]; then \
        echo "Test 2 passed"; \
    else \
        echo "Test 2 failed"; \
        # 自定义失败操作 \
        exit $$RET; \
    fi

test_3:
    @echo "Starting test 3"
    @run_some_job > test_3.log 2>&1; \
    RET=$$?; \
    if [ $$RET -eq 0 ]; then \
        echo "Test 3 passed"; \
    else \
        echo "Test 3 failed"; \
        # 自定义失败操作 \
        exit $$RET; \
    fi

方式二:用模式规则简化重复代码

由于三个测试目标的逻辑完全一致,使用Makefile的模式规则可以避免重复编写代码,更易维护:

# 定义所有测试目标
TESTS := test_1 test_2 test_3

test_all: $(TESTS)

# 模式规则匹配所有test_N目标
$(TESTS): test_%:
    @echo "Starting test $*"
    @run_some_job > test_$*.log 2>&1; \
    RET=$$?; \
    if [ $$RET -eq 0 ]; then \
        echo "Test $* passed"; \
    else \
        echo "Test $* failed"; \
        # 在这里添加你的自定义失败操作,例如:\
        # mkdir -p failed_tests && cp test_$*.log failed_tests/; \
        exit $$RET; \
    fi

关键说明

  1. 获取退出码:使用$$?捕获run_some_job的退出码(Makefile中$需转义为$$),并保存到变量RET中。
  2. 条件判断:通过if [ $$RET -eq 0 ]判断命令是否执行成功,分别处理成功/失败逻辑。
  3. 保留失败状态:exit $$RET确保如果run_some_job失败,Make会将对应测试目标标记为失败,最终test_all的退出码也会反映整体执行结果。
  4. 并行执行兼容性:上述两种方式都兼容make -j10的并行执行,每个测试目标都是独立的,Make会自动并行处理。

内容的提问来源于stack exchange,提问作者shikhanshu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:05:03