makefile模式规则

模式规则类似于普通规则,只是在模式规则中,目标的定义中需要包含“%”字符(确切地说
是一个),包含“%”的目标被用来匹配一个文件名,“%”可以匹配任何非空字符串。
1、文件名中“%”匹配的部分称为“茎”。
2、规则的依赖文件中同样可以使用“%”,依赖中的“%”的取值情况由“茎”决定。
3、规则的依赖文件也可以不包含模式字符“%”,此时,它表示所有符合目标模式的
目标文件都依赖于一个指定的文件。
4、模式的匹配
   首先根据规则定义的目标模式匹配实际的目标文件,确定“茎”,之后使用 “茎”替代规则依赖
文件名中的模式字符“%”,生成依赖文件名。这样就形成了一个明确指定了目标和依赖文件的规则。
   当目标模式中包含斜杠(目录部分)。在进行目标文件匹配时,文件名中包含的目录字符串在
匹配之前被移除,只进行基本文件名的匹配;匹配成功后,再目录加入到匹配之后的字符串之前形
成“茎”。文字的描述看起来比较复杂,来看一个例子:例如目标模式为“e%t”,文件“src/eat”
匹配于这个目标模式,那么“茎”就是“src/a”;模式规则中依赖文件的产生是:首先使用“茎”
非目录部分(“a”)替代依赖文件中的模式字符“%”,之后再将目录部分(“src/”)加入到形成的
依赖文件名之前构成依赖文件的全路径名。这里如果模式规则的依赖模式为“c%r”,则那么目标
“src/eat”对应的依赖文件就为“src/car”。

同样一个模式规则可以由多个目标文件。但是多个目标的模式规则和普通的多目标的规则有些
不同,普通多目标的规则的处理是将每一个目标作为一个独立的规则来处理,所以多个目标就就对
应多个独立的规则(这些规则各自有自己的命令行,各个规则的命令行可能相同)。但对于多目标
的模式规则,所有规则的目标共同拥有依赖文件和规则的命令行,当文件符合多个目标模式中的任
何一个时,规则定义的重建命令可能将会执行;因为多个目标共同用于这个规则的命令行,因此一
次命令执行之后,规则不会再去检查是否需要重建符合其它模式的目标。
#sample Makefile
Objects = foo.o bar.o
CFLAGS := -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)另外,依赖文件存在或者被提及的规则,优先于那些需要使用隐含规则来创建其依赖文件的规则。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值