Makefile中常用函数

在这里插入图片描述

前言

Makefile对于我们嵌入式工程师而言,并不陌生。其实它的语言并不困难,只不过在大型的工程中,使用了很多的隐含规则或者是函数,没有长时间的积累是不容易理解的。该文章主要是根据《跟我一起写Makefile - 陈皓》中的内容,记录我认为比较重要或者容易忽略的知识点,供初学者查阅学习。

函数

字符串类

  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>中的单词是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符"%",表示任意长度的字符串。如果<replacement>中也包含"%",那么,<replacement>中的这个"%"将是<pattern>中的那个"%"所代表的字符串。
返回: 函数返回被替换过后的字符串。

示例:
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c” 符合模式[%.c]的单词替换成[%.o],返回结果是"x.c.o bar.o"
  1. strip
$(strip <string>)
名称:去空格函数--strip
功能:去掉<string>字符串开头和结尾的空字符
返回:返回被去掉空格的字符串值

示例:
$(strip a b c)
把字串“a b c ”开头和结尾的空格去除,结果是“a b c”。
  1. findstring
$(findstring <find>,<in>)
名称:查找字符串函数
功能:在字符串<in>中查找<find>字串
返回:如果找到,那么返回<find>,否则返回空字符串。

示例:
$(findstring  a,a b c)
$(findstring a,b c)
第一个函数返回“a”字符串,第二个返回“ ”字符串
  1. filter
$(filter <pattern...>,<text>)
名称:过滤函数
功能:以<pattern>模式过滤<text>字符串的单词,保留符合模式<pattern>的单词。可以有多个模式。
返回:返回符合模式<pattern>的字串

示例:
sources := foo.c bar.c baz.s ugh.h
foo:$(sources)
cc $(filter %c %s ,$(sources)) -o foo
$(filter %.c %.s,$(sources)) 返回的值是“foo.c bar.c baz.s”。

6.filter-out

$(fileter-out <pattern...>,<text>)
名称:反过滤函数
功能:以<pattern>模式过滤<text>字符串中的单词,去除符合模式<pattern>的单词。可以有多个模式。
返回:返回不符合模式<pattern>的字串

示例:
objects= main1.o foo.o main2.o bar.o
mains=main1.o main2.o
$(fileter-out $(mains),$(objects)) 返回值是“foo.o bar.o”。
  1. sort
$(sort <list>)
名称:排序函数--sort
功能:给字符串<list>中的单词排序(升序)。
返回:返回排序后的字符串。

示例:
$(sort foo bar lose) 返回“bar foo lose”
备注:sort 函数会去掉<list>中校内沟通的单词

  1. word
$(word <n>,<text>)
名称:取单词函数--word
功能:取字符串<text>中第<n>个单词。
返回:返回字符串<text>中第<n>个单词。如果<n>比<text>中的单词数要大,那么返回空字符串。

示例:
$(word 2, foo bar baz)返回值是“bar”。
  1. wordlist
$(wordlist <s>,<e>,<text>)
名称:取单词串函数--wordlist。
功能:从字符串<text>中取从<s>到<e>的单词串。<s>和<e>是一个数字。
返回:返回字符串<text>中从<s>到<e>的单词字串。如果<s>比<text>中的单词数要大,那么返回空字符串。如果<e>大于<text>的单词,那么返回从<s>开始。到<text>结束的单词串。

示例:
$(wordlist 2,3 foo bar baz)
返回值是“bar baz”
  1. words
$(words <text>)
名称:单词个数统计函数
功能:统计<text>中字符串中的单词个数
返回:返回<text>中的单词数

示例:
$(words , foo bar baz)返回值是“3”
备注:如果我们要取<text>中最后的一个单词,我们可以这样:$(word $(words <text>),<text>)。

11.firstword

$(firstword <text>)
名称:首单词函数--firstword
功能:取字符串<text>中的第一个单词
返回:返回字符串<text>的第一个单词

示例:
$(firstword foo bar)返回值是“foo”
备注:这个函数可以用word实现:$(word 1,<text>)



文件名操作

  1. dir
$(dir <names..>)
名称:取目录函数
功能:从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。
返回:返回文件名序列<names>的目录部分。
示例:$(dir src/foo.c hacks)返回值是"src/ ./"。
  1. notdir
$(notdir <names..>)
名称:取文件函数
功能:从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠("/")之后的部分。
返回:返回文件名序列<names>的非目录部分。
示例:$(notdir src/foo.c hacks)返回值是“foo.c hacks”
  1. suffix
$(suffix <names...>)
名称:取后缀函数-suffix
功能:从文件名序列<nmaes>中去除各个文件名的后缀。
返回:返回文件名序列<names>的后缀序列,如果文件没有后缀,则返回空字符串。

示例:$(suffix src/fooc src-1.0/bar.c hacks)返回值是“.c .c”。
  1. basename
$(basename <names...>)
名称:取前缀函数
功能:从文件名序列<names>中取出各个文件名的前缀部分。
返回:返回文件名序列<names>的前缀序列,如果文件没有前缀,则返回空字符串。

示例:
$(basename src/foo.c src-1.0/bar.c hacks)返回值是“src/foo src-1.0/bar hacks”。
  1. addsuffix
$(addsuffix <suffix>,<names...>)
名称:加后缀函数
功能:把后缀<suffix>加到<names>中的每个单词后面
返回:返回结果后最的文件名序列

示例:
$(addsuffix .c , foo bar)返回值是“foo.c bar.c”
  1. addprefix
$(addprefix <prefix>,<names...>)
名称:加前缀函数
功能:把前缀<prefix>加到<names>中的每个单词后面。
返回:返回加过前缀的文件名序列

示例:
$(addprefix src/,foo bar) 返回值是"src/foo src/bar"。
  1. join
$(join <list1>,<list2>)
名称:连接函数
功能:把<list2>中的单词对应地加到<list1>的单词后面。如果<list1>的单词个数要比<list2>的多,那么,<list1>中的多出来的单词将保持原样。如果<list2>的单词个数要比<list1>多,那么,<list2>多出来的单词将被复制到<list2>中。
返回:返回链接过后的字符串。

示例:
$(join aaa bbb, 111 222 333)返回值是"aaa1111 bbb222 333"。



foreach 函数

  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"。




if 函数

  1. if函数
$(if <condition>,<then-part>)
或
$(if <condtion>,<then-part>,<else-part>)

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



call 函数

  1. call
$(call <expression>,<param1>,<param2>,<param3>...)
功能:当make执行这个函数时,<expression>参数中的变量,如$(1),$(2),$(3)等,会被参数<param1>,<param2>,<param3>依次取代。而<expression>的返回值就是call函数的返回值。

示例:
reverse = $(1) $(2)
foo = $(call reverse,a,b)
$(foo)的值是”a b“。



origin函数

  1. origin
$(origin <variable>)
功能:它只是告诉你这个变量是哪里来的
自动化变量
  1. $@
表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,”$@“就是匹配于目标中模式定义的集合
  1. $%
仅当目标是函数库文件中,表示规则中的目标成员名
  1. $<
依赖目标中的第一个目标名字。如果依赖目标是以模式定义的,那么"$<"将是符合模式的一系列的文件集。
  1. $^
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量
会去除重复的依赖目标,只保留一份。
  1. $+
这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标
定义一个空格的变量
empty := 
space := $(empty) $(empty)

若我的内容对您有所帮助,还请关注我的公众号。不定期分享干活,剖析案例,也可以一起讨论分享。
我的宗旨:
踩完您工作中的所有坑并分享给您,让你的工作无bug,人生尽是坦途
请添加图片描述
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢艺华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值