Makefile学习笔记

一、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中使用“#”字符,可以用反斜框进行转义,如:“\#”。
最后,还值得一提的是,在Makefile中的命令,必须要以[Tab]键开始。

 

二 Makefile的文件名

默认情况下,make程序会按顺序查找“GNUmakefile”、“makefile”和“Makefile”这三个文件名。GNUmakefile只能被GNU的make识别,一般不推荐用这个,因为大多数make只识别makefile和Makefile。推荐使用Makefile,相对于makefile来说,比较醒目。

当然,你也可以用其他文件名,但调用make命令的时候需要用-f或--file来显示指定文件。

 

三 Makefile的查找

include filename

如果需要在makefile中引用其他makefile,那么就可以通过上述命令包含。include前面可以有一个或多个空格,但不能是TAB。filename可以是包含路径的文件名(相对路径或绝对路径),也可以使用通配符或变量。譬如,你有foo.make,a.mk,b.mk,c.mk,d.mk等makefile文件。而且

bar = c.mk d.mk

那么可以如下写include命令

include foo.make *.mk $(bar)

如果没有指定makefile文件的路径,那么make程序首先在当前目录下查找。如果找不到,且你在启动make的时候使用了-I或--include-dir选项,指定了目录,则会在这些目录下查找。如果还找不到,则还会在/usr/local/bin或/usr/include等include目录下查找,一般就是这两个了。

如果上述过程中还找不到,则会继续载入makefile文件(应该是指当前makefile以及找到的makefile,需要实验一下),载入后再重新查找(根据载入的makefile中包含的路径来查找?还是需要实验)。如果还是找不到,那么就会给出一个致命的错误,并推出make程序。

如果你不想让make找不到文件时退出,那么可以在include前加-符号,表示不要理会发生的问题,继续执行。

-include foo.make *.mk $(bar)

 

posted @ 2010-10-24 23:29  茫茫深海一条鱼  阅读(269)  评论(0)    收藏  举报