日期:2014-05-16  浏览次数:20577 次

〈跟我一起写Makefile〉 疑问 请教
本帖最后由 everysmile 于 2013-01-08 20:15:55 编辑
〈跟我一起写Makefile〉中有如下一段代码以及描述如下:
%.d: %.c
@set -e; rm -f $@; /
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; /
sed 's,/($*/)/.o*,/1.o $@ : ,g' < $@.$$$$ > $@; /
rm -f $@.$$$$

总而言之,这个模式要做的事就是在编译器生成的依赖关系中加入文件的依赖,即把依赖关
系:
main.o : main.c defs.h
转成:
main.o main.d : main.c defs.h


有些地方没有弄的太明白,高手指点一下:
1)我不太明白,为什么需要将main.d添加进去。
我的理解为:自动生成了main.d,其中包含了依赖关系:main.o : main.c defs.h,然后再通过Include将main.d包含到Makefile中。后续程序在编译的时候即可找到main.o的依赖关系即可完成main.o的编译操作,为什么还要完成将 “main.o : main.c defs.h 转成:main.o main.d : main.c defs.h”的操作呢?

2)顺带问个小问题:@set -e; 有什么作用?

高手、版主不吝赐教,多谢多谢~~

------解决方案--------------------
这是一个类似于hack的做法,目的就是为了检测header file的变化

比如说我有a.c include a.h, a.h include <stdio.h> 一开始都没有问题

a.d: a.c
a.o: a.c a.h stdio.h

现在我加入一个header b.h,a.h include b.h

因为目前 a.d 中 仍然是 a.o 会检测 a.h的变化,所以这一次改动会导致a.o 重新生成,那么下次你改b.h的时候就没有这么幸运了,因为a.d 中没有b.h 的依赖

所以这个hack就是强制a.d 跟随header file同步,让a.d 把b.h 也加入到依赖中

set -e 是所谓的erronexit,简单说就是shell中任何command 出错都导致exit shell,(实际比这个复杂),初衷是为了加强错误检测,详情可见 http://www.davidpashley.com/articles/writing-robust-shell-scripts.html#id2596016
------解决方案--------------------
引用:
引用:这是一个类似于hack的做法,目的就是为了检测header file的变化

比如说我有a.c include a.h, a.h include <stdio.h> 一开始都没有问题

a.d: a.c
a.o: a.c a.h stdio.h

现在我加入一个header b.h,a.h include b.h

……


是的啊