Makefile系列文章第一篇 Makefile官方中文手册(一)什么是Makefile
2.1 什么是“规则”以及怎样编写“规则”
一个简单的Makefile包含若干个“规则”,每一个都有如下形式:
target ... : prerequisites ...
recipe
...
...
target
通常是一个文件名,这个文件是通过某些过程生成的,比如说通过编译生成的可执行文件或者目标文件,都可以作为target
。target
也可以是一个特定操作的名字,比如说“clean”,可以在“clean”下实现清除工程的命令。
prerequisite
是用来产生target
的文件,一个target通常需要依赖若干个文件。
recipe
是make将要执行的命令行,recipe
中可能会有一个或者多个命令。需要注意: 每一行recipe命令最前面必须要有一个tab
制表符,这一点常常让粗心大意的人掉到坑里。如果你习惯于用其他的符号(比如说空格)来缩进代码,你可以通过.RECIPEPREFIX
变量来改变这一设置。(参见6.14节 [特殊变量])。
recipe
命令行中通常会含有prerequisite
,如果prerequisite
中的文件被修改了,将用prerequisite
来生成目标文件target
。但是有一些规则中没有prerequisite
,比如说用来执行删除命令的target
就不需要prerequisite
.
Makefile中的“规则”解释了怎样以及什么时候来重新编译特定的文件,从而生成指定的目标。make命令执行recipe
中的命令行来操作prerequisite
中的文件,从而生成或更新目标target
。“规则”也可以用于解释怎样以及什么时候执行一些特定的动作。
一个Makefile文件可能会包含一些其他的文本,但是一个简单的Makefile仅仅需要包含“规则”。下面所举的例子中的规则可能看上去很复杂,但是它们基本上都符合上述的模板。
2.2 一个简单的Makefile
下面这个Makefile直接描述了一个可执行文件“edit”是如何依赖于其他的文件。可执行文件“edit”依赖于8个目标文件(*.o),而这8个目标文件又依赖于8个相应的C语言源文件和3个头文件。
我们将每一行用反斜杠分割成两行,这样的效果和一行是一样的,但是这样可读性更强
使用该Makefile文件生成可执行文件edit,应该在终端中输入:
make
使用该Makefile文件删除当前目录中的可执行文件和所有的目标文件,应该在终端输入:
make clean
在上面这个Makefile示例中,target
包括可执行文件“edit”以及“main.o”、“kbd.o”等目标文件(object file),而prerequisite
是指“main.c”、“defs.h”等文件。实际上每一个*.o文件都既是target
又是prerequisite
。recipe
包括“cc -c main.c”、“cc -c kbd.c”等命令。
当target
为一个文件时,当它的prerequisite
依赖文件被修改时,他就需要被重新编译和重新链接。在这个例子中edit依赖于8个目标文件;目标文件object.o依赖于源文件main.c以及defs.h头文件
recipe
可以跟在target
和prerequisite
所在行的下一行,recipe
告诉make命令怎样更新target
文件。为了在Makefile中区分recipe
和其它行,recipe
的最前面必须有一个制表符。(记住,make命令不知道recipe
中的命令是怎么样工作的,当target
需要被更新时,它只是简单的执行你所编写的recipe
)。