GNU Make中findstring匹配含路径的参数不生效问题
问题成因
- 展开时机不匹配
这是最高发的原因:如果你的$1是规则的自动变量(如$<、$@)或是用=定义的延迟展开变量,$(if)、$(findstring)属于Makefile解析阶段就会执行的内置函数,此时自动变量还未完成赋值,实际传入findstring的是空值,自然返回no;而你打印$1的操作如果写在规则的shell命令行中,属于规则执行阶段的操作,此时自动变量已经赋值完成,就会显示带foo的路径。
手动替换路径时相当于直接传入固定字符串,不存在展开时机差的问题,所以可以正常返回yes。 - 参数携带不可见字符
如果$1的取值来自shell命令输出、文件读取等外部输入,可能携带打印时不可见的控制字符(如0宽空格、回车符、换行符),比如实际$1的值为../.././f<0x200b>oo/bar/src/io,打印时看不到0宽空格,看起来和正常路径一致,但findstring无法匹配到完整的foo子串;手动替换时输入的是无冗余字符的正常路径,所以可以匹配成功。 - 参数包含未解析的转义符
如果$1是通过$(shell)调用其他命令得到的返回值,可能携带shell层面的转义符,比如实际值为../.././\f\o\o/bar/src/io,打印时转义符会被shell处理掉,显示为正常路径,但Make的findstring会把转义符当做普通字符处理,自然匹配不到foo。 - 自定义函数使用了立即展开
如果你把这段条件判断封装成了自定义函数,且定义函数时用了:=做立即展开,定义阶段$1还没有传入参数,findstring的第二个参数会被直接展开为空,后续调用函数时这段条件已经固定返回no,自然无法匹配;手动替换路径相当于直接写死了值,不受展开时机影响。
内容的提问来源于stack exchange,提问作者Damuno
相关产品推荐
相关产品推荐

