1 makefile
1.1 资料
跟我一起写Makefile — 跟我一起写Makefile 1.0 文档
陈皓,跟我一起写 Makefile,CSDN,2004.2。
整个系列有14篇文章。写的太棒了,强烈推荐读一读。不仅写的简洁,还把每个功能为什么存在,为什么要这样设计解释的很清楚。缺点是错别字也不少,不过不影响理解,感觉现在信息爆炸的时代,对错别字习以为常了。
注意CSDN里的文章列表顺序有点乱,但是文章的链接编号是正确的。
http://blog.csdn.net/haoel/article/details/2886 是第一篇文章
http://blog.csdn.net/haoel/article/details/2899 是最后一篇(第14)文章。
中间文章可以用修改超链接来索引。
1.2 基础
基础:makefile的设计理念
- 不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章。
- makefile所要解决的,问题本质

- makefile的哲学理念设计的非常棒啊,基本思路框架就是写出文件依赖关系,只要先决文件(prerequisites)比目标(targets)文件更新,则执行接下来缩进Tab里的内容。
1.3 动作名字
有个特殊的clean**:,这个不是文件,而是一个动作名字**,用来指定make clean的行为,可以删除中间文件。有点像C语言中的label一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。
1.4 定义变量
objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
使用的时候写:$(objects)
1.5 自动推导
make由于有自动推导,比如.o文件的生成会自动找同名的.c依赖文件以及用-c自动编译出.o文件,利用这点可以简化makefile文件。比如这样只需罗列每个.o依赖的h文件,相应的.c和生成命令不用写
make还有其他各种简化的语法,不过简化太多可能会导致文件依赖关系复杂不清~~孰优孰劣看个人喜好了~
2 书写规则
- 基本语法

- 在规则中使用通配符:“*”,“?”和“[…]”。这是和Unix的B-Shell是相同的。
- 还可以用~表示HOME目录,在windows对应为环境变量HOME。
- 注意用作变量的时候是不会自动展开的:objects = .o,正确写法应该是:
objects := $(wildcard .o)
- VPATH,增加搜索的包含目录(不过当前目录永远是搜索的最高优先级)
- 例如VPATH = src:../headers,可以用冒号隔开多个目录
- 还有更灵活的vpath
- vpath %.c foo:bar
vpath % blish
比如上述两句命令表示先在foo目录找.c文件,再在bar里找.c文件,最后再blish里找。
- vpath %.c foo:bar
- .PHONY : clean
- .PHONY是用来显式的指明clean是一个动作名字,而不是文件名。防止解析makefile时的歧义。
- 还有种用法是在一个makefile里编译出多个可执行文件

- (从第5篇博客开始可能看的就没那么细致,因为对makefile已经有基础的足够了解了)
3 书写命令
4 总结
- 对于上述所有的make的细节,我们不但可以利用make这个工具来编译我们的程序,还可以利用make来完成其它的工作,因为规则中的命令可以是任何Shell之下的命令,所以,在Unix下,你不一定只是使用程序语言的编译器,你还可以在Makefile中书写其它的命令,如:tar、awk、mail、sed、cvs、compress、ls、rm、yacc、rpm、ftp……等等,等等,来完成诸如”程序打包”、”程序备份”、”制作程序安装包”、”提交代码”、”使用程序模板”、”合并文件”等等五花八门的功能,文件操作,文件管理,编程开发设计,或是其它一些异想天开的东西。
- 最后,感受一下caffe的Makefile文件吧,其实自己写还是不会。。。。

现在终于知道了make all等都是在干什么,以及原理了。感动啊,又移除了心中一直存在的一大疑惑。
