makefile常用知识
1:filter函数
$(filter <pattern...>,<text>)
名称:过滤函数——filter。
功能:以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式。
返回:返回符合模式<pattern>;的字串。
示例:
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo
$(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”。
2:常用符号:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
3:老式风格的双后缀规则
后缀规则是一个比较老式的定义隐含规则的方法。后缀规则会被模式规则逐步地取代。因为模式规则更强更清晰。为了和老版本的Makefile兼容,GNU make同样兼容于这
些东西。后缀规则有两种方式
:"双后缀"和"单后缀"。 双后缀规则定义了一对后缀:目标文件的后缀和依赖目标(源文件)的后缀。如".c.o"相当于"%o : %c"。单后缀规则只定义一个后缀,也就是源文件的后缀。
如".c"相当于"% : %.c"。后缀规则中所定义的后缀应该是make所认识的,如果一个后缀是make所认识的,那么这个规则就是单后缀规则,而如果两个连在一起的后缀都被
make所认识,那就是双后缀规则。
例如:".c"和".o"都是make所知道。因而,如果你定义了一个规则是".c.o"那么其就是双后缀规则,意义就是".c"是源文件的后缀,".o"是目标文件的后缀。如下示例: .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: .hack .win 把后缀.hack和.win加入后缀列表中的末尾。 .SUFFIXES: # 删除默认的后缀 .SUFFIXES: .c .o .h # 定义自己的后缀 先清除默认后缀,后定义自己的后缀列表。 make的参数"-r"或"-no-builtin-rules"也会使用得默认的后缀列表为空。而变量"SUFFIXE"被用来定义默认的后缀列表,
你可以用".SUFFIXES"来改变后缀列表,但请不要改变变量"SUFFIXE"的值。
4:patsubst 这是个模式替换函数
这是个模式替换函数
格式:$(patsubst <pattern>,<replacement>,<text> )
名称:模式字符串替换函数——patsubst。
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。
示例:
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”

浙公网安备 33010602011771号