Makefile条件规则执行与错误输出控制问题
解决方法
要实现检查失败时阻止build执行,且仅显示自定义错误信息,需要避免make输出默认的错误提示,同时保证check规则返回失败状态以终止后续流程。以下是两种可行方案:
方案1:直接终止make进程(简单高效)
利用bash的进程ID变量$$PPID获取make的进程ID,在检查失败时输出自定义错误后直接终止make进程,这样make就不会输出默认的错误提示:
SHELL := /bin/bash build: check @gcc $(DEST) -o output_binary check: @[[ -e $(DEST) ]] || { echo "ERROR: $(DEST) 文件不存在" >&2; kill -TERM $$PPID; } .PHONY: build check
说明:
>&2将自定义错误输出到标准错误流,符合Unix程序的错误输出惯例kill -TERM $$PPID终止make的父进程(即make本身),避免make输出默认错误提示- 此方法依赖bash环境,在大多数类Unix系统上均可正常工作
方案2:递归调用make并过滤错误输出(更通用)
通过递归调用make,将make的默认错误提示过滤掉,只保留自定义错误信息:
# 首次调用时递归执行并过滤错误输出 ifeq ($(NO_FILTER),) $(MAKE) NO_FILTER=1 "$(MAKECMDGOALS)" 2> >(grep -v "make: ***") exit 0 endif SHELL := /bin/bash build: check @gcc $(DEST) -o output_binary check: @[[ -e $(DEST) ]] || { echo "ERROR: $(DEST) 文件不存在" >&2; exit 1; } .PHONY: build check
说明:
- 首次执行时,递归调用make并设置
NO_FILTER=1,同时将标准错误流中的make: ***行过滤掉 - 递归调用的make会执行实际的检查和构建逻辑,
check失败时返回非0状态终止build,且仅显示自定义错误 - 此方法需要bash支持进程替换(
>(...)),兼容性稍差但无需杀死进程
内容的提问来源于stack exchange,提问作者Matteo B
相关产品推荐
相关产品推荐

