前言

学习make和makefile的主要目的是分析大型项目的源代码的关系,上一节我们讲述了makefile 中的变量,本节主要学习一下 makefile 中的函数,首先函数肯定可以分为几部分:

  • 内置函数
  • 用户自动义函数
  • 函数的调用
  • ..

函数的语法

make 下所有函数都有如下形式:

1
$(function-name arg1[,arg2,arg3,..])

我们首先来看内置函数:

内置函数

make 的内置函数可分类如下:

字符串函数

$(filter pattern …,text)

pattern 中可以使用 % 来做通配符,值得注意的是: 每个 pattern 只支持 1 个 % ,比如:

1
2
3
4
5
6
//makefile
words := he the hen other the%
get-word:
@echo he matches: $(filter he,$(words))
@echo th% matches: $(filter th%,$(words))
@echo %th% matches: $(filter %th%,$(words))

结果为:

1
2
3
4
//result
he matches: he
th% matches: the the%
%th% matches: #最后一个不匹配,因为words中不存在以th%为结尾的单词

$(filter-out pattern ..,text)

filter-out同filter相反,比如:

1
2
3
4
5
//makefile
words := he the hen other the%
get-word:
@echo %th% matches: $(filter %th%,$(words))
@echo %th% matches: $(filter-out %th%,$(words))

结果为:

1
2
3
//result
%th% matches:
%th% matches: he the hen other the%

$(findstring string…,text)

此函数所返回会的只是“搜索字符”而不是包含搜索字符的字符,另外不支持pattern

1
2
3
4
5
words := he the hen other the%
get-word:
@echo %th% matches: $(findstring %th%,$(words))
@echo he matches: $(findstring he,$(words))
@echo he% matches: $(findstring he%,$(words))

结果为:

1
2
3
%th% matches:
he matches: he
he% matches: he%

$(subst search-string,replace-string,text)

不具有通配符能力的搜索替换函数,最经常使用于替换文件名列表的扩展名,如:

1
2
3
4
5
sources := fun.c foo.c
objects := $(subst .c,.o,$(sources)) target:
@echo $(objects)

结果为:

1
fun.o foo.o

$(patsubst search-pattern,replace-pattern,text)

具有通配符能力的替换功能,有几个注意点:

  • 此处的模式只可以包含一个 % 字符
  • replace-pattern中的百分比符号会被替换成与符号相符的文字
  • search-pattern必须和text的整个值进行匹配
1
2
3
4
source := main.c
object := $(patsubst %.c,%.o,$(source))
target:
gcc -c $(source) -o $(object)

结果为:

1
gcc -c main.c -o main.o

单词函数

$(words text)

统计text中单词个数 ,按照”space(空格)”进行拆分

1
2
3
4
CURRENT_PATH := $(subst /, ,$(PWD))
words:
@echo current path $(PWD)
@echo current path has $(words $(CURRENT_PATH)) directories

结果为:

1
2
current path /Users/hejianglin/study/makefile
current path has 4 directories

$(word n,text)

“space(空格)”进行拆分,返回 text 中的第 n 个单词,开始编号为 1,如果找不到相应的位置则返回空

1
2
3
4
CURRENT_PATH := $(subst /, ,$(PWD))
words:
@echo current path $ 大专栏  makefile(3)函数(PWD)
@echo current path second word: $(word 2,$(CURRENT_PATH))

结果为:

1
2
current path /Users/hejianglin/study/makefile
current path second word: hejianglin

$(wordlist start,end,text)

“space(空格)”进行拆分,返回 text 中的第 start(含) 到 end(含) 的单词,开始编号为 1,如果找不到相应的位置则返回空

文件名函数

$(wildcard pattern..)

文件列表

1
2
3
4
5
source := $(wildcard src/*.c include/*.h)

.PHONY: test
test:
@echo $(source)

结果为:

1
src/foo.c src/fun.c src/main.c include/foo.h include/fun.h

$(dir list…)

目录列表

1
2
3
4
5
source := $(wildcard src/*.c include/*.h)

.PHONY: test
test:
@echo $(dir $(source))

结果为:

1
src/ src/ src/ include/ include/

$(notdir list..)

删除目录的文件列表

1
2
3
4
5
source := $(wildcard src/*.c include/*.h)

.PHONY: test
test:
@echo $(notdir $(source))

结果为:

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
2
3
4
5
6
source := $(wildcard src/*.c include/*.h)
prefix_dir := $(dir $(source))
suffix_file := $(notdir $(source))
.PHONY: test
test:
@echo join $(join $(prefix_dir),$(suffix_file))

结果为:

1
join src/foo.c src/fun.c src/main.c include/foo.h include/fun.h

其他

$(sort list)

排序 list 并移除重复项,排序优先级: 数字 > 字母,字母按照升序排序:

1
2
3
source := b c 1 2 d 0 c
target:
@echo sort source: $(sort $(source))

结果为:

1
sort source: 0 1 2 b c d

$(shell command)

执行 shell 命令,输出的换行被替换成单一的空格符号,错误和状态都不会返回

1
2
3
4
.PHONY: test
CURRENT_DATE = $(shell date +%Y%m%d)
test:
@echo $(CURRENT_DATE)

结果为:

1
20180610

流程控制

if

$(if condition, then-part,else-part)

只要 condition 返回不为空,则为 true 便会执行 then-part, 否则执行 else-part

1
2
3
4
5
6
$(if $(filter $(MAKE_VERSION),3.79 3,80),,
$(error requires makefile version -.)) .PHONY: test
test:
@echo join $(join $(prefix_dir),$(suffix_file))

结果为:

1
makefile:1: *** requires makefile version -..  Stop.

因为本机的 make 版本是 3.81

for/while

$(foreach variable,list,body)

==这个函数实在难以理解(用法…),跳过吧==

makefile(3)函数的更多相关文章

  1. 跟我一起写Makefile:使用函数

    跟我一起写Makefile:使用函数 两个排版不一样 书籍下载 书籍下载

  2. Makefile常用函数(转)

    一.字符串处理函数 1.$(subst FROM,TO,TEXT) 函数名称:字符串替换函数-subst. 函数功能:把字串"TEXT"中的"FROM"字符替换 ...

  3. makefile常用函数

    标签(空格分隔): makefile 1.字符串替换和分析函数 $(subst from,to,text) #在文本"text"中使用"to"替换每一处&quo ...

  4. 调试makefile—subst函数

    操作系统:ubuntu10.04 Makefile里的subst用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO Makefile中的字符串处理函数格式:    ...

  5. Makefile常用函数总结

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

  6. makefile 常用函数

    Linux下编译c/c++源码需要编写makefile文件,文章参看 http://blog.sina.com.cn/s/blog_4c4d6e74010009jr.html 一函数的调用语法 二字符 ...

  7. Makefile eval函数

    https://www.cnblogs.com/gaojian/archive/2012/10/04/2711494.html对 makefile 中 eval 函数的学习体会 http://blog ...

  8. makefile的函数集合

    strip函数:$(strip text) 函数功能:去除字符串空格函数 示例: STR =        a    b c      LOSTR = $(strip $(STR)) #结果是&quo ...

  9. Makefile 赋值 函数定义 等小知识点

    1.赋值 == 到用的时候实际才去赋值:= 立刻赋值?= 未赋值才赋值+= 2.多层变量 多层变量引用(各种复杂组合...)a =bb= cc= dd =1$($($($(a)))) 最终等于1 3. ...

随机推荐

  1. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1

    1 更高级的算法牵扯到更多重的循环和复杂的计算,尤其是现在人工智能的算法尤其如此.有些历史知识的人能够了解到,人工智能的很多基本算法其实近百年之前就有了,但是当时的计算机技术达不到去实现这些算法的要求 ...

  2. Java连载72-String类详解、多个构造方法

    一.String类 1.String类是不可以变类,也就是说String对象声明后 2.java.lang.String:是字符串类型 (1)字符串一旦创建不可再改变,“abc”字符串对象一旦创建,不 ...

  3. 1.Jenkins基本安装及插件离线安装

    Jenkins基本安装 Jenkins官方地址:https://jenkins.io/zh/,下载最新版本,需要依赖对应的jdk版本才可以正常运行. dockerfile文件构建docker镜像 FR ...

  4. mysql统计指定数据库的各表的条数

    mysql统计指定数据库的各表的条数 SELECT table_schema,table_name,table_rows,CREATE_TIME FROM TABLES WHERE TABLE_SCH ...

  5. 在win10下安装ubuntu双系统总结

    在打算装双系统前两天,我事先在网上买了一个16G大小的U盘,用来坐启动盘.后来发现其实有4G大小就远远足够的,16G的太浪费了,忘后来人吸取教训.呜呜呜.....下面给大家讲讲我的安装步骤: 参考文章 ...

  6. 爬虫笔记(二)——浏览器的模拟(Headers属性)

    有的时候,我们无法爬取一些网页,会出现403错误,因为这些网页为了防止别人恶意采集其信息所以进行了一些反爬虫的设置.那么如果我们向爬取这些网页的信息,应该怎么办呢? 可以设置一些Headers信息,模 ...

  7. yum的repo文件详解、以及epel简介、yum源的更换、常用yum命令

    https://www.cnblogs.com/nineep/p/6795692.html       yum的repo文件详解.以及epel简介.yum源的更换 常用命令如下: yum list  ...

  8. logback日志大量写磁盘导致微服务不能正常响应的解决方案

    最近几天,遇到一个莫名其妙的问题,每天几乎同一时段微服务自己跑着跑着就假死了,过几个小时就又自动恢复了. 通过对定时任务.网卡.内存.磁盘.业务日志的排查分析,只有磁盘的IO在假死前一段时间偏高,经查 ...

  9. ORs-1-introduction

    introduction: 1.Olfactory receptors (ORs)很重要 2.已知的ORs的分子结构,但仍存在没清楚的地方: Though the relationship betwe ...

  10. pytorch源码解析-动态接口宏

    动态库接口定义: gcc: 定义在动态库的显示属性: 作用对象: 函数.变量.模板以及C++类 default: 表示在动态库内可见 hidden: 表示不可见 #define EXPORT __at ...