You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:52:53