Makefile字符串替换失效求助:无法将kvvm60替换为main
Makefile中patsubst替换失效的原因及解决方法
问题根源
你使用的patsubst是模式匹配替换函数,它的规则是:模式中的第一个%作为通配符匹配任意非空字符序列,后续的%会被当作普通字符处理。你写的%kvvm60%模式,实际是在匹配“任意字符序列 + kvvm60 + %”的字符串,而你的路径/home/kvvm60/foo/bar结尾没有%,完全匹配失败,因此不会执行替换。
另外,输出末尾的make: *** No targets. Stop.是因为你的Makefile没有定义任何可执行目标,Make不知道要完成什么任务。
解决方法
方法一:用subst做子串替换(推荐)
如果你只是想替换字符串中特定子串,不管它的位置,直接用subst函数即可,它会全局替换所有匹配的子串:
hello:= /home/kvvm60/foo/bar $(info inside hello $(hello)) TEST := $(subst kvvm60,main,$(hello)) $(info test is $(TEST)) # 添加空目标解决无任务报错 all: @echo Done
方法二:修正patsubst的匹配模式
如果一定要用patsubst,需要根据路径结构编写正确的模式。比如针对你的路径,可以这样写:
hello:= /home/kvvm60/foo/bar $(info inside hello $(hello)) # 匹配"任意字符序列 + kvvm60/",替换为"对应字符序列 + main/" TEST := $(patsubst %kvvm60/,%main/,$(hello)) $(info test is $(TEST)) all: @echo Done
内容的提问来源于stack exchange,提问作者kathy
相关产品推荐
相关产品推荐

