1.如果在makefile中第一个规则有多个目标的话,那么多个目标中的第一个将会被作为make的“终极目标“。有两种情况例外一.目标名以点号“.”开始的并且其后不存在斜线“/”(“./”被认为是当前目录;“../”被认为是上一级目录);二.模式规则的目标。当这两种目标所在的规则是Makefile的第一个规则时,它们并不会被作为“终极目标“。
2.通常规则的语法格式如下:
TARGETS:PREREQUISITES
COMMAND
...
或者
TARGETS:PREREQUISITES;COMMAND
COMMAND
...
注:规则中的“TARGETS”可以是空格分开的多个文件名,也可以是一个标签(例如:执行清空的“clean“)。”TARGETS“的文件名可以使用通配符
3.在Makefile中,在第一个规则之后出现的所有一[Tab]字符开始的行都会被当作命令來处理。
4.Makefile中符号“$”有特殊的含义(表示变量或者函数的引用),在规则中需要使用符号“$”的地方,需要书写两个连续的(“$$”)。
5.对于Makefile中的一个较长的行,可以使用反斜线"\"将其书写到几个独立的物理行上。
6.两种依赖:一类是:依赖文件被更新后,需要更新规则的目标;另一类是:更新这些依赖,不需要更新规则的目标;第二类成为“order-only“依赖。书写规则是,“order-only“依赖使用管道号“|”开始,作为目标的一个依赖文件。规则依赖列表中管道号“|”左边是常规依赖,管道号右边就是“order-only“依赖。书写格式如下:
TARGETS:NORMAL-PREREQUISITES | ORDER-ONLY-PREREQUISITES
7.Makefile中表示 文件名时可使用的通配符有: “*”、“?”、和“[...]”。在Makefile中通配符的用法和含义和Linux(unix)的Bourneshell完全相同。
8.Makefile中通配符可以出现的两种场合:
- 可以用在规则的目标、依赖中,make在读取Makefile时会自动对其进行匹配处理(通配符展开);
- 可出现在规则的命令中,通配符的通配处理是在shell在执行此命令时完成的。
9.变量定义中使用通配符不会被通配处理。
10.目录搜寻
- 一般搜索(变量VPATH)
VPATH=src:../headers
- 选择性搜索(关键字vpath)
1.vpath PATTERN DIRECTORIES //为所有符合模式“PATTERN”的文件指定搜索目录“DIRECTORIES”。多个目录使用空格或者冒号(:)分开。类似于“VPATH”变量。 2.vpath PATTERN //清除之前为符合模式“PATTERN”的文件设置的搜索路径 3.vpath //清楚所有已被设置的文件搜索路径
- 注:vpaht使用方法中的“PATTERN”需要包含模式字符“%”。“%”意思是匹配一个或者多个字符。
11.Makefile伪目标
将一个目标声明为伪目标的方法是将它作为特殊目标".PHONY"的依赖。
12.Makefile中的特殊目标
.PHONY; .SUFFIXES; .DEFAULT; .PRECIOUS; .INTERMEDIATE; .SECONDARY; .DELETE_ON_ERROR; .IGNORE; .LOW_RESOLUTION_TIME; .SILENT; .EXPORT_ALL_VARIABLES; .NOTPARALLEL;
13.多规则目标:Makefile中,一个文件可以作为多个规则的目标(多个规则中只能有一个规则定义命令)。这种情况时,以这个文件为目标的规则的所有依赖文件将会被合并成此目标一个依赖文件列表。
14.静态模式规则的语法
TARGETS...:TARGET-PATTERN:PREREQ-PATTERNS...
COMMANDS
...
15.双冒号规则就是使用“::”代替普通规则的“:”得到的规则。Makefile中,一个目标可以出现在多个规则中,但是这些规则必须是同一类型的规则,要么都是普通规则,要么都是双冒号规则。双冒号规则和普通规则的处理的不同点表现在以下几个方面:
- 双冒号规则中,当依赖文件比目标文件更新时。规则将会被执行。对于一个没有依赖而只有命令行的双冒号规则,当引用此目标时,规则的命令将会被无条件执行。而普通规则,当规则的目标文件存在时,此规则的命令永远不会被执行(目标文件永远是最新的)。
- 当通一个文件作为多个爽冒号规则的目标时。这些不同的规则会被独立处理,而不是像普通规则那样合并所有的依赖列到一个目标文件。就是说多个双冒号规则中的每一个依赖文件被改变之后,make只执行此规则定义的命令,而其它的以这个文件作为目标的双冒号规则将不会被执行。