makefile模式规则

来源:互联网 发布:ps软件收费吗 编辑:程序博客网 时间:2024/06/05 19:47
模式规则类似于普通规则,只是在模式规则中,目标的定义中需要包含“%”字符(确切地说是一个),包含“%”的目标被用来匹配一个文件名,“%”可以匹配任何非空字符串。1、文件名中“%”匹配的部分称为“茎”。2、规则的依赖文件中同样可以使用“%”,依赖中的“%”的取值情况由“茎”决定。3、规则的依赖文件也可以不包含模式字符“%”,此时,它表示所有符合目标模式的目标文件都依赖于一个指定的文件。4、模式的匹配   首先根据规则定义的目标模式匹配实际的目标文件,确定“茎”,之后使用 “茎”替代规则依赖文件名中的模式字符“%”,生成依赖文件名。这样就形成了一个明确指定了目标和依赖文件的规则。   当目标模式中包含斜杠(目录部分)。在进行目标文件匹配时,文件名中包含的目录字符串在匹配之前被移除,只进行基本文件名的匹配;匹配成功后,再目录加入到匹配之后的字符串之前形成“茎”。文字的描述看起来比较复杂,来看一个例子:例如目标模式为“e%t”,文件“src/eat”匹配于这个目标模式,那么“茎”就是“src/a”;模式规则中依赖文件的产生是:首先使用“茎”非目录部分(“a”)替代依赖文件中的模式字符“%”,之后再将目录部分(“src/”)加入到形成的依赖文件名之前构成依赖文件的全路径名。这里如果模式规则的依赖模式为“c%r”,则那么目标“src/eat”对应的依赖文件就为“src/car”。同样一个模式规则可以由多个目标文件。但是多个目标的模式规则和普通的多目标的规则有些不同,普通多目标的规则的处理是将每一个目标作为一个独立的规则来处理,所以多个目标就就对应多个独立的规则(这些规则各自有自己的命令行,各个规则的命令行可能相同)。但对于多目标的模式规则,所有规则的目标共同拥有依赖文件和规则的命令行,当文件符合多个目标模式中的任何一个时,规则定义的重建命令可能将会执行;因为多个目标共同用于这个规则的命令行,因此一次命令执行之后,规则不会再去检查是否需要重建符合其它模式的目标。#sample MakefileObjects = foo.o bar.oCFLAGS := -Wall%x : CFLAGS += -g%.o : CFLAGS += -O2%.o %.x : %.c$(CC) $(CFLAGS) $< -o $@当我们在命令行中执行“make foo.o foo.x”时,会看到只有一个文件“foo.o”被创建了,同时make会提示“foo.x”文件是最新的(其实“foo.x”并没有被创建)。它表明了多目标的模式规则在make处理时是作为一个整体来处理的。这是多目标模式规则和多目标的普通规则的不同之处。最后需要说明的是:(1)模式规则在Makefile中的顺序需要注意,当一个目标文件符合多个模式规则的目标时,make将会按照第一个找到的作为重建它的规则。(2)在Makefile中指定的模式规则会覆盖隐含的模式规则。就是说在Makefile中明确指定的会替代隐含的模式规则。(3)另外,依赖文件存在或者被提及的规则,优先于那些需要使用隐含规则来创建其依赖文件的规则。

原创粉丝点击