这个Makefile语句的含义是什么?

时间:2015-05-04 15:54:57

标签: makefile

${COMPILE_PATH}/%.c.d:%.cpp
$(CC) $(CFLAGS) ${CFLAGS_NDBG} -MM -E $^ > $@
@sed 's/.*\.o/$(subst /,\/, $(dir $@))&/g' $@ >$@.tmp
@mv $@.tmp $@

$(subst /,\/, $(dir $@)),我不理解这句话,subst的第二个论点是\/,为什么?将/更改为\/

3 个答案:

答案 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)

看起来他们正在将/更改为转义版本。