前言
常用的make函数使用方法汇总。
make函数常用于处理文本,使得Makefile具有通用性
调用方式
$(<function> <argument1> ,<argument1> ... )
一、字符串替换函数
- subst
$(subst <from>,<to>,<text>)
将字符串text中的from变为to。
示例:
$(subst ee,EE,feet on the street)
返回 fEEt on the street
- patsubst
$(patsubst <pattern>,<replacement>,<text>)
将text中以空格、Tab分割的子字符串按照pattern格式进行匹配,匹配成功则替换为replacement格式。
示例:
$(patsubst %.c,%.o,x.c.c bar.c)
返回 x.c.o bar.o
- strip
$(strip <string>)
去掉string字符串中开头和结尾的空白字符(空格、Tab)
示例:
$(strip a b c )
返回 “a b c”
- findstring
$(findstring <FIND>,<IN>)
从字符串中查找指定的字符串,找到返回,找不到返回空
示例:
$(findstring a,a b c)
$(findstring a,b c)
返回 a 返回 空字符
- filter
$(filter <pattern...>,<text>)
以 模式过滤
示例:
sources := foo.c bar.c baz.s ugh.h
result := $(filter %.c %.s,${sources})
返回 “foo.c bar.c baz.s”
- filter-out
$(filter-out <pattern...>,<text>)
以模式过滤
示例:
objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
result := $(filter-out $(mains),$(objects))
result 是“foo.o bar.o”
- sort
$(sort <list> )
给字符串中的单词排序(升序)。注意:sort函数会去掉中相同的单词
示例:
$(sort foo bar lose)
返回"bar foo lose"
- word
$(word <n>,<text>)
取
示例:
$(word 2, foo bar baz)
返回 bar
- wordlist
$(wordlist <s>,<e>,<text> )
从字符串
示例:
$(wordlist 2, 3, foo bar baz)
返回"bar baz"
- words
$(words <text> )
统计字符串
示例:
$(words, foo bar baz)
返回3
- firstword
$(firstword <word...>)
取word…中的第一个单词。
示例:
$(firstword a b c)
返回a
- lastword
$(lastword <word...>)
作用与firstword函数相反,取word…中的最后一个单词。
示例:
$(firstword a b c)
返回c
二、文件名称处理函数
- dir
$(dir <names...>)
从多个以空白符分隔的文件列表中获取文件目录。目录部分是指最后一个反斜杠/之
前的部分。如果没有反斜杠,那么返回“./”。
示例:
$(dir src/foo.c hacks)
返回"src ./"。其中src为src/foo.c的目录 ./为hacks的目录
- notdir
$(notdir <names...>)
从多个以空白符分隔的文件列表中获取非目录部分。非目录部分是指最后一个反斜杠/之后的内容。
示例:
$(notdir src/foo.c hacks)
返回"foo.c hacks“
- suffix
$(suffix <names…>)
文件名序列中取出各个文件名的后缀。如果文件没有后缀,则返回空字串
示例:
$(suffix src/foo.c src-1.0/bar.c hacks)
返回".c .c"。
- basename
$(basename <names...>)
功能:从文件名序列中取出各个文件名的前缀部分。如果文件没有前缀,则返回空字串。
示例:
$(basename src/foo.c src-1.0/bar.c hacks)
返回"src/foo src-1.0/bar hacks”
- addsuffix
$(addsuffix <suffix>,<names...> )
把后缀加到中的每个单词后面。
示例:
$(addsuffix .c,foo bar)
返回"foo.c bar.c"
- addprefix
$(addprefix <prefix>,<names...> )
功能:把前缀加到中的每个单词后面。
示例:
$(addprefix src/,foo bar)
返回值是"src/foo src/bar"
- join
$(join <list1>,<list2> )
功能:把中的单词对应地加到的单词后面。如果的单词个数与比< list2>不同,则原样输出。
示例:
res1 = $(join a b,.c .cpp .go)
res2 = $(join a b c,.c .cpp)
res1 是"a.c b.cpp .go",res2是"a.c b.cpp c"
- wildcard
$(wildcard <pattern...>)
扩展通配符函数用于获取匹配此模式的所有文件列表,文件名以空格分隔。如果不存在任何符合此模式的文件,返回空。
示例:
$(wildcard *.cpp *.c)
返回make工作目录下的所有以.cpp和.c为后缀的文件名。
三、make控制函数
- info
$(info <text>)
向标准输出打印文本
- warning
$(warning <info>)
向标准输出打印文本
- error
$(error <text>)
向标准错误输出打印文本
四、其他函数
- foreach
$(foreach <var>,<list>,<text>)
把参数list中的单词逐一取出放到参数var所指定的变量中,然后再执行text所包含的表达式。每一次text会返回一个字符串,循环过程中,text的所返回的每个字符串会以空格分隔,最后当整个循环结束时,text所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
示例:
names := a b c d
files := $(foreach n,${names},$(n).o)
files的结果为“a.o b.o c.o d.o”。
- call
$(call <expression>,<parm1>,<parm2>,<parm3>,...)
call函数是唯一一个可以用来创建新的参数化函数。你可以写一个非常复杂的表达式,这个表达式中,你可以定义许多参数,然后你可以用call函数来向这个表达式传递参数。当make执行call函数时,自定义表达式expression中的参数,如
(
1
)
,
(1),
(1),(2),$(3)等,会被参数,,依次取代。expression的返回值就是call函数的返回值。
示例:
reverse = $(1) $(2)
foo = $(call reverse,a,b)
foo的值是"a b"
reverse = $(2) $(1)
foo = $(call reverse,a,b)
此时的 foo 的值就是"b a"
- eval
$(eval <text>)
将
示例:
define MA
ALL:
@echo hello world
endef
$(info $(MA))
$(info ----------------------)
$(eval $(MA))
输出
ALL:
@echo hello world
----------------------
hello world
- shell
$(shell <shell_command>)
指令shell脚本命令
示例:
$(shell cat foo)
输出foo
- if
$(if CONDITION,THEN-PART)
$(if CONDITION,THEN-PART,ELSE-PART)
如果CONDITION为真,则返回表达式THEN-PART,否则返回ELSE-PART
示例:
install_path = $(if $(install__path), $(install__path), /usr/local)
install__path非空则返回install__path,否则返回/usr/local
- origin
$(origin <variable>)
返回变量的定义处。返回值:
返回值 | 含义 |
---|---|
default | makefile默认定义 如 CC |
file | 在makefile文件中定义 |
command line | 命令行定义 |
override | 变量在makefile中定义 但是被命令行定义覆盖了 |
automatic | 自动化变量 |
undefined | 未定义的变量 |
补充一点 override指示符
默认情况下 对于makefile中定义的变量,当在命令行给该变量赋值时会将命令行中的赋值覆盖掉,如果不希望覆盖,使用override指示符
示例:
(makefile)
override web = abc.cc
all:
@echo "web = $(web)"
(命令行)
make web=def.cc
输出 web = abc.cc
五、参考
https://cloud.tencent.com/developer/article/1406069
https://blog.csdn.net/ruglcc/article/details/7814546/