5.18下午 口语课 阅读

 

 

 

 

 

2.  使用模式规则

 

  可以使用模式规则定义一个隐式规则。和一般规则类似,只是在模式规则中,目标的定义需要有“%”字符。“%”定义对文件名的匹配,表示任意长度的非空字符串。在依赖目标中同样可以使用“%”,只是依赖目标中“%”的取值,取决于其目标。

 

模式规则中“%”的展开和变量与函数的展开是有区别的,“%”的展开发生在变量和函数的展开之后。变量和函数的展开发生在make载入Makefile时,而“%”的展开则发生在运行时。

 

  1)  模式规则举例

 

  模式规则中,至少在规则的目标中要包含“%”符号。

 

  %.o : %.c ; <command ......>

 

  其含义是,字指出了从所有的.c文件生成相应的.o文件的规则。如果要生成的目标是”a.o b.o”,那么

 

  %.c”就是”a.c b.c”

 

  %.o : %.c

 

  $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

 

  表示把所有的.c文件都编译成.o文件。

 

  其中,“$@”表示所有目标的集合,”$<”表示所有依赖目标的集合(在模式定义规则的情形下)。

 

  2)  自动化变量

 

  自动化变量只应出现在规则的命令中。

 

变量

 

含义

 

$@

 

表示规则中的所有目标文件的集合。在模式规则中如果有多个目标,“$@”就是匹配于目标中模式定义的集合

 

$%

 

仅当目标是函数库文件时,表示规则中的目标成员名,如果目标不是函数库文件(UNIX下是

 

.aWindows.lib),其值为空。

 

$<

 

依赖目标中的第一个目标名字,如果依赖目标是以模式(即”%“)定义的,则”$<”是符合模式的一系列的文件集

 

$?

 

所有比目标新的依赖目标的集合,以空格分隔

 

$^

 

所有依赖目标的集合,以空格分隔。如如果在依赖目标中有多个重复的,则自动去除重复的依赖目标,只保留一份

 

$+

 

”$^”,也是所有依赖目标的集合,只是它不去除重复的依赖目标。

 

$*

 

目标模式中“%”及其之前的部分

 

$(@D)

 

“$@”的目录部分(不以斜杠作为结尾),如果”$@”中没有包含斜杠,其值为“.”(当前目录)

 

$(@F)

 

“$@”的文件部分,相当于函数”$(notdir $@)”

 

$(*D)

 

”$(@D)”,取文件的目录部分

 

$(*F)

 

”$(@F)”,取文件部分,但不取后缀名

 

$(%D)

 

函数包文件成员的目录部分

 

$(%F)

 

函数包文件成员的文件名部分

 

$(<D)

 

依赖目标中的第一个目标的目录部分

 

$(<F)

 

依赖目标中的第一个目标的文件名部分

 

$(^D)

 

所有依赖目标文件中目录部分(无相同的)

 

$(^F)

 

所有依赖目标文件中文件名部分(无相同的)

 

$(+D)

 

所有依赖目标文件中的目录部分(可以有相同的)

 

$(+F)

 

所有依赖目标文件中的文件名部分(可以有相同的)

 

$(?D)

 

所有被更新文件的目录部分

 

$(?F)

 

所有被更新文件的文件名部分

 

posted @ 2017-05-18 17:20  张雪  阅读(133)  评论(0)    收藏  举报