makefile03 _常用函数

https://blog.csdn.net/ustc_dylan/article/details/6963248 Makefile常用函数总结

$(subst ,, ) 字符串替换函数
示例:
$(subst ee,EE,feet on the street),
把“feetonthestreet”中的“ee”替换成“EE”,返回结果是“fEEtonthestrEEt”。
模式字符串替换函数——patsubst。
示例:
( p a t s u b s t 把 字 串 “ x . c . c b a r . c ” 符 合 模 式 [ 备 注 : 例 如 有 : o b j e c t s = f o o . o b a r . o b a z . o , 那 么 , “ (patsubst %.c,%.o,x.c.c bar.c) 把字串“x.c.cbar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.obar.o” 备注: 例如有:objects=foo.obar.obaz.o, 那么,“ (patsubstx.c.cbar.c[objects=foo.obar.obaz.o(objects:.o=.c)”和“ ( p a t s u b s t (patsubst%.o,%.c, (patsubst(objects))”是一样的。

名称:去空格函数——strip。
功能:去掉字串中开头和结尾的空字符。
返回:返回被去掉空格的字符串值。
示例:
$(strip a b c )
把字串“abc”去到开头和结尾的空格,结果是“abc”。
$(findstring , )

名称:查找字符串函数——findstring。
功能:在字串中查找字串。
返回:如果找到,那么返回,否则返回空字符串。
示例:
$(findstring a,a b c)
$(findstring a,b c)
第一个函数返回“a”字符串,第二个返回“”字符串(空字符串)

filter <pattern…>, )
名称:过滤函数——filter。 --选择符合的
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc ( f i l t e r (filter %.c %.s, (filter(sources)) -o foo
( f i l t e r (filter %.c %.s, (filter(sources))返回的值是“foo.c bar.c baz.s”。

( f i l t e r − o u t &lt; p a t t e r n . . . &gt; , &lt; t e x t &gt; ) 名 称 : 反 过 滤 函 数 — — f i l t e r − o u t 。 − − 删 去 符 合 的 排 序 函 数 — — s o r t 。 (filter-out &lt;pattern...&gt;,&lt;text&gt; ) 名称:反过滤函数——filter-out。 --删去符合的 排序函数——sort。 (filterout<pattern...>,<text>)filteroutsort(word , )

( s o r t &lt; l i s t &gt; ) 名 称 : 排 序 函 数 — — s o r t 。 功 能 : 给 字 符 串 &lt; l i s t &gt; 中 的 单 词 排 序 ( 升 序 ) 。 返 回 : 返 回 排 序 后 的 字 符 串 。 示 例 : (sort &lt;list&gt; ) 名称:排序函数——sort。 功能:给字符串&lt;list&gt;中的单词排序(升序)。 返回:返回排序后的字符串。 示例: (sort<list>)sort<list>(sortfoobarlose)返回“barfoolose”。
备注:sort函数会去掉中相同的单词。

名称:取单词函数——word。
功能:取字符串 中第个单词。(从一开始)
$(word2,foobarbaz)返回值是“bar”

$(wordlist ,, )
名称:取单词串函数——wordlist。
功能:从字符串 中取从 开始到的单词串。和是一个数字。

$(firstword )

名称:首单词函数——firstword。
功能:取字符串 中的第一个单词。
返回:返回字符串 的第一个单词。
示例: ( f i r s t w o r d f o o b a r ) 返 回 值 是 “ f o o ” 。 备 注 : 这 个 函 数 可 以 用 w o r d 函 数 来 实 现 : (firstwordfoobar)返回值是“foo”。 备注:这个函数可以用word函数来实现: (firstwordfoobar)fooword(word1, )。

文件名操作函数
$(dir <names…> ) 名称:取目录函数——dir。
notdir <names…> ) 名称:取文件函数——notdir
$(suffix <names…> ) 名称:取后缀函数——suffix。从文件名序列中取出各个文件名的后缀。
$(basename <names…> ) 取前缀函数——basename。
加后缀函数——addsuffix。
( a d d s u f f i x . c , f o o b a r ) 返 回 值 是 “ f o o . c b a r . c ” 加 前 缀 函 数 — — a d d p r e f i x 。 示 例 : (addsuffix.c,foobar)返回值是“foo.cbar.c” 加前缀函数——addprefix。 示例: (addsuffix.c,foobar)foo.cbar.caddprefix(addprefixsrc/,foobar)返回值是“src/foosrc/bar”。
( j o i n &lt; l i s t 1 &gt; , &lt; l i s t 2 &gt; ) ` 连 接 函 数 — — j o i n 。 示 例 : (join &lt;list1&gt;,&lt;list2&gt; ) `连接函数——join。 示例: (join<list1>,<list2>)join(joinaaabbb,111222333)返回值是“aaa111bbb222333”。

四、$(foreach ,, )
foreach函数是用来做循环用的,Makefile 中的foreach 函数几乎是仿照于 Unix 标准 Shell(/bin/sh)中的 for 语句,或是 C-Shell(/bin/csh)中的foreach语句而构建的。
把参数中的单词逐一取出放到参数 所指定的变量中,然后再执行 所包含的表达式。每一次 会返回一个字符串,循环过程中, 的所返回的每个字符串会以空格分隔,最后当整个循环结束时, 所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。

所以,最好是一个变量名,可以是一个表达式,而 中一般会使用
这个参数来依次枚举中的单词。举个例子:
names := a b c d
files := ( f o r e a c h n , (foreach n, (foreachn,(names),$(n).o)
注意,foreach中的参数是一个临时的局部变量,foreach函数执行完后,参数
的变量将不在作用,其作用域只在 foreach 函数当中。

if函数
( i f &lt; c o n d i t i o n &gt; , &lt; t h e n − p a r t &gt; ) 或 是   (if &lt;condition&gt;,&lt;then-part&gt; )或是  (if<condition>,<thenpart>) (if ,, )
   而if函数的返回值是,如果为真(非空字符串),那个会是整
个函数的返回值,如果为假(空字符串),那么会是整个函数的
返回值,此时如果没有被定义,那么,整个函数返回空字串。
所以,和只会有一个被计算。

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

那么,foo的值就是“ab”。当然,参数的次序是可以自定义的,不一定是顺序的,如:
reverse = $(2) $(1)
foo = $(call reverse,a,b)
此时的foo的值就是“ba”。

七、origin函数
origin 函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪里
来的?注意,是变量的名字,不应该是引用。所以你最好不要在中使用“
” 字 符 。 其 语 法 是 : ”字符。 其语法是: (origin )

Origin 函数会以其返回值来告诉你这个变量的“出生情况”,下面,是 origin
函数的返回值:

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

例如,假设我们有一个Makefile其包
了一个定义文件Make.def,在Make.def中定义了一个变量“bletch”,而我们的环境中
也有一个环境变量“bletch”,此时,我们想判断一下,如果变量来源于环境,那么我
们就把之重定义了,如果来源于Make.def或是命令行等非环境的,那么我们就不重新
定义它。于是,在我们的Makefile中,我们可以这样写:
ifdef bletch

ifeq “$(origin bletch)” “environment”
bletch = barf, gag, etc.
endif
endif
当然,你也许会说,使用override关键字不就可以重新定义环境中的变量了吗?为什
么需要使用这样的步骤?是的,我们用override是可以达到这样的效果,可是override
过于粗暴,它同时会把从命令行定义的变量也覆盖了,而我们只想重新定义环境传来
的,而不想重新定义命令行传来的。

八、shell函数
它的参数应该就是操作系统 Shell 的命令。它和反引号“`”是相同的功能。这就是说,shell函数把执行操作系统命令后的输出作为函数返回。于是,我们可以用操作系统命令以及字符串处理命令awk,sed等等命令来生成
一个变量,如:
contents := $(shell cat foo)
files := $(shell echo *.c)
注意,这个函数会新生成一个Shell程序来执行命令,所以你要注意其运行性能,如果
你的Makefile中有一些比较复杂的规则,并大量使用了这个函数,那么对于你的系统
性能是有害的。特别是Makefile的隐晦的规则可能会让你的shell函数执行的次数比你
想像的多得多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值