使用函数
————

在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。make所支持的函数也不算很多,不过已经足够我们的操作了。函数调用后,函数的返回值可以当做变量来使用。

一、函数的调用语法

函数调用,很像变量的使用,也是以“$”来标识的,其语法如下:

$(<function>; <arguments>

或是

${<function>; <arguments>;}

这里,<function>;就是函数名,make支持的函数不多。<arguments>;是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。感觉很像一个变量,是不是?函数中的参数可以使用变量,为了风格的统一,函数和变量的括号最好一样,如使用“$(subst a,b,$(x))”这样的形式,而不是“$(subst a,b,${x})”的形式。因为统一会更清楚,也会减少一些不必要的麻烦。

还是来看一个示例:

comma:= ,
    empty:=
    space:= $(empty) $(empty)
    foo:= a b c
    bar:= $(subst $(space),$(comma),$(foo))

在这个示例中,$(comma)的值是一个逗号。$(space)使用了$(empty)定义了一个空格,$(foo)的值是“a b c”,$(bar)的定义用,调用了函数“subst”,这是一个替换函数,这个函数有三个参数,第一个参数是被替换字串,第二个参数是替换字串,第三个参数是替换操作作用的字串。这个函数也就是把$(foo)中的空格替换成逗号,所以$(bar)的值是“a,b,c”。

二、字符串处理函数

$(subst <from>;,<to>;,<text>

名称:字符串替换函数——subst。
    功能:把字串<text>;中的<from>;字符串替换成<to>;。
    返回:函数返回被替换过后的字符串。

示例:

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

把“feet on the street”中的“ee”替换成“EE”,返回结果是“fEEt on the strEEt”。

$(patsubst <pattern>;,<replacement>;,<text>

名称:模式字符串替换函数——patsubst。
    功能:查找<text>;中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<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”

备注:

这和我们前面“变量章节”说过的相关知识有点相似。如:

“$(var:<pattern>;=<replacement>
         相当于
        “$(patsubst <pattern>;,<replacement>;,$(var))”,

而“$(var: <suffix>;=<replacement>
         则相当于
         “$(patsubst %<suffix>;,%<replacement>;,$(var))”。

例如有:objects = foo.o bar.o baz.o,
         那么,“$(objects:.o=.c)”和“$(patsubst %.o,%.c,$(objects))”是一样的。

$(strip <string>

名称:去空格函数——strip。
    功能:去掉<string>;字串中开头和结尾的空字符。
    返回:返回被去掉空格的字符串值。
    示例:

$(strip a b c )

把字串“a b c ”去到开头和结尾的空格,结果是“a b c”。

$(findstring <find>;,<in>

名称:查找字符串函数——findstring。
    功能:在字串<in>;中查找<find>;字串。
    返回:如果找到,那么返回<find>;,否则返回空字符串。
    示例:

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

第一个函数返回“a”字符串,第二个返回“”字符串(空字符串)

$(filter <pattern...>;,<text>

名称:过滤函数——filter。
    功能:以<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”。

$(filter-out <pattern...>;,<text>

名称:反过滤函数——filter-out。
    功能:以<pattern>;模式过滤<text>;字符串中的单词,去除符合模式<pattern>;的单词。可以有多个模式。
    返回:返回不符合模式<pattern>;的字串。
    示例:

objects=main1.o foo.o main2.o bar.o
        mains=main1.o main2.o

$(filter-out $(mains),$(objects)) 返回值是“foo.o bar.o”。

$(sort <list>

名称:排序函数——sort。
    功能:给字符串<list>;中的单词排序(升序)。
    返回:返回排序后的字符串。
    示例:$(sort foo bar lose)返回“bar foo lose” 。
    备注:sort函数会去掉<list>;中相同的单词。

$(word <n>;,<text>;)

名称:取单词函数——word。
    功能:取字符串<text>;中第<n>;个单词。(从一开始)
    返回:返回字符串<text>;中第<n>;个单词。如果<n>;比<text>;中的单词数要大,那么返回空字符串。
    示例:$(word 2, foo bar baz)返回值是“bar”。

$(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”。

$(words <text>;)

名称:单词个数统计函数——words。
    功能:统计<text>;中字符串中的单词个数。
    返回:返回<text>;中的单词数。
    示例:$(words, foo bar baz)返回值是“3”。
    备注:如果我们要取<text>;中最后的一个单词,我们可以这样:$(word $(words <text>;),<text>;)。

$(firstword <text>;)

名称:首单词函数——firstword。
    功能:取字符串<text>;中的第一个单词。
    返回:返回字符串<text>;的第一个单词。
    示例:$(firstword foo bar)返回值是“foo”。
    备注:这个函数可以用word函数来实现:$(word 1,<text>;)。

以上,是所有的字符串操作函数,如果搭配混合使用,可以完成比较复杂的功能。这里,举一个现实中应用的例子。我们知道,make使用“VPATH”变量来指定“依赖文件”的搜索路径。于是,我们可以利用这个搜索路径来指定编译器对头文件的搜索路径参数CFLAGS,如:

override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))

如果我们的“$(VPATH)”值是“src:../headers”,那么“$(patsubst %,-I%,$(subst :, ,$(VPATH)))”将返回“-Isrc -I../headers”,这正是cc或gcc搜索头文件路径的参数。

三、文件名操作函数

下面我们要介绍的函数主要是处理文件名的。每个函数的参数字符串都会被当做一个或是一系列的文件名来对待。

$(dir <names...>;)

名称:取目录函数——dir。
    功能:从文件名序列<names>;中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。
    返回:返回文件名序列<names>;的目录部分。
    示例: $(dir src/foo.c hacks)返回值是“src/ ./”。

$(notdir <names...>;)

名称:取文件函数——notdir。
    功能:从文件名序列<names>;中取出非目录部分。非目录部分是指最后一个反斜杠(“/”)之后的部分。
    返回:返回文件名序列<names>;的非目录部分。
    示例: $(notdir src/foo.c hacks)返回值是“foo.c hacks”。

$(suffix <names...>;)

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

$(basename <names...>;)

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

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

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

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

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

$(join <list1>;,<list2>;)

名称:连接函数——join。
    功能:把<list2>;中的单词对应地加到<list1>;的单词后面。如果<list1>;的单词个数要比<list2>;的多,那么,<list1>;中的多出来的单词将保持原样。如果<list2>;的单词个数要比<list1>;多,那么,<list2>;多出来的单词将被复制到<list2>;中。
    返回:返回连接过后的字符串。
    示例:$(join aaa bbb , 111 222 333)返回值是“aaa111 bbb222 333”。

转载于:https://blog.51cto.com/7090376/1230621

Makefile详解(六)相关推荐

  1. Makefile详解(一)-介绍及总述

    以下内容为转载:http://zhan.renren.com/ilinux?from=template   Makefile详解 序       编译时,编译器需要的是语法的正确,函数与变量的声明的正 ...

  2. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  3. Makefile详解(自己觉得重新看一次学了好多东西,红色字)

    Makefile详解 跟我一起写 Makefile 陈皓 概述 -- 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得 ...

  4. Linux 内核顶层 Makefile 详解

    Linux 内核获取 Linux 由 Linux 基金会管理与发布, Linux 官网为 https://www.kernel.org,所以你想获取最新的 Linux 版本就可以在这个网站上下载 最新 ...

  5. makefile详解 函数 foreach if call origin shell

       makefile详解 函数 foreach if call origin shell 控制make函数 四.foreach 函数 foreach函数和别的函数非常的不一样.因为这个函数是用来做循 ...

  6. linux内核顶层Makefile详解

    文章目录 一.linux内核获取 二.linux内核初次编译 三.linux工程目录分析 1.获取源码 2.目录介绍 1.总体浏览 2.arch 目录 3.block 目录 4.crypto 目录 5 ...

  7. linux .pc文件make,简单的驱动makefile详解

    简单的驱动makefile详解 一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编 ...

  8. 六轴机器人直角坐标系建立_详解|六轴机器人,SCARA机器人,直角坐标机器人和 Delta机器人...

    原标题:详解|六轴机器人,SCARA机器人,直角坐标机器人和 Delta机器人 一.六轴工业机器人 六轴工业机器人的最大的工作空间类似一个球体,它可以将机械手臂末端工具以几乎任意角度放置在接近无限数量 ...

  9. Linux驱动程序Makefile详解

    驱动程序Makefile详解 在写驱动模块的Makefile是通常都是找一个现成的Makefile修改一下就可以了,该文章主要是为了弄清楚驱动程序的Makefile的原理. 例:一个简单的hello内 ...

  10. 【正点原子Linux连载】第三十一章 U-Boot顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

最新文章

  1. 根据二叉树的前序遍历和中序遍历重建二叉树
  2. linux下使用expect+scp+shell实现分布式集群系统安装,升级,部署
  3. ios查看ipa是否函数特定字符_iOS 中基础字符判断函数收集(如判断大小写、数字等)...
  4. SAP BASIS 工作台请求和定制请求的区别
  5. ONAP如何将Open-O和ECOMP数百万行代码合并?
  6. 辣条社区:问题解答、面试系列、求职助力、学习资源,你需要的都在这里
  7. c++图书管理系统_我用Python帮学校写了一款图书管理系统!教导员居然请我吃饭
  8. cublas中执行矩阵乘法运算的函数 首先要注意的是cublas使用的是以列为主的存储方式,和c/c++中的以行为主的方式是不一样的。处理方法可参考下面的注释代码
  9. MySQL--pt-osc工具学习
  10. Minecraft Forge 服务器开服教程
  11. 2017计算机四级网络工程师,2017计算机四级网络工程师真题练习
  12. T410i笔记本DP线转接HDMI链接外设无法传输声音问题解决
  13. 北大三日游游记(北大信科暑期课堂)
  14. 跟着团子学SAP FICO:SAP税码传输最佳业务实践
  15. 【数字图像处理】图像几何变换之 图像的极坐标变化展开鱼眼图
  16. KGE性能指标:MRR,MR,HITS@1,HITS@3,HITS@10
  17. 国外电子工程师们国内电子工程师火拼(转)
  18. 云知声持续发挥企业优势,赋能AIoT 落地,让未来生活更进一步
  19. c++学习笔记- 自制魔兽显血改键
  20. antd下载文件小结

热门文章

  1. Android开发 使用HBuilder的缓存方法
  2. 中标麒麟(linux)下Qt调用python数据转换
  3. 20145316许心远《网络攻防》第三次实验:免杀原理与实践
  4. python selenuim使用代理的方式
  5. 算法学习笔记(八) 动态规划的一般求解方法
  6. Enterprise Manager无法连接到实例错误解决
  7. 学习VC与C++先后顺序
  8. Docker使用小结(四)发布镜像
  9. vue-cli 里axios的使用
  10. ios十进制、十六进制字符串,byte,data等之间的转换