对makefile的一点理解

来源:互联网 发布:小米自带的网络助手 编辑:程序博客网 时间:2024/05/03 12:13

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