file:E:\26.2012linux%C5%E0%D1%B5\Linux%20Basic\1.1Linux%20Base%20Introduction\makefile\GNU%20MAKE%20%D6%D0%CE%C4%CA%D6%B2%E1.pdf
file:E:\26.2012linux%C5%E0%D1%B5\Linux%20Basic\1.1Linux%20Base%20Introduction\makefile\%B8%FA%CE%D2%D2%BB%C6%F0%D0%B4Makefile.pdf
Makefile的组成:
Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书
写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗
糙地简略地书写Makefile,这是由make所支持的。
3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有
点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置
上。
4、文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像
C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像
C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我
会在后续的部分中讲述。
5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这
个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框
进行转义,如:“\#”。
make的工作方式
1、读入所有的Makefile。
2、读入被include的其它Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
规则的语法
targets : prerequisites
command
...
或是这样:
targets : prerequisites ; command
command
...
PS:command是命令行,如果其不与“target rerequisites”在一行,那么,必须以[Tab键]
开头,如果和prerequisites在一行,那么可以用分号做为分隔。(见上)
文件搜寻
变量方式:
VPATH = src:../headers
上面的的定义指定两个目录,“src”和“../headers”,make会按照这个顺序进行搜索。
目录由“冒号”分隔。(当然,当前目录永远是最高优先搜索的地方)
关键字:
1、vpath <pattern> <directories>
为符合模式<pattern>的文件指定搜索目录<directories>。
2、vpath <pattern>
清除符合模式<pattern>的文件的搜索目录。
3、vpath
清除所有已被设置好了的文件搜索目录。
eg:
vpath %.h ../headers
该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件。(如果某文
件在当前目录没有找到的话)
伪目标
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff
“make clean”将清除所有要被清除的文件。“cleanobj”和“cleandiff”这两个伪目标有点
像“子程序”的意思。我们可以输入“make cleanall”和“make cleanobj”和“make
cleandiff”命令来达到清除不同种类文件的目的。
静态模式
静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和
灵活。我们还是先来看一下语法:
<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
...
targ