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”

  

posted @ 2018-06-12 09:58  WorldsCollide  阅读(52)  评论(0)    收藏  举报