treet),
把―feet on the street‖中的―ee‖替换成―EE‖,返回结果是―fEEt on the strEEt ‖。
$(patsubst
名称:模式字符串替换函数——patsubst。
功能:查找
合模式
配符―%‖,表示任意长度的字串。如果 ent>中的这个―%‖将是 以―\\%‖来表示真实含义的―%‖字符) 返回:函数返回被替换过后的字符串。 示例: $(patsubst %.c,%.o,x.c.c bar.c) 把字串―x.c.c bar.c‖符合模式[%.c]的单词替换成[%.o],返回结果是―x.c.o bar.o‖ 备注: 这和我们前面―变量章节‖说过的相关知识有点相似。如: ―$(var: ―$(patsubst 而―$(var: ―$(patsubst % 例如有:objects = foo.o bar.o baz.o, 那么,―$(objects:.o=.c)‖和―$(patsubst %.o,%.c,$(objects))‖是一样的。 $(strip 名称:去空格函数——strip。 功能:去掉 $(strip a b c ) 把字串―a b c ‖去到开头和结尾的空格,结果是―a b c‖。 $(findstring 名称:查找字符串函数——findstring。 功能:在字串 返回:如果找到,那么返回 $(findstring a,a b c) $(findstring a,b c) 第一个函数返回―a‖字符串,第二个返回―‖字符串(空字符串) $(filter 名称:过滤函数——filter。 功能:以 返回:返回符合模式 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‖。 $(filter-out 名称:反过滤函数——filter-out。 功能:以 返回:返回不符合模式 objects=main1.o foo.o main2.o bar.o mains=main1.o main2.o $(filter-out $(mains),$(objects)) 返回值是―foo.o bar.o‖。 $(sort 名称:排序函数——sort。 功能:给字符串 示例:$(sort foo bar lose)返回―bar foo lose‖ 。 备注:sort函数会去掉 $(word 名称:取单词函数——word。 功能:取字符串 返回:返回字符串 示例:$(word 2, foo bar baz)返回值是―bar‖。 $(wordlist 名称:取单词串函数——wordlist。 功能:从字符串 返回:返回字符串 么返回空字符串。如果 示例: $(wordlist 2, 3, foo bar baz)返回值是―bar baz‖。 $(words 名称:单词个数统计函数——words。 功能:统计 示例:$(words, foo bar baz)返回值是―3‖。 备注:如果我们要取 $(firstword 名称:首单词函数——firstword。 功能:取字符串 备注:这个函数可以用word函数来实现:$(word 1, 以上,是所有的字符串操作函数,如果搭配混合使用,可以完成比较复杂的功能。这里, 举一个现实中应用的例子。我们知道,make使用―VPATH‖变量来指定―依赖文件‖的搜索 路径。于是,我们可以利用这个搜索路径来指定编译器对头文件的搜索路径参数CFLAGS, 如: override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH))) 如果我们的―$(VPATH)‖值是―src:../headers‖,那么―$(patsubst %,-I%,$(subst : , ,$(VPATH)))‖将返回―-Isrc -I../headers‖,这正是cc或gcc搜索头文件路径的参数 。 三、文件名操作函数 下面我们要介绍的函数主要是处理文件名的。每个函数的参数字符串都会被当做一个或是 一系列的文件名来对待。 $(dir 名称:取目录函数——dir。 功能:从文件名序列 前的部分。如果没有反斜杠,那么返回―./‖。 返回:返回文件名序列 $(notdir 名称:取文件函数——notdir。 功能:从文件名序列 返回:返回文件名序列 示例: $(notdir src/foo.c hacks)返回值是―foo.c hacks‖。 $(suffix 名称:取后缀函数——suffix。 功能:从文件名序列 返回:返回文件名序列 示例:$(suffix src/foo.c src-1.0/bar.c hacks)返回值是―.c .c‖。 $(basename 名称:取前缀函数——basename。 功能:从文件名序列 返回:返回文件名序列 示例:$(basename src/foo.c src-1.0/bar.c hacks)返回值是―src/foo src-1.0/bar h acks‖。 $(addsuffix 名称:加后缀函数——addsuffix。 功能:把后缀 示例:$(addsuffix .c,foo bar)返回值是―foo.c bar.c‖。 $(addprefix 名称:加前缀函数——addprefix。 功能:把前缀 示例:$(addprefix src/,foo bar)返回值是―src/foo src/bar‖。 $(join 名称:连接函数——join。 功能:把 list2>的多,那么, 示例:$(join aaa bbb , 111 222 333)返回值是―aaa111 bbb222 333‖。 四、foreach 函数 foreach 函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile中的 foreach函数几乎是仿照于Unix标准Shell(/bin /sh)中的for语句,或是C-Shell(/bin /csh)中的foreach语句而构建的。它的语法是: $(foreach , 这个函数的意思是,把参数 再执行 所返回的每个字符串会以空格分隔,最后当整个循环结束时, 所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。 所以,最好是一个变量名, 这个参数来依次枚举 names := a b c d files := $(foreach n,$(names),$(n).o) 上面的例子中,$(name)中的单词会被挨个取出,并存到变量―n‖中,―$(n).o‖每次根 据―$(n)‖计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,$(f iles)的值是―a.o b.o c.o d.o‖。 注意,foreach中的参数是一个临时的局部变量,foreach函数执行完后,参数 的变量将不在作用,其作用域只在foreach函数当中。 五、if 函数 if函数很像GNU的make所支持的条件语句——ifeq(参见前面所述的章节),if函数的语法 是: $(if $(if 可见,if函数可以包含―else‖部分,或是不含。即if函数的参数可以是两个,也可以是 三个。 当于返回真,于是, 而if函数的返回值是,如果 函数的返回值,如果 回值,此时如果 所以, 六、call函数 call函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达式, 这个表达式中,你可以定义许多参数,然后你可以用call函数来向这个表达式传递参数。 其语法是: $(call 当 make执行这个函数时, reverse = $(1) $(2) foo = $(call reverse,a,b) 那么,foo的值就是―a b‖。当然,参数的次序是可以自定义的,不一定是顺序的,如: reverse = $(2) $(1) foo = $(call reverse,a,b) 此时的foo的值就是―b a‖。 七、origin函数 origin函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪里来 的?其语法是: $(origin 注意, $‖字符。Origin函数会以其返回值来告诉你这个变量的―出生情况‖,下面,是origin函 数的返回值: ―undefined‖ 如果 )
中的单词排序(升序)。 返回:返回排序后的字符串。
中相同的单词。
,开始到和到比开始,到,
中的单词逐一取出放到参数所指定的变量中,然后
可以是一个表达式,而
中的单词。举个例子: