Makefile中模式为函数返回值时patsubst与subst为何失效?
Makefile中patsubst/subst函数使用call返回值失效问题
我编写了一个包含new和new2两个目标的Makefile,期望用patsubst和subst函数移除或替换路径中的特定字符串。new目标里函数工作正常,但new2目标中,当模式或替换值来自函数返回值时,函数直接失效。
我的Makefile代码:
path := .././../log from := log new: @echo "new------------" @echo $(path) @echo $(from) @echo $(patsubst %$(from),%,$(path)) @echo $(subst $(from),, $(path)) define get_log log endef from2 := $(call get_log, $(path)) new2: @echo "new2------------" @echo $(path) @echo $(from2) @echo $(patsubst %$(from2),%,$(path)) @echo $(subst $(from2),, $(path))
执行make new new2后的输出:
new------------ .././../log log .././../ .././../ new2------------ .././../log log .././../log .././../log
问题原因
问题出在get_log宏定义里的log前面有多余的空格。Makefile中define定义的宏会保留内容里的所有空白字符,所以from2的实际值是带四个前导空格的log,而不是纯字符串log。这时候用%$(from2)去匹配.././../log时,因为目标字符串的后缀是无空格的log,完全不匹配;subst函数也找不到带空格的子串,自然无法完成替换。
解决方法
有两种方式可以修复:
修改宏定义,去除多余空格
把get_log里的log前面的空格删掉:define get_log log endef用strip函数去除返回值的前后空白
如果不能修改宏定义,可以在调用后用strip函数清理from2的前后空格:from2 := $(strip $(call get_log, $(path)))
内容的提问来源于stack exchange,提问作者bin
相关产品推荐
相关产品推荐

