Makefile常用函数

目录

1.格式

Makefile 中函数的调用格式如下:

$(function arguments)

其中,function 为函数名,arguments 为参数。

函数名与参数之间由空格或Tab分隔,如果有多个参数,这些参数之间由逗号分隔。

2.常用函数介绍

内核的 Makefile 中用到大量的函数,以下介绍一些常用的函数。

2.1 字符串替换和分析函数

  • $(subst from,to,text)

功能:

其中,subst 为 substitude(v 替代) 的缩写。
在字符串 text 中,使用 to 替换每一处 from.
返回:替换过后产生的新的字符串。

举例:

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

返回结果:

fEEt on the strEET
  • $(patsubst pattern,replacement,text)

功能:

其中,patsubst 为 pattern 和 substitude 的缩写。
查找 text 中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式 pattern ,如果匹配
的话,则以 replacement 替换。这里, pattern 可以包括通配符“%”,表示任意长度的字串。如果
replacement 中也包含“%”,那么replacement 中的这个“%”将是 pattern 中的那个“%”所代表的字串。
(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)。

返回:替换过后产生的新的字符串。

举例:

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

返回结果:

x.c.o bar.o

一种更为简单的批量替换文件后缀的方法–变量的替换引用

   $(VAR:PATTERN=REPLACEMENT)

   它相当于 $(patsubst PATTERN,REPLACEMENT,$(VAR))

举例:

	假设有变量定义为“objects = foo.o bar.o baz.o”。为了得到这些.o文件所对应的.c源文件。
	我们可以使用以下两种方式的任意一个:
    $(objects:.o=.c)
    $(patsubst %.o,%.c,$(objects))
  • $(strip string)

功能:

strip意为“脱去”
去除 string 中前导和结尾的空格,并将中间的多个空格压缩为一个空格。
返回:脱掉冗余空格之后的新的字符串。

举例:

$(strip a b c)

返回结果:

a b c
  • $(findstring find,in)

功能:

在字符串 in 中搜寻 find ,如果找到,则返回值是传入的参数 find, 否则返回值为空。

举例:

$(findstring a,a b c)

返回结果:

a

举例:

$(findstring a,b c)

返回结果:


  • $(filter pattern…,text)

功能:

过滤掉 text 中不符合 pattern 的字符串

举例:

$(filter %.c %.s,foo.c bar.c baz.s ugh.h)

返回结果:

foo.c bar.c baz.s
  • $(filter-out pattern…,text)

功能:

$(filter pattern…,text) 的反函数,过滤掉 text 中符合 pattern 的字符串。

举例:

$(filter %.c %.s,foo.c bar.c baz.s ugh.h)

返回结果:

ugh.h
  • $(sort list)

功能:

将 list 中的单词以首字母为准进行升序排序,并去掉重复的单词。

举例:

$(sort foo bar lose foo)

返回结果:

bar foo lose

2.2 文件名函数

  • $(dir names…)

功能:

从文件名序列 names… 中取出各个文件名的目录部分。文件名的目录部分就是包含在文件名中的最后一个
斜线(“/”)(包括斜线)之前的部分。如果没有反斜杠,那么返回./。

举例:

$(dir src/foo.c hacks)

返回结果:

src/ ./
  • $(notdir names…)

功能:

从文件名序列 names 中取出非目录部分。非目录部分是指最後一个反斜杠(/)之后的部分,即文件名

举例:

$(notdir src/foo.c hacks)

返回结果:

foo.c hacks
  • $(basename names…)

功能:

抽取 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 prefix,names…)

功能:

把前缀 prefix 加到 names 中的每个单词后面

举例:

$(addprefix src/,foo bar)

返回结果:

src/foo src/bar

2.3 其他函数

  • $(foreach var,list,text)

功能:

把参数 list 中的单词逐一取出放到参数 var 所指定的变量中,然后再执行 text 所包含的表达式。每
一次 text 会返回一个字符串,循环过程中,text 的所返回的每个字符串会以空格分隔,最后当整个循
环结束时, text 所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。

举例:

names := a b c d
files := $(foreach n,$(names),$(n).o)

返回结果:

a.o b.o c.o d.o
  • $(if condition,then-part)

功能:

或是 $(if condition,then-part,else-part)
if 函数可以包含 else 部分,或是不含。即 if 函数的参数可以是两个,也可以是三个。 condition
参数是 if 的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真,于是, then-part
会被计算,否则 else-part 会被计算。

而 if 函数的返回值是,如果condition 为真(非空字符串),那个 then-part 会是整个函数的返回
值,如果 condition 为假(空字符串),那么 else-part 会是整个函数的返回值,此时如果 
else-part 没有被定义,那么,整个函数返回空字串。

所以,then-part 和 else-part 只会有一个被计算。
  • $(origin variable)

功能:

origin函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪里来的。

注意, variable 是变量的名字,不应该是引用。所以你最好不要在 variable 中使用$字符。
Origin 函数会以其返回值来告诉你这个变量的“出生情况”。

返回值:

undefined       如果 variable 从来没有定义过,origin 函数返回这个值。
default         如果 variable 是一个默认的定义,比如“CC”这个变量。
environment   	如果 variable 是一个环境变量,并且当 Makefile 被执行时, -e 参数没有
被打开。
file            如果 variable 这个变量被定义在 Makefile 中。
command line 	如果 variable 这个变量是被命令行定义的。
override        如果 variable 是被 override 指示符重新定义的。
automatic       如果 variable 是一个命令运行中的自动化变量。
  • $(shell command argument)

功能:

相当于在 shell 中执行 command argument。

3. 转载地址

https://www.cnblogs.com/outs/p/7147206.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值