1. makefile工作流程是:
A. 取第一个目标
B. 根据依赖关系逐层建立依赖树
C. 反向根据依赖关系,运行用户定义的cmd
2. 模式匹配:
不是非常清楚 %和*有什么区别,做了两个实验
实验1:
TT: test.o test2.o test_main.o
gcc -o $@ $^
%.d:%.c
echo test
输出 两个test
实验2:
TT: test.o test2.o test_main.o
gcc -o $@ $^
*.d:*.c
echo test
输出3个test
感觉*是把当前目录下所有文件都会试验一次(每次取一个),而%是把相关文件(如何相关?)逐个取出
3. 对于自动生成依赖的理解
include $(OBJS:.o=.d) 行1
%.d:%.c 行2
@set -e; rm -f $@; / 行3
$(CXX) -MM $(CXXFLAGS) $< > $@.$$$$; / 行4
sed 's,/($*/)/.o[ :]*,/1.o $@ : ,g' < $@.$$$$ > $@; / 行5
rm -f $@.$$$$
我们的目标就是生成类似
.o: .c .h的关系(借助于GCC自动产生文件依赖)。之所以会有上面这么复杂的过程。
A. 首先我们想到如何生成依赖--->行4
B. 如何为所有文件生成呢? ---->行2 每次取其中一个
C. 如何把它加入进来--->行1
D. 如何让其可以每次都自己更新呢,就得让它与源文件产生关系--->行3
个人认为.d的生成是因为include 此.d时找不到,触发了行2(因为在没有.d时,.d其实和依赖树没有产生任何关系,而且即使后来有.d后,也没有直接关系。所以按理不会执行到行2。有点饶口)。
结论:include可能是把.d加入到依赖树的根结点处
4. 关于sed的用法:http://wenku.baidu.com/view/1da0da1755270722192ef7a3.html