函数调用语法:
1:
内嵌函数调用方法:$(funcname arg1,arg2...)
自定义函数调用方法:call
show = $(1) $(2) #show被认为是一个函数,1,2是通过call传入的参数
$(call show, a, b)
2:
内嵌函数调用,function和参数之间通过空格隔开,参数和参数之间通过逗号隔开
3:
调用函数可以使用$()或者${},但是建议都是用一种风格,建议使用$()。
$(warning $(aaaa)) #warning 为内嵌函数
4:
在函数中使用空格和逗号的方法
empty :=
comma := ,
#两个empty引用中间有个空格
space := $(empty) $(empty)
foo := a.c b.c c.c
bar := $(subst $(space), $(comma), $(foo))
bar的结果是a.c,b.c,c.c
文本处理函数:
$(subst FROM, TO, TXT)
说明:将TXT中的FROM的内容替换成TO
Example:
foo = aabbcc
$(subst bb, ee, $(foo))
输出:aaeecc
$(patsubst PATR, REPLACE, TXT)
说明:将TXT中的每个用空格隔开的字串中的PATR替换成REPLACE
Example:
foo = a.c b.c c.c
$(patsubst %.c, %.o, $(foo))
输出:a.o b.o c.o
等价于:$(foo: .c=.o)
$(strip STR)
说明:将STR里用空格分割的每个字串的前后的空格
Example:
foo = a b c d
$(strip $(foo))
output:a b c d
$(findstring FIND, IN)
说明:在IN中查找FIND字符串,有则返回FIND,没有则返回空
Example:
foo = a b c
$(findstring a, $(foo))
output:a
$(filter PATTERN...., TXT)
说明:
过滤掉不符合PATTERN模式的字串
Example:
foo = a.c b.c d.s e.s k.el q.el
$(filter %.c %.s, $(foo))
output:a.c b.c d.s e.s
$(filter-out PATTERN..., TXT)
说明:输出不符合PATTERN的字串
Example:
foo = a.c b.c d.s e.s k.el q.el
bar = a.c b.c
$(filter-out $(bar), $(foo))
output:d.s e.s k.el q.el
$(filter-out %.c %.el, $(foo))
output:d.s e.s
$(sort LIST)
说明:按照字母顺序升序排序,并且去重复
Example:
foo = aa dd bb aa
$(sort $(foo))
output:aa bb dd
$(word N, TXT)
说明:获取TXT中第N个单词
Example:
foo = a.c b.c d.c
$(word 2, $(foo))
output:b.c
$(wordlist START, END, TXT)
说明:取出TXT中第START个单词开始到END
Example:
foo = a.c b.c c.c d.c e.c
$(wordlist 2,3, $(foo))
output:b.c c.c
$(words TXT)
说明:返回TXT中以空格分割的单词个数
Example:
foo = a.c b.c d.c
$(words $(foo))
output:3
$(firstword TXT)
说明:获取TXT中的第一个单词,等价于 $(words 1, TXT)
Example:
foo = a.c b.c d.c
$(firstword $(foo))
output:a.c
empty :=
space := $(empty) $(empty)
VPATH = src:../include
override CFLAGS += $(patsubst %, -l%, $(subst :,$(space), VPATH))
output:CFLAGS += -lsrc -l../include
文件名处理:
$(dir NAMES)
说明:获取最后一个/前面的目录
Example:
foo = /home/admin/xx.txt a.c
$(dir $(foo))
output:/home/admin ./ #单独的文件返回./
$(notdir NAMES)
说明:获取最后一个/后面的文件
Example:
foo = /home/admin/xx.txt a.c
$(notdir $(foo))
output:xx.txt a.c
$(suffix NAMES)
说明:获取文件拓展名
Example:
foo = /home/admin/xx.txt a.c aaa
$(suffix $(foo))
output:.txt .c #没有.后的拓展名的,则返回空
$(basename NAMES)
说明:获取扩展品之前的内容,包括目录
Example:
foo = /home/admin/a.c aaa
$(basename $(foo))
output:/home/admin/a aaa
$(addsuffix SUFFIX,NAMES)
说明:给NAMES的添加后缀
Example:
foo = aaa bbb
$(addsuffix .c, $(foo))
output:aaa.c bbb.c
$(addprefix PREFIX, NAMES)
说明:添加NAMES的前缀
Example:
foo = aaa bbb
$(addprefix -l, $(foo))
output:-laaa -lbbb
$(join LIST1, LIST2)
说明:将LIST1中对应位置的和LIST2的对应的位置相链接
Example:
foo = aaa bbb ccc
bar = .c .s
$(join $(foo), $(bar))
output:aaa.c bbb.s ccc
$(wildcard PATTERN)
说明:匹配满足的文件
Example:
$(wildcard *.c)
output:列出所有以.c结尾的文件
foreach函数:
$(foreach VAR, LIST, TEXT)
说明:一次遍历LIST的中以空格分开的成员,每个成员每次赋值为VAR,VAR相当于临时变量。
TEXT引用每次产生的VAR的值,进行处理。
Example:
foo = a b c
bar := $(foreach dir, $(foo), $(wildcard $(dir)/*.c))
output:获取目录a, b, c下的以.c结尾的文件
if函数:
$(if condition, then-part, else-part)
说明:如果condition成立则执行then-part,否则执行else-part
Example:
aa = 100
bar := $(if $(aa), exist, not exist)
output:exist。判断aa是否定义,定义了则将exist赋值给bar,否则将not exist赋值给bar
call函数:
说明:调用自己定义的功能变量,变量中的的$(1)$(2)...对应call调用的参数。
Example:
foo = $(2) $(1)
$(call foo, a, b)
output: b a
pathsearch = $(firstword $(wildcard $(addsubfix /$(1), $(subst :, ,$(PATH))))) #$(0) 值是pathsearch(函数名)
LS := $(call pathsearch,ls) #ls这个字符串和其前面的逗号不可有空格
output:/bin/ls
value函数:
说明:value函数不会对参数的值进行展开。而是原封不动的替换。
Example:
foo = $PATH
all:
echo $(foo) #输出结果为ATH,因为$P为空
echo $(value $(foo)) #其输出结果为PATH的值,环境变量。原封不动的将$PATH替换到当前位置,不对$P进行展开。
eval函数:
说明:eval构造一个可变的规则结构,将展开结果作为makefile的一部分。展开结果可以包含一个新的变量,目标,隐含规则或者明确规则。
Example:
PROGS := server client
define template
$(1):$$($(1)_OBJ) $$($(1)_LIBS:%=-l%)
ALL_OBJS += $$($(1)_OBJS)
endef
$(foreach prog, $(PROGS), $(eval $(call template, $(prog))))
origin函数
说明:origin确定一个变量的出处
Example:
a = 100
$(origin a) #此时是获取a的出处,而不是引用a,所以不需要$(a)
变量类型:
undefined:变量未定义
file:在某个文件中被定义
default:CC MAKE这种默认的定义
environment:系统环境变量
environment override: make -e时定义的变量,替换了文件中的变量定义。
command line:通过make命令行定义的变量。make aa=100,makefile中:$(origin aa)输出为command line
override:文件中定义并使用了override指示声明
automatic:自动变量$@, $*等。
makefile中执行shell命令:
a.txt:
xxxxx
makefile:
$(warning $(shell cat a.txt))
Output: xxxxx
$(error TXT)
说明:给用户输出TXT信息,并退出make执行
$(error "File Is Not Existed.")
$(warning TXT)
说明:输出告警给用户,不退出make执行
$(warning "File Is Not Existed")
阅读(2444) | 评论(0) | 转发(0) |