Makefile变量特殊符号问题:按VERBOSE控制输出重定向至日志/屏幕
修复Makefile中按VERBOSE控制输出重定向的问题
问题出在立即展开变量(:=)的时机:你用:=定义OUTPUT时,Make会在解析变量阶段就展开$$@为$@,但此时全局上下文里$@还没有对应到具体目标名($@是规则上下文变量,只有在规则命令执行时才会被替换为当前目标),所以最终$@被解析为空,导致日志文件名变成.log。
解决方案:改用延迟展开变量(=)
把OUTPUT的定义从立即展开(:=)改成延迟展开(=),这样变量会在规则命令执行阶段才展开,此时$@已经能正确对应到目标名(比如target),就能生成预期的target.log。
修改后的Makefile代码:
ifeq "$(VERBOSE)" "yes" OUTPUT = 2>&1 | tee $@.log else OUTPUT = > $@.log 2>&1 endif target: my_command $(OUTPUT)
验证效果
执行make VERBOSE=yes target时,命令会被解析为:
my_command 2>&1 | tee target.log
执行make target(未设置VERBOSE)时,命令会被解析为:
my_command > target.log 2>&1
另一种方案:直接在规则命令中做条件判断
如果不想依赖延迟变量,也可以直接在目标的命令块里写条件判断,这样更直观,每个目标的逻辑也更清晰:
target: ifeq "$(VERBOSE)" "yes" my_command 2>&1 | tee $@.log else my_command > $@.log 2>&1 endif
这种方式不需要全局变量,所有替换都在规则上下文里完成,$@能正确匹配目标名。
内容的提问来源于stack exchange,提问作者user2052436
相关产品推荐
相关产品推荐

