Makefile变量未按预期复用:执行make first为何输出b?
为什么执行
make first会输出"b"? 先看你提供的Makefile代码:
SRC := a first: $(SRC) @echo $(SRC) @echo "$@ $" SRC := b second: $(SRC) @echo $(SRC) @echo "$@ $"
执行make first后的结果:
make first b first a
原因在于Makefile的两个核心处理阶段:
- 读取阶段:make会从头到尾扫描整个Makefile,完成所有变量赋值、规则依赖的解析工作。你用的
:=是立即赋值运算符,赋值操作会在读取阶段立刻生效。所以SRC := a先把SRC设为a,随后SRC := b直接覆盖了之前的值,读取阶段结束后,SRC的最终值就是b。 - 执行阶段:当make确定要执行
first目标时,才会运行目标下的命令。命令行里的$(SRC)是在执行阶段才展开的,自然会使用读取阶段最终确定的SRC值b,这就是第一行输出"b"的原因。
而规则里的依赖$(SRC)是在读取阶段展开的,所以first: $(SRC)在读取阶段就被解析成了first: a,执行命令时$<代表第一个依赖,也就是a,因此第二行输出"first a"。
如果想让first目标单独使用SRC的a值,可以用目标特定变量来实现:
first: SRC := a first: $(SRC) @echo $(SRC) @echo "$@ $" second: SRC := b second: $(SRC) @echo $(SRC) @echo "$@ $"
这样执行make first就会输出a和first a了。
内容的提问来源于stack exchange,提问作者Ronald Stanonik
相关产品推荐
相关产品推荐

