有关跟我学写MAKEFILE里的自动生成依赖性

guan323333 2009-09-09 02:12:25
啃了跟我学写MAKEFILE半天发现实在啃不动了,里面1.5.8那节里的自动生成依赖性里的这段代码谁能解释下吗?最好一句一句的慢慢说下明白好吗?或者谁给我点相关的资料能让我读懂下面这段话的,并且理解这个东西到底怎么用,谢谢哈

%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
...全文
410 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinyongcom666 2010-11-20
  • 打赏
  • 举报
回复
既然生成的.d文件立即删除那又使.d文件依赖.c.h文件干啥
qiaoliang328 2009-10-10
  • 打赏
  • 举报
回复
楼上的,请问你说的include是指哪个include啊?
bourbaki 2009-09-10
  • 打赏
  • 举报
回复
原理上的关键点在那个include语句,这个你查查makefile文档,这个include会造成make重复解析makefile。
bourbaki 2009-09-10
  • 打赏
  • 举报
回复
这个东西的用法参见http://topic.csdn.net/u/20090407/11/031db907-bf92-47da-bd2c-189f01abff9d.html
bourbaki 2009-09-10
  • 打赏
  • 举报
回复
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$

第一句:
set -e设置成这种情况,如果某个命令的返回参数非0,那么整个程序立刻退出. rm -f是删除之前编译的.d文件。
第二句:
编译依赖文件,并把它的名字根据进程号命名成一个临时文件,用进程号命名是一个技巧,这样重名的可能性很小。
第三句:
sed后面''里面是一个sed命令。整个命令的结构是s,match,replace,g, 其中s后面的,号就是常见的/,一般写成s/pattern/pattern/的形式,但也可以把/替换成其他符号,比如这里是逗号。g是全局的意思,具体你查查sed。match和replace都是正则表达式。match部分,要先解析makefile的元字符,$*和$@,这个你查查makefile。\(\)是为了后面的引用,后面的\1就是引用这里\(和\)之间括起的部分模式。[ :]也很好理解,你查查正则表达式的文档。其他的应该很好理解了。整句话的意思是把临时文件做一个修改然后写入目标文件。这个修改是这样的,临时文件的第一行是
my-c-file.o: my-c-file.c ...
修改后是
my-c-file.o my-c-file.d : my-c-file.c ...
第四句:
不用说了吧
mymtom 2009-09-10
  • 打赏
  • 举报
回复
$$$$:
整个脚本(从@set -e 到 rm -f $@.$$$$)会在一个shell里执行,
$$$$在Makefile转义后是传给shell的是$$也就是shell的进程号,
作为临时文件的唯一标识。

sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g'

如果.c为hello.c, 就是执行
sed 's,\(hello\)\.o[ :]*,\1.o $@ : ,g'
\( \) \n 是正则表达式中的子表达式(subexpressions/back-references)

将:

hello.o : hello.c /usr/include/stdio.h /usr/include/sys/stdsyms.h \
/usr/include/sys/types.h /usr/include/sys/stdsyms.h \
/usr/include/sys/_inttypes.h /usr/include/sys/stdsyms.h \
/usr/include/machine/vmtypes.h /usr/include/sys/_fd_macros.h \
/usr/include/sys/_null.h /usr/include/sys/_size_t.h \
/usr/include/sys/stdsyms.h /usr/include/string.h \
/usr/include/sys/_inttypes.h /usr/include/sys/_null.h

改为

hello.o hello.d : hello.c /usr/include/stdio.h /usr/include/sys/stdsyms.h \
/usr/include/sys/types.h /usr/include/sys/stdsyms.h \
/usr/include/sys/_inttypes.h /usr/include/sys/stdsyms.h \
/usr/include/machine/vmtypes.h /usr/include/sys/_fd_macros.h \
/usr/include/sys/_null.h /usr/include/sys/_size_t.h \
/usr/include/sys/stdsyms.h /usr/include/string.h \
/usr/include/sys/_inttypes.h /usr/include/sys/_null.h

mymtom 2009-09-10
  • 打赏
  • 举报
回复
$$$$:
整个脚本(从@set -e 到 rm -f $@.$$$$)会在一个shell里执行,
$$$$在Makefile转义后是传给shell的是$$也就是shell的进程号,
作为临时文件的唯一标识。

sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g'

将:

hello.o hello.d : hello.c /usr/include/stdio.h /usr/include/sys/stdsyms.h \
/usr/include/sys/types.h /usr/include/sys/stdsyms.h \
/usr/include/sys/_inttypes.h /usr/include/sys/stdsyms.h \
/usr/include/machine/vmtypes.h /usr/include/sys/_fd_macros.h \
/usr/include/sys/_null.h /usr/include/sys/_size_t.h \
/usr/include/sys/stdsyms.h /usr/include/string.h \
/usr/include/sys/_inttypes.h /usr/include/sys/_null.h



hello.o : hello.c /usr/include/stdio.h /usr/include/sys/stdsyms.h \
/usr/include/sys/types.h /usr/include/sys/stdsyms.h \
/usr/include/sys/_inttypes.h /usr/include/sys/stdsyms.h \
/usr/include/machine/vmtypes.h /usr/include/sys/_fd_macros.h \
/usr/include/sys/_null.h /usr/include/sys/_size_t.h \
/usr/include/sys/stdsyms.h /usr/include/string.h \
/usr/include/sys/_inttypes.h /usr/include/sys/_null.h
rainbowbaby 2009-09-10
  • 打赏
  • 举报
回复
首先你需要学习一个什么叫nakefile内部自动变量,之后就能看懂了。
yangjiafa_jia 2009-09-10
  • 打赏
  • 举报
回复
同求,感觉只能看懂一部分

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧