如何配置GNU Make遇未定义变量时直接报错而非忽略?
问题描述
我在Makefile中写了如下规则:
verify-prettier: $(PRETTIER) --check **/*.yaml **/*.yml
其中变量PRETTIER未定义,执行后得到以下结果:
check **/*.yaml **/*.yml bash: line 1: check: command not found make: [Makefile:156: verify-prettier] Error 127 (ignored)
我希望使用未定义变量时触发不可忽略的致命错误,而非仅警告。已知MAKEFLAGS=--warn-undefined-variables只会输出警告,想要实现类似Shell中set -u(未设置变量视为错误)的功能,使用版本为GNU Make 4.3,无需兼容其他Make实现。
更新:目前该功能似乎尚未支持,已提交特性请求。
解决方案
GNU Make 4.3没有直接提供将未定义变量转为致命错误的内置选项,但可以通过以下两种方式实现需求:
方法一:Make解析阶段检查(推荐)
定义一个通用的变量检查宏,在使用目标变量前调用,确保变量未定义时直接终止Make执行:
# 定义检查变量是否存在的宏,未定义则抛出致命错误 define require_variable ifndef $(1) $$(error 错误:变量$(1)未定义) endif endef verify-prettier: $(call require_variable,PRETTIER) $(PRETTIER) --check **/*.yaml **/*.yml
当PRETTIER未定义时,Make在解析规则阶段就会直接报错:
Makefile:X: *** 错误:变量PRETTIER未定义。 停止。
方法二:Shell执行阶段检查
在规则的Shell命令开头添加变量存在性检查,未定义时退出并返回错误码:
verify-prettier: @if [ '$(origin PRETTIER)' = 'undefined' ]; then echo "错误:PRETTIER变量未定义"; exit 1; fi $(PRETTIER) --check **/*.yaml **/*.yml
这种方式会在执行Shell命令前检查变量,若未定义则直接终止,避免出现无效的Shell命令。
内容的提问来源于stack exchange,提问作者guettli
相关产品推荐
相关产品推荐

