Makefile函数大全加例子加解读

 

$(subst from,to,text)


文本替换

text里的from换成to

$(subst ee,EE,feet on the street))
#    = fEEt on the strEEt)

 

$(patsubst pattern,replacement,text)


模式替换

% 是通配符

$(patsubst %.c,%.o,x.c.c bar.c))
#    = x.c.o bar.o

拼接

foo = World
$(patsubst %,Hello %!,${foo})
#    = Hello World!

 

$(strip string)


删除字符串前后的空格,替换连续的空格为一个空格

str := $   f b b      u  $  
$(strip ${str})
#    =f b b u

 

$(findstring find,in)


找到就返回,找不到就返回空

$(findstring a,a b c)
#    =a
$(findstring a,b c)
#    =

 

$(filter pattern...,text)


查找

sources := foo.c bar.c baz.s ugh.h 
$(filter %.c %.s,${sources})
#    =foo.c bar.c baz.s

 

$(filter-out pattern...,text)


查找不匹配

objects = main1.o foo.o main2.o bar.o
mains = main1.o main2.o  
$(filter-out ${mains},${objects})
#    =foo.o bar.o

 

$(sort list)


排序

$(sort foo bar lose)
#    =bar foo lose

 

$(word n,text)


第n个单词

$(word 2, foo bar baz)
#    =bar

 

$(wordlist s,e,text)


第n到第n1个单词

$(wordlist 2, 3, foo bar baz)
#    =bar baz

 

$(words text)


单词个数

text := a b c d e f g 
$(words a b c d e f g)
#    =7

 

$(firstword names...)


第一个单词

text := a b c d e f g 
$(firstword ${text})
#    =a

 

$(lastword names...)


最后一个单词

text := a b c d e f g 
$(lastword ${text})
#    =g
$(word $(words ${text}),${text}))
#    =g

 

$(dir names...)


目录名,其后可以跟多个路径

$(dir src/foo.c hacks)
#    =src/ ./

 

$(notdir names...)


非目录部分,其实就是不带路径的文件名

$(notdir src/foo.c hacks hacks/)
#    =foo.c hacks 

 

$(suffix names...)


后缀名

$(suffix src/foo.c src-1.0/bar.c hacks)
#    =.c .c

 

$(basename names...)


基名

$(basename src/foo.c src-1.0/bar hacks)
#    =src/foo src-1.0/bar hacks

 

$(addsuffix suffix,names...)


添加后缀

$(addsuffix .c,foo bar)
#    =foo.c bar.c

 

$(addprefix rpefix,names...)


添加前缀

$(addprefix src/,foo bar)
#    =src/foo src/bar

 

$(join list1,list2)


拼接

$(join a b,.c .o)
#    =a.c b.o

 

$(wildcard pattern)


模式查找

$(wildcard foo*)
#    =foo.c

如果存在 foo.c 或者 foo.h 都会列出在结果中

值的注意的是,函数展开发生在读入阶段。

 

$(realpath names...)


规范绝对路径

$(realpath foo.c)
#    =/home/make/foo.c

返回绝对路径,如果是链接,返回链接文件的绝对路径。

 

$(abspath names...)


绝对路径

$(abspath ../foo.c)
#    =/home/make/foo.c

 

$(call variable,param,param,...)


参数化

可用来创建参数化函数

需要注意的是,第一个参数直接用变量名,不加$符号

reverse = $(2) $(1)
foo = $(call reverse,a,b)  
# foo = b a

 

$(value variable)


使用变量的值而不展开变量

递归展开的变量是value函数存在的意义,对于简单展开的变量,使用$展开和value函数的结果一样

FOO = $PATH
# FOO 是一个递归展开的变量,每次展开 FOO 的地方都会对 P 进行展开。所以$(FOO) 展开后变成了ATH
# 变量的2种风格(展开方式),递归展开(=) 和 简单展开 (:=) 
@echo $(FOO)
# ATH
# 使用 value 函数,只使用 FOO 的值而不展开FOO
@echo $(value FOO)
# /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/make/.local/bin:/home/make/bin

 

$(eval text)


执行文本

定义非常量的makefile脚本

将函数或者变量的执行结果作为makefile的脚本

将函数或者变量的执行结果作为makefile的脚本

define PROGRAM_template =
.PHONY: $(1)
$(1): $(2)
	 @echo $$@
endef

$(eval $(call PROGRAM_template,stage4,stage3))
$(eval $(call PROGRAM_template,stage3,stage2))
$(eval $(call PROGRAM_template,stage2,stage1))
$(eval $(call PROGRAM_template,stage1,$ ))
# make stage4
stage1
stage2
stage3
stage4

 

$(origin variable)


变量身世

undefined 变量未定义
default 变量拥有默认定义,比如
CC AR AS CC CXX CPP FC M2C PC CO GET LEX YACC LINT MAKEINFO TEX TEXI2DVI
WEAVE CWEAVE TANGLE CTANGLE RM ARFLAGS ASFLAGS CFLAGS CXXFLAGS COFLAGS CPPFLAGS
FFLAGS GFLAGS LDFLAGS LDLIBS LFLAGS YFLAGS PFLAGS RFLAGS LINTFLAGS

environment环境变量
environment override环境变量覆盖文件变量
file 变量被定义在一个makefile中
command line变量被定义在命令行
override 覆盖指令
automatic自动变量

$@ $% $< $? $^ $+ $| $* $? $(@D) $(@F) $(*D)
$(*F) $(%D) $(%F) $(<D) $(<F) $(^D)
$(^F) $(+D) $(+F) $(?D) $(?F)

echo $(origin XXNIGEXX)
# 'undefined'

echo $(origin CC) 
# 'default'

echo $(origin PATH) 
# 'environment'

PWD = /tmp 
echo $(origin PWD)
# make
#   'file'
# make -e
#   'environment override'

echo $(origin SHELL)
# 'file'

echo $(origin CMDLINE)
# make CMDLINE=
#   'undefined'

echo $(origin rootdir)
#   'override'

echo $(origin $@)
#   'undefined'

 

$(flavor variable)


变量风格
undefined 变量未定义
recursive 递归展开变量
simple 简单展开变量

 

$(shell command)


执行shell命令并返回输出

 

$(foreach var,list,text)


list切片,var是每片的变量名,text是执行的操作

 

$(if condition,then-part[,else-part])


如果condition不为空,执行then-part,否则执行else-part

$(if any-string,true,false)
#   = true
$(if ,true,false)
#   = false

 

$(or condition1[,condition2[,condition3...]])


返回第一个不为空的condition

 

$(and condition1[,condition2[,condition3...]])


任何condition为空都会返回空

 
 

posted on 2021-03-10 17:33  ddev  阅读(484)  评论(0编辑  收藏  举报