想要书写一个 Makefile,需要了解 Makefile 的相关的书写规则。我们已经知道了 Makefile 是我们文件编译的相关规则的描述,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令,其结构如下所示:
targets:prerequisites
command
或者是
targets:prerequisites;command
command
相关说明如下:
targets:我们的目标,可以是 Object File(我们称它为中间的文件),也可以是可执行文件,还可以是一个标签;
prerequisites:是我们的依赖文件,要生成 targets 需要的文件或者是目标。可以是多个,也可以是没有;
command:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。
注意:我们的目标和依赖文件之间要使用冒号分隔开,命令的开始一定要使用Tab键。
我们通过下面的例子来具体使用一下我们的规则:
test:test.c gcc -o test test.c
我们在 Makefile 中实现的功能就是编译 test.c 文件,我们通过这个实例可以详细的说明一下 Makefile 的具体的使用情况。其中 test 是我们的目标文件,也是我们的最终生成的可执行文件,我们的依赖文件就是 test.c 源文件,重建目标文件需要执行的操作是gcc -o test test.c。这就是我们的 Makefile 的基本的语法规则。
使用 Makefile 的方式:我们的编写好 Makefile,然后在命令行执行 "make" 命令,程序就会自动执行,得到我们的目标文件。
通过上面的例子我们可以了解到,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 中使用“#”字符,可以用反斜框进行转义,如:“\#”。