Windows下Makefile中使用cmd.exe设置变量后变量为空问题
问题原因与解决方法
原因分析
1. 多行命令变量丢失
GNU Make在Windows下会为每个缩进的命令行单独启动一个cmd.exe进程,每个进程的环境变量相互独立。第一行set TEST=test设置的变量仅在当前进程有效,第二行启动新进程时该变量已不存在,因此echo TEST is %TEST%中的%TEST%无法被替换,输出空值。
2. 单行命令的解析干扰
Makefile中%是模式匹配的特殊字符,Make会优先解析%TEST%,将其视为空值后再把命令传递给cmd。最终执行的命令实际是set TEST=test & echo TEST is ,导致输出异常。同时,即使Make不解析,cmd默认在执行命令前完成变量替换,同一行内刚设置的变量若不启用延迟扩展也无法立即读取。
解决方法
方法1:将多行命令打包为单个进程执行
通过cmd /c把多个命令合并到同一个cmd进程中,用反斜杠\实现Makefile内的换行:
.PHONY: default default: @cmd /c "set TEST=test && echo TEST is %TEST%"
方法2:转义Make的特殊字符并启用延迟扩展
在Makefile中,用%%表示cmd中的单个%,避免Make解析干扰;同时启用cmd的延迟扩展,确保同一行内刚设置的变量能被读取:
.PHONY: default default: @setlocal enabledelayedexpansion & set TEST=test & echo TEST is !TEST!
或者仅转义%(适用于cmd中变量已提前存在或不需要立即读取的场景):
.PHONY: default default: @set TEST=test & echo TEST is %%TEST%%
内容的提问来源于stack exchange,提问作者Maarten ten Velden
相关产品推荐
相关产品推荐

