1、基本原理
Make根据文件的时间关系来更新目标,他根据makefile中定义的规则,如果依赖文件
的时间比目标文件更新,则更新目标文件,以及其他依赖更新目标文件的目标。
一个简单的 Makefile描叙规则如下:
Target : prerequisites
Command
Target为规则的目标,通常是程序中间或者最后需要生成的文件名,也可以仅仅是一个标识,如用来执行某个动作(这样的目标称为伪目标)。
Prerequisites为目标的依赖文件。
Command为更新目标所需要执行的动作,如编译源文件等,可以是任意的shell命令或可在shell下执行的程序。一个规则可以有多个命令行,每个命令行必须以Tab开始。
Makefile中的第一个规则指定的目标默认为终极目标,make执行时如果没有指定目标,则总是生成第一个规则指定的目标。
2、变量
Makefile中可以定义变量,赋值后使用,如
objects= main.o kdb.o hello.o
在需要objects的地方,使用$(objects)来代替一长串的目标文件,另外一个最常用的变量是指定编译工具,如:
cc= gcc
在规则中然后使用 $(cc) –c –o hello.o hello.c
Makfile中变量展开是个严格的字符串替换过程,类似于c中的define展开。变量的定义有两种方法,一种是通过=和define定义,这种变量只在使用他时候才展开,可能导致递归溢出,称为递归展开式变量,另一个种方式是通过:=定义,在定义的时候就展开,称为直接展开式变量,直接展开式变量中对其他变量的引用在定义时就被展开。
3、隐含规则
.o文件默认总是从.c文件编译得到,这个是make的隐含规则,如:
main.o:main.cdefs.h
gcc–o main.o –c main.c defs.h
可以写成:
main.o:defs.h
4、清除中间文件
.PHONY: clean
clean:
-rmedit $(objects)
.PHONY明确指定clean为一个伪目标,而rm前的-表示忽略rm的执行错误
5、Makefile的组成
1) 显示规则
2) 隐含规则
3) 变量定义
4) 指示符 make在读取makefile过程中需要执行的一个动作,如包含另一个
makfile等
5) 注释 #开头的文本行
6、Makefile中包含其他makefile文件
通过include指示符,告诉make去读取相应的makfile文件,格式如下:
includeFILENAMES
这和c中间的预处理有相似之处。