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
关键说明
- 获取退出码:使用
$$?捕获run_some_job的退出码(Makefile中$需转义为$$),并保存到变量RET中。 - 条件判断:通过
if [ $$RET -eq 0 ]判断命令是否执行成功,分别处理成功/失败逻辑。 - 保留失败状态:
exit $$RET确保如果run_some_job失败,Make会将对应测试目标标记为失败,最终test_all的退出码也会反映整体执行结果。 - 并行执行兼容性:上述两种方式都兼容
make -j10的并行执行,每个测试目标都是独立的,Make会自动并行处理。
内容的提问来源于stack exchange,提问作者shikhanshu
相关产品推荐
相关产品推荐

