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下是
.a,Windows是.lib),其值为空。
$<
依赖目标中的第一个目标名字,如果依赖目标是以模式(即”%“)定义的,则”$<”是符合模式的一系列的文件集
$?
所有比目标新的依赖目标的集合,以空格分隔
$^
所有依赖目标的集合,以空格分隔。如如果在依赖目标中有多个重复的,则自动去除重复的依赖目标,只保留一份
$+
同”$^”,也是所有依赖目标的集合,只是它不去除重复的依赖目标。
$*
目标模式中“%”及其之前的部分
$(@D)
“$@”的目录部分(不以斜杠作为结尾),如果”$@”中没有包含斜杠,其值为“.”(当前目录)
$(@F)
“$@”的文件部分,相当于函数”$(notdir $@)”
$(*D)
同”$(@D)”,取文件的目录部分
$(*F)
同”$(@F)”,取文件部分,但不取后缀名
$(%D)
函数包文件成员的目录部分
$(%F)
函数包文件成员的文件名部分
$(<D)
依赖目标中的第一个目标的目录部分
$(<F)
依赖目标中的第一个目标的文件名部分
$(^D)
所有依赖目标文件中目录部分(无相同的)
$(^F)
所有依赖目标文件中文件名部分(无相同的)
$(+D)
所有依赖目标文件中的目录部分(可以有相同的)
$(+F)
所有依赖目标文件中的文件名部分(可以有相同的)
$(?D)
所有被更新文件的目录部分
$(?F)
所有被更新文件的文件名部分
浙公网安备 33010602011771号