后缀规则是一种老风格定义隐含规则的方式。新版本的make中使用模式规则取代了这种实现
方式,模式规则和它相比更加清晰明了。现在版本保留它的原因只是为了能够兼容旧的makefile文件。
后缀规则有两种类型:“双后缀”和“单后缀”。
双后缀规则定义一对后缀:目标文件的后缀和依赖目标的后缀。它匹配所有后缀为指定目标后
缀的文件名。对于一个匹配的目标文件,它的依赖文件是这样形成:将目标文件中的后缀替换为依
赖文件的后缀之后得到。如:一个描述目标和依赖后缀的“.o”和“.c”的规则就等价于模式规则
“%o : %c”。
单后缀规则只定义一个后缀:此后缀是源文件的后缀。它可以匹配任何文件,其依赖文件名是
这样形成:将源文件后缀追加到目标文件名之后得到。例如:单后缀“.c”就等价于模式规则“% :
%.c”。
后缀规则的识别过程:比较make本身所定义的后缀和规则中出现的后缀,如果规则的目标中
只有一个可识别的后缀,则这个规则是一个“单后缀”规则;当规则的目标中有两个可识别的后缀
时,这个规则就是“双后缀”规则。
例如:“.c”和“.o”都是make可识别的后缀。因此当定义了一个目标是“.c.o”的规则时。
make会将它作为一个双后缀规则来处理,它的含义是目标为“.o”文件、依赖为“.c”文件。下
边是使用后追规则定义的、编译.c源文件的规则:
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
一个后缀规则依赖关系描述中不能包含依赖文件。否则,此规则将被作为一个普通规则对待。因此
规则:
.c.o: foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
它不是一个后缀规则。它是目标文件为“.c.o”、依赖文件是“foo.h”的普通规则。它不等价于规
则:
%.o: %.c foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
需要注意的是:没有命令行的后缀规则是没有任何意义的。它和没有命令行的模式规则不同,它并不
能取消之前使用后追规则定义的规则。它所实现的仅仅是将这个后缀规则作为目标加入到make的数据库中。
可识别的后缀指的是特殊目标“.SUFFIXES”的所有依赖的名字。通过给特殊目标“SUFFIXES”添加依赖来增加
一个可被识别的后缀:
.SUFFIXES: .hack .win
它所实现的功能是把后缀“.hack”和“.win”加入到可识别后缀列表的末尾。
如果需要重设默认所有的可识别后缀,可以这样来实现:
.SUFFIXES: #删除所有已定义的可识别后缀
.SUFFIXES: .c .o .h #重新定义
其过程是首先使用没有依赖的特殊目标“.SUFFIXES”来删除所有已定义的可识别后缀;之后再重新定义。
注意: make的“-r”或“-no-builtin-rules”可以清空所有已定义的可识别后缀。
在make读取所有的makefile文件之前,变量“SUFFIXE”被定义为默认的可识别后缀列表。
虽然存在这样一个变量,但是请不要通过修改这个变量值的方式来改变可识别的后缀列表,应该使
用特殊目标“.SUFFIXES”来实现。
makefile后缀规则
最新推荐文章于 2024-05-24 17:31:31 发布