Makefile学习

在*unix下编译工程一般使用make命令,make命令执行时,需要一个Makefile文件,告诉make怎么样去编译和链接程序。

一、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】键开始。

二、Makfile的文件名
默认的情况下,make命令会在当前目录下按顺序寻找文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用Makefile这个文件名,因为这个文件名第一个字符为大写,这样有一种显目的感觉。最后不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的makefile文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。

当然,你也可以使用别的文件名来书写makefile,比如“Make.Linux”,“Make.Solaris”,“Make.Aix”等,如果要指定特定的Makefile,你可以使用make的-f或–file参数,如:make -f Make.Linux或make –file Make.Aix。

三、引用其他的Makefile
在Makefile使用include关键字可以把别的makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。
include的语法是:include, filename可以是当前操作系统shell的文件模式(可以包含路径和通配符)
在include前面可以有一些空字符,但是绝不能是【tab】键开始。include和可以用一个或多个空格隔开。举个例子,你有这样几个makefile:a.mk、b.mk、c.mk, 还有一个文件叫foo.make,以及一个变量$(bar), 其中包含了e.mk、f.mk,那么下面的语句:
include foo.make *.mk $(bar)
等价于: include foo.make a.mk b.mk c.mk e.mk f.mk

make命令开始时,会去寻找include所指出的其他Makefile,并把其内容安置在当前的位置。就好像C/C++的include指令一样。如果文件都没有指定据对路径或相对路径的话,make会在当前目录下首先寻找,如果当前目录没有找到,那么make还会在一下的几个目录下寻找:
1、如果make执行时,有-I或者–include-dir参数,那么make就会在这个参数指定的目录下寻找。
2、如果目录/include(一般是:/usr/local/bin或/usr/include)存在的话,make也会去找。

如果有文件没有找到的话,make会生成一条警告信息,但不会马上出现致命错误。他会继续载入其他的文件,一旦完成makefile的读取,make会再重试这些没有找到,或是不能读取的文件,如果还是不行,make才会出现一条致命信息。如果你想让make不理那些无法读取的文件,而继续执行,你可以在include前加一个减号“-”,如:-include,表示无论include过程出现什么错误,都不要报错继续执行。和其他版本make兼容的相关明是sinclude。其作用和这一个是一样的。

四、环境变量Makefile

三、Makefile的规则

1、.PHONY标识后面跟着的是一个伪目标。
2、在命令前加一个小减号意思是:也许某些文件出现问题,但不用管。忽略出现的问题。
3、clean的规则要放在makefile的最后。

文章目录