命令行覆盖Makefile中option_one变量未生效的问题排查
为什么
make option_one=hi无法覆盖Makefile中的变量? 你遇到的问题根源很明确:你的Makefile里用了override关键字,它的作用就是强制锁定变量值,忽略命令行传入的覆盖请求。
先搞懂override的作用
在Makefile中,override关键字是用来反转变量优先级的——正常情况下,命令行传入的变量优先级高于Makefile内部定义的变量,但一旦你给变量加上override,规则就反过来了:Makefile里的定义会强制覆盖命令行传入的值,完全保持你在文件里设置的内容。
你的原Makefile代码:
override option_one = did_override all: echo $(option_one)
这就相当于告诉Make:不管用户命令行传什么option_one的值,都固定用did_override。所以你执行make option_one=hi时,Make直接忽略了命令行参数,输出了文件里预设的值。
解决方法
根据你的需求,有两种常见处理方式:
1. 允许命令行完全覆盖变量
如果就是想让命令行能自由覆盖这个变量,直接去掉override关键字即可:
option_one = did_override all: echo $(option_one)
现在执行make option_one=hi,输出就会变成:
echo hi hi
2. 保留默认值,仅在命令行未传值时生效
如果你想让变量有一个默认兜底值,但用户传了值就优先用用户的,可以用ifndef做条件判断:
ifndef option_one override option_one = did_override endif all: echo $(option_one)
- 执行
make(不传参数)时,输出did_override; - 执行
make option_one=hi时,输出hi。
内容的提问来源于stack exchange,提问作者vico
相关产品推荐
相关产品推荐

