有关跟我学写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 $@.$$$$
...全文
418 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
同求,感觉只能看懂一部分
跟我一起 Makefile 作者:陈皓 整理:祝冬华 来源网络,希望能与大家分享这份学习资料,资源分数也设置了最低值,如有侵权,请联系我删除文件。 第一部分、概述 (6) 第二部分、关于程序的编译和链接 (6) 第三部分、Makefile 介绍 (7) 一、Makefile的规则 (7) 二、一个示例 (8) 三、make是如何工作的 (9) 四、makefile中使用变量 (10) 五、让make自动推导 (11) 六、另类风格的makefile (12) 七、清空目标文件的规则 (13) 第四部分、Makefile 总述 (13) 一、Makefile有什么? (13) 1、显式规则。 (14) 2、隐晦规则。 (14) 3、变量的定义。 (14) 4、文件指示。 (14) 5、注释。 (14) 二、Makefile的文件名 (15) 三、引用其它的Makefile (15) 四、环境变量 MAKEFILES (16) 五、make的工作方式 (16) 第五部分、书规则 (17) 一、规则举例 (17) 二、规则的语法 (17) 三、在规则中使用通配符 (18) 四、文件搜寻 (19) 五、伪目标 (20) 六、多目标 (22) 七、静态模式 (22) 八、自动生成依赖性 (24) 第六部分书命令 (25) 一、显示命令 (26) 二、命令执行 (26) 三、命令出错 (27) 四、嵌套执行make (28) 五、定义命令包 (30) 第七部分使用变量 (30) 一、变量的基础 (31) 二、变量中的变量 (32) 三、变量高级用法 (34) 四、追加变量值 (37) 五、override 指示符 (37) 六、多行变量 (38) 八、目标变量 (39) 九、模式变量 (40) 第八部分使用条件判断 (40) 一、示例 (40) 二、语法 (42) 第九部分使用函数 (43) 一、函数的调用语法 (44) 二、字符串处理函数 (44) 1、subst (44) 2、patsubst (45) 3、strip (45) 4、findstring (46) 5、filter (46) 6、filter-out (46) 7、sort (47) 8、word (47) 9、wordlist (47) 10、words (47) 11、firstword (48) 12、字符串函数实例 (48) 三、文件名操作函数 (48) 1、dir (48) 2、notdir (48) 3、suffix (49) 4、basename (49) 5、addsuffix (49) 6、addprefix (49) 7、join (50) 四、foreach 函数 (50) 五、if 函数 (50) 六、call函数 (51) 七、origin函数 (51) “undefined” (52) “default” (52) “file” (52) “command line” (52) “override” (52) “automatic” (52) 八、shell函数 (53) 九、控制make的函数 (53) 1、error (53) 2、warning (54) 第十部分 make 的运行 (54) 二、指定Makefile (54) 三、指定目标 (55) “all” (56) “clean” (56) “install” (56) “print” (56) “tar” (56) “dist” (56) “TAGS” (56) “check”和“test” (56) 四、检查规则 (57) 五、make的参数 (57) 第十一部分隐含规则 (61) 一、使用隐含规则 (61) 二、隐含规则一览 (62) 1、编译C程序的隐含规则 (63) 2、编译C++程序的隐含规则 (63) 3、编译Pascal程序的隐含规则 (63) 4、编译Fortran/Ratfor程序的隐含规则 (63) 5、预处理Fortran/Ratfor程序的隐含规则 (63) 6、编译Modula-2程序的隐含规则 (63) 7、汇编和汇编预处理的隐含规则 (64) 8、链接Object文件的隐含规则 (64) 9、Yacc C程序时的隐含规则 (64) 10、Lex C程序时的隐含规则 (64) 11、Lex Ratfor程序时的隐含规则 (65) 12、从C程序、Yacc文件或Lex文件创建Lint库的隐含规则 (65) 三、隐含规则使用的变量 (65) 1、关于命令的变量。 (65) 2、关于命令参数的变量 (66) 四、隐含规则链 (67) 五、定义模式规则 (68) 1、模式规则介绍 (68) 2、模式

23,217

社区成员

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

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