如何将GNU Make变量传递至Guile?
GNU Make传递变量到Guile的规范方案
问题场景
当前的Makefile规则尝试传递自动变量$*到Guile:
%.txt: @echo $* $(guile (string-upcase $*))
执行make foo.txt时触发Unbound variable: foo错误——因为Make展开后Guile代码变成(string-upcase foo),foo被当作未定义的Guile符号而非字符串值。
给$*加双引号能暂时解决基础场景的问题:
%.txt: @echo $* $(guile (string-upcase "$*"))
但如果$*包含双引号(比如目标是"bar".txt),会触发Guile语法错误,因为引号嵌套冲突。
规范解决方案
使用GNU Make为Guile内置的makefile-value函数,直接从Guile内部获取Make变量(包括自动变量)的值:
%.txt: @echo $* $(guile (string-upcase (makefile-value "*")))
原理说明
makefile-value的参数是不带$前缀的Make变量名,比如自动变量*、普通变量CC等。- 它会直接返回对应Make变量的原始字符串值,无需手动添加引号或处理转义,完美规避特殊字符(如双引号)引发的语法问题。
测试验证
执行make foo.txt会输出预期结果:
foo FOO
若目标是包含双引号的"bar".txt,执行make "\"bar\".txt"(需shell转义引号),会输出:
"bar" "BAR"
完全符合预期且无语法错误。
内容的提问来源于stack exchange,提问作者iter
相关产品推荐
相关产品推荐

