makefile(3)函数
前言
学习make和makefile的主要目的是分析大型项目的源代码的关系,上一节我们讲述了makefile 中的变量,本节主要学习一下 makefile 中的函数,首先函数肯定可以分为几部分:
- 内置函数
- 用户自动义函数
- 函数的调用
- ..
函数的语法
make 下所有函数都有如下形式:
1 |
$(function-name arg1[,arg2,arg3,..]) |
我们首先来看内置函数:
内置函数
make 的内置函数可分类如下:
字符串函数
$(filter pattern …,text)
pattern 中可以使用 % 来做通配符,值得注意的是: 每个 pattern 只支持 1 个 % ,比如:
1 |
//makefile |
结果为:
1 |
//result |
$(filter-out pattern ..,text)
filter-out同filter相反,比如:
1 |
//makefile |
结果为:
1 |
//result |
$(findstring string…,text)
此函数所返回会的只是“搜索字符”而不是包含搜索字符的字符,另外不支持pattern
1 |
words := he the hen other the% |
结果为:
1 |
%th% matches: |
$(subst search-string,replace-string,text)
不具有通配符能力的搜索替换函数,最经常使用于替换文件名列表的扩展名,如:
1 |
sources := fun.c foo.c |
结果为:
1 |
fun.o foo.o |
$(patsubst search-pattern,replace-pattern,text)
具有通配符能力的替换功能,有几个注意点:
- 此处的模式只可以包含一个 % 字符
- replace-pattern中的百分比符号会被替换成与符号相符的文字
- search-pattern必须和text的整个值进行匹配
1 |
source := main.c |
结果为:
1 |
gcc -c main.c -o main.o |
单词函数
$(words text)
统计text中单词个数 ,按照”space(空格)”进行拆分
1 |
CURRENT_PATH := $(subst /, ,$(PWD)) |
结果为:
1 |
current path /Users/hejianglin/study/makefile |
$(word n,text)
“space(空格)”进行拆分,返回 text 中的第 n 个单词,开始编号为 1,如果找不到相应的位置则返回空
1 |
CURRENT_PATH := $(subst /, ,$(PWD)) |
结果为:
1 |
current path /Users/hejianglin/study/makefile |
$(wordlist start,end,text)
“space(空格)”进行拆分,返回 text 中的第 start(含) 到 end(含) 的单词,开始编号为 1,如果找不到相应的位置则返回空
文件名函数
$(wildcard pattern..)
文件列表
1 |
source := $(wildcard src/*.c include/*.h) .PHONY: test |
结果为:
1 |
src/foo.c src/fun.c src/main.c include/foo.h include/fun.h |
$(dir list…)
目录列表
1 |
source := $(wildcard src/*.c include/*.h) .PHONY: test |
结果为:
1 |
src/ src/ src/ include/ include/ |
$(notdir list..)
删除目录的文件列表
1 |
source := $(wildcard src/*.c include/*.h) .PHONY: test |
结果为:
1 |
foo.c fun.c main.c foo.h fun.h |
$(suffix name…)
返回每个单词的后缀
$(basename name…)
suffix的反函数
$(addsuffix suffix, name…)
添加后缀名称
$(addprefix prefix,name…)
addsuffix的反函数,添加前缀
$(join prefix-list,suffix-list)
连接字符,dir 和 notdir 的反函数
1 |
source := $(wildcard src/*.c include/*.h) |
结果为:
1 |
join src/foo.c src/fun.c src/main.c include/foo.h include/fun.h |
其他
$(sort list)
排序 list 并移除重复项,排序优先级: 数字 > 字母,字母按照升序排序:
1 |
source := b c 1 2 d 0 c |
结果为:
1 |
sort source: 0 1 2 b c d |
$(shell command)
执行 shell 命令,输出的换行被替换成单一的空格符号,错误和状态都不会返回
1 |
.PHONY: test |
结果为:
1 |
20180610 |
流程控制
if
$(if condition, then-part,else-part)
只要 condition 返回不为空,则为 true 便会执行 then-part, 否则执行 else-part
1 |
$(if $(filter $(MAKE_VERSION),3.79 3,80),, |
结果为:
1 |
makefile:1: *** requires makefile version -.. Stop. |
因为本机的 make 版本是 3.81
for/while
$(foreach variable,list,body)
==这个函数实在难以理解(用法…),跳过吧==
makefile(3)函数的更多相关文章
- 跟我一起写Makefile:使用函数
跟我一起写Makefile:使用函数 两个排版不一样 书籍下载 书籍下载
- Makefile常用函数(转)
一.字符串处理函数 1.$(subst FROM,TO,TEXT) 函数名称:字符串替换函数-subst. 函数功能:把字串"TEXT"中的"FROM"字符替换 ...
- makefile常用函数
标签(空格分隔): makefile 1.字符串替换和分析函数 $(subst from,to,text) #在文本"text"中使用"to"替换每一处&quo ...
- 调试makefile—subst函数
操作系统:ubuntu10.04 Makefile里的subst用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO Makefile中的字符串处理函数格式: ...
- Makefile常用函数总结
在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具 有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函 数的返回值可以当做变量来使用. 一 ...
- makefile 常用函数
Linux下编译c/c++源码需要编写makefile文件,文章参看 http://blog.sina.com.cn/s/blog_4c4d6e74010009jr.html 一函数的调用语法 二字符 ...
- Makefile eval函数
https://www.cnblogs.com/gaojian/archive/2012/10/04/2711494.html对 makefile 中 eval 函数的学习体会 http://blog ...
- makefile的函数集合
strip函数:$(strip text) 函数功能:去除字符串空格函数 示例: STR = a b c LOSTR = $(strip $(STR)) #结果是&quo ...
- Makefile 赋值 函数定义 等小知识点
1.赋值 == 到用的时候实际才去赋值:= 立刻赋值?= 未赋值才赋值+= 2.多层变量 多层变量引用(各种复杂组合...)a =bb= cc= dd =1$($($($(a)))) 最终等于1 3. ...
随机推荐
- python爬虫破解带有CryptoJS的aes加密的反爬机制
发现问题 在一次偶然中,在爬取某个公开网站(非商业型网站)时,老方法,打开调试工具查看请求方式,请求拦截,是否是异步加载,不亦乐乎,当我以为这个网站非常简单的时候,发现二级网页的地址和源码不对应 Aj ...
- POJ-1679 The Unique MST(次小生成树、判断最小生成树是否唯一)
http://poj.org/problem?id=1679 Description Given a connected undirected graph, tell if its minimum s ...
- vim 高级技巧
复制粘贴 normal 或v模式下 y/d/x 复制后,p来粘贴 编辑模式 默认的 set autoindent 会导致粘贴代码会导致缩进混乱 一则可以先关掉autoindent,二则可以先设置set ...
- 形参和实参|默认值|可选实参|tuple|*tuple|args|*args | **kwargs|args[:]|
#!/usr/bin/python def hello(i,greet='long time to see!'): out = "hello "+i+" "+g ...
- “Spring Boot+Marklogic实战应用(1)”
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议.本文链接:http://www.blbk.info Spring Boot+Marklogic应用 摘要: 在前一节的介绍,相信 ...
- 40)PHP,mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
分析: mysql_fetch_row,这个函数是从结果集中取一行作为枚举数据,从和指定的结果标识关联的结果集中取得一行数据并作为数组返回.每个结果的列储存在一个数组的单元中,偏移量从 开始. 注意, ...
- 05 - Tomcat 线程池的配置与优化
添加 Executor 在server.xml中的Service节点里面,增加executor节点,然后配置connector的executor属性,如下: <Executor name=&qu ...
- 004.前端开发知识,前端基础CSS(2020-01-09)
一.CSS字体样式属性 1.font-size:字号大小 2.font-family:字体 font-family属性用于设置字体.网页中常用的字体有宋体.微软雅黑.黑体等. * { /*font-f ...
- Tript协议|伯尔尼公约|著作权|立法宗旨|自动保护|著作权集体管理|
知识产权 国际条约: Tript协议是国际性公约,<与贸易有关的知识产权协定>(英文:Agreement on Trade-Related Aspects of Intellectual ...
- dom4j 为生成 XML 的文件添加 xmlns(命名空间) 属性
dom4j 为生成 XML 的文件添加 xmlns(命名空间) 属性 分类: Java2011-06-03 16:14 976人阅读 评论(0) 收藏 举报 xml扩展语言 今天在开发sitemap地 ...