${COMPILE_PATH}/%.c.d:%.cpp
$(CC) $(CFLAGS) ${CFLAGS_NDBG} -MM -E $^ > $@
@sed 's/.*\.o/$(subst /,\/, $(dir $@))&/g' $@ >$@.tmp
@mv $@.tmp $@
$(subst /,\/, $(dir $@))
,我不理解这句话,subst
的第二个论点是\/
,为什么?将/
更改为\/
?
答案 0 :(得分:2)
路径中的斜杠需要转义,因为sed
脚本使用斜杠作为正则表达式分隔符。未转义的斜线会过早终止替换表达式。
但是,解决此问题的更好方法是使用备用分隔符 - sed
有助于您在此使用任何惩罚字符;斜杠只是一个常见的默认值。
临时文件也是一个很容易避免的疣。
${COMPILE_PATH}/%.c.d:%.cpp
$(CC) $(CFLAGS) ${CFLAGS_NDBG} -MM -E $^ \
| sed 's|.*\.o|$(dir $@)/&|g' >$@
(我猜这里g
标志实际上也是完全多余的。)
答案 1 :(得分:1)
因为它在sed
命令中使用,其中裸/
将被视为s///
命令的结尾。
这就是说替代解决方案(假设您可以对目录名称中哪些字符合法做出任何保证)本来应该使用s///
的不同分隔符,例如;
(即s;.*\.o;$(dir $@)&;g
)或!
(即s!.*\.o!$(dir $@)&!g
)
答案 2 :(得分:0)
看起来他们正在将/更改为转义版本。