咨询:Makefile中PLAY变量二次赋值未生效,能否重新赋值?
Makefile中
?=赋值不生效的原因及变量重赋值方法 为什么第二条PLAY?=赋值未生效
?=是Makefile的条件赋值运算符,它的规则是:仅当目标变量未被定义、或定义后值为空时,才会执行赋值操作。
你代码里第一条PLAY?=$(shell ${BREW} --prefix)/bin/test执行后,PLAY变量已经被成功定义(哪怕${BREW}执行结果为空,变量也会被定义成空字符串),所以第二条PLAY?=/usr/local/test/bin/go因为检测到PLAY已存在,不会触发赋值。
Makefile能否为变量重新赋值?
可以,但要选对赋值符号:
?=:仅条件性赋值,不覆盖已定义的变量=:递归赋值,会直接覆盖之前的变量定义(后续解析时会展开所有引用):=:立即赋值,同样会覆盖之前的定义(赋值时直接展开所有内容,避免递归引用问题)
修正示例
如果需要强制用第二条路径覆盖第一条,把第二条的?=改成=或:=即可:
PLAY?=$(shell ${BREW} --prefix)/bin/test PLAY=/usr/local/test/bin/go # 强制覆盖已有变量
如果需要实现「第一条路径不存在/为空时,才用第二条」的逻辑,也可以用条件判断实现:
PLAY=$(shell ${BREW} --prefix)/bin/test ifeq ($(PLAY),) PLAY=/usr/local/test/bin/go endif
内容的提问来源于stack exchange,提问作者James Franco
相关产品推荐
相关产品推荐

