***********************************************
local OS :xp(SP3)
VM OS: ubuntu-10.04.2
kernel: 2.6.32-41-generic
VM:VMware-workstation-7.1.4
***********************************************
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.make的规则语法例子
2.依赖类型(常规依赖,order-only依赖,order-only依赖先不深入了解)
3.通配符("*" " ?" " [...]")
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Makefile中,规则描述了在何种情况下使用什么命令来重建一个特定的文件,此文件被称为规则“目标”(通常规则中的目标只有一个)。规则中出目标之外的罗列的其它文件称为“目标”的依赖,而规则的命令是用来更新或者创建此规则的目标文件。makefile的第一个规则应该就是重建整个程序或者多个程序的依赖关系和执行命令的描述。
通常规则的语法格式如下:
法一:
TARGETS : PREREQUISITES PREREQUISITES1 PREREQUISITES2 PREREQUISITES3 \
PREREQUISITES4 PREREQUISITES5 PREREQUISITES6
[TAB]COMMAND
...
TARGETS : PREREQUISITES PREREQUISITES1 PREREQUISITES2 PREREQUISITES3;COMMAND
...
说明: 1.TARGETS :目标文件(执行文件或者是object file,还可以是个标签,如伪目标 【:clean】)
2. PREREQUISITES:目标生成依赖的文件或者目标的列表 用空格分开,一行太长可以用
3.COMMAND: 要执行的命令
4.COMMAND直接跟在PREREQUISITES列表后用分号“;”间隔,另起一行的话用反斜线
另外注释用 “#”不用“//” 或者 “/**** ***/"看个例子:
main.o : mian.c defs.h # module for twiddling the frobs
cc -c -g main.c
main.o 是要重建的文件,main.c,defs.h是重建main.o所要用的文件,重建的文件称为规则的“目标”(main.o),而把重新目标所需要的文件(main.c,defs.h)称为规则的“依赖”(或者目标的依赖)。规则中的第二行“cc -c -g main.c”是规则的“命令”。根据中心思想可知:如何确定目标文件是否过期(需要重建目标),过期是指目标文件不存在或者目标文件“main.o”在时间戳上比依赖文件中的任何一个(“main.c”或者“defs.h”)“老”。(这个问题在makefile FAQ——跟着陈皓写makefile的Q4:Q4:make: `edit' is up to date.有说明),说到文件的依赖我不得不提到kernel下基于Kconfig强大的模块依赖建立关系。
SO!!
规则的中心思想是:目标文件的内容是由依赖文件文件决定,依赖文件的任何一处改动,将导致目前已经存在的目标文件的内容过期.
“order-only”依赖使用管道符号“|”开始,作为目标的一个依赖文件。规则依赖列表中管道符号“|”左边的是常规依赖,管道符号右边的就是“order-only”依赖。这样的规则书写格式如下:
TARGETS : NORMAL-PREREQUISITES | ORDER-ONLY-PREREQUISITES
举个例子:
LIBS = libtest.a
main: main.c | $(LIBS)
$(CC) $(CFLAGS) $< -o $@ $(LIBS)
说明:1.main.c 是常规依赖,$(LIBS)是order-only依赖
三种 通配符("*" " ?" " [...]"),跟C差不多,用着还行,不做更多分析要用这些字符可以用转义字符“ \”。值得注意的是在使用 *.o呀等涉及到依赖的时候考虑:使用“wildcard”函数(变量定义“(wildcard *.o) 支持变量展开 和 *。o 的区别”)和实现字符串的置换。
四、 变量
一般在我们书写 Makefile 时,各部分变量引用的格式我们建议如下:
1. make 变量(Makefile 中定义的或者是 make 的环境变量)的引用使用“$(VAR)”
格式,无论“VAR”是单字符变量名还是多字符变量名。
2. 出现在规则命令行中 shell 变量(一般为执行命令过程中的临时变量,它不属于
Makefile 变量,而是一个 shell 变量)引用使用 shell 的“$tmp”格式。
3. 对出现在命令行中的 make 变量我们同样使用“$(CMDVAR)” 格式来引用。