【Makefile】makefile中常用函数


前言

常用的make函数使用方法汇总。
make函数常用于处理文本,使得Makefile具有通用性

调用方式

$(<function>  <argument1> ,<argument1> ... )

一、字符串替换函数

  1. subst
$(subst <from>,<to>,<text>)

将字符串text中的from变为to。
示例:

$(subst ee,EE,feet on the street)

返回 fEEt on the street

  1. patsubst
$(patsubst  <pattern>,<replacement>,<text>)

将text中以空格、Tab分割的子字符串按照pattern格式进行匹配,匹配成功则替换为replacement格式。
示例:

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

返回 x.c.o bar.o

  1. strip
$(strip <string>)

去掉string字符串中开头和结尾的空白字符(空格、Tab)
示例:

$(strip a b c )

返回 “a b c”

  1. findstring
$(findstring <FIND>,<IN>) 

从字符串中查找指定的字符串,找到返回,找不到返回空
示例:

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

返回 a 返回 空字符

  1. filter
$(filter <pattern...>,<text>)

以 模式过滤 字符串中的单词,保留符合模式的单词。可以有多个模式。
示例:

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

返回 “foo.c bar.c baz.s”

  1. filter-out
$(filter-out <pattern...>,<text>)

以模式过滤 字符串中的单词,去除符合模式的单词。可以有多个模式。与filter函数互补
示例:

objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
result := $(filter-out $(mains),$(objects)) 

result 是“foo.o bar.o”

  1. sort
$(sort <list> )

给字符串中的单词排序(升序)。注意:sort函数会去掉中相同的单词
示例:

$(sort foo bar lose)

返回"bar foo lose"

  1. word
$(word <n>,<text>)

中第个单词。下标从1开始,如果比中的单词数要大,那么返回空
示例:

$(word 2, foo bar baz)

返回 bar

  1. wordlist
$(wordlist <s>,<e>,<text> )

从字符串 中取从<s>开始到的单词串。<s>和是一个数字下标,下标从1开始。如果<s>比 中的单词数要大,那么返回空字符串。如果大于 的单词数,那么返回从<s>开始,到 结束的单词串。
示例:

$(wordlist 2, 3, foo bar baz)

返回"bar baz"

  1. words
$(words <text> )

统计字符串 中的单词个数
示例:

$(words, foo bar baz)

返回3

  1. firstword
$(firstword <word...>)

取word…中的第一个单词。
示例:

$(firstword a b c)

返回a

  1. lastword
$(lastword <word...>)

作用与firstword函数相反,取word…中的最后一个单词。
示例:

$(firstword a b c)

返回c


二、文件名称处理函数

  1. dir
$(dir <names...>)

从多个以空白符分隔的文件列表中获取文件目录。目录部分是指最后一个反斜杠/之
前的部分。如果没有反斜杠,那么返回“./”。
示例:

$(dir src/foo.c hacks)

返回"src ./"。其中src为src/foo.c的目录 ./为hacks的目录

  1. notdir
$(notdir <names...>)

从多个以空白符分隔的文件列表中获取非目录部分。非目录部分是指最后一个反斜杠/之后的内容。
示例:

$(notdir src/foo.c hacks)

返回"foo.c hacks“

  1. suffix
$(suffix <names…>)

文件名序列中取出各个文件名的后缀。如果文件没有后缀,则返回空字串
示例:

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

返回".c .c"。

  1. basename
$(basename  <names...>)

功能:从文件名序列中取出各个文件名的前缀部分。如果文件没有前缀,则返回空字串。
示例:

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

返回"src/foo src-1.0/bar hacks”

  1. addsuffix
$(addsuffix <suffix>,<names...> )

把后缀加到中的每个单词后面。
示例:

$(addsuffix .c,foo bar)

返回"foo.c bar.c"

  1. addprefix
$(addprefix <prefix>,<names...> )

功能:把前缀加到中的每个单词后面。
示例:

$(addprefix src/,foo bar)

返回值是"src/foo src/bar"

  1. 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"

  1. wildcard
$(wildcard <pattern...>)

扩展通配符函数用于获取匹配此模式的所有文件列表,文件名以空格分隔。如果不存在任何符合此模式的文件,返回空。
示例:

$(wildcard *.cpp *.c)

返回make工作目录下的所有以.cpp和.c为后缀的文件名。


三、make控制函数

  1. info
$(info <text>)

向标准输出打印文本 ,用于输出调试信息。

  1. warning
$(warning <info>)

向标准输出打印文本 ,用于输出警告信息。make继续执行。

  1. error
$(error <text>)

向标准错误输出打印文本 ,用于输出指明错误信息。make停止执行。


四、其他函数

  1. 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”。

  1. 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"

  1. eval
$(eval <text>)

作为 makefile 的一部分而被 make 解析执行。注意,这里不再将text作为字符串,而当作make命令处理。
示例:

define MA
ALL:
        @echo hello world
endef

$(info $(MA))
$(info ----------------------)
$(eval $(MA))

输出

ALL:
	@echo hello world
----------------------
hello world
  1. shell
$(shell <shell_command>)

指令shell脚本命令
示例:

$(shell cat foo)

输出foo

  1. 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

  1. origin
$(origin <variable>)

返回变量的定义处。返回值:

返回值含义
defaultmakefile默认定义 如 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/

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值