前言

在上一篇文章中,尽管使用了变量和模式,但还是有不够好的地方,在Makefile中要指明每一个源文件,我们接下来利用函数对其进行优化,并介绍其他常用的一些函数。

依旧是以fun.c ,main.c 和Makefile三个文件为例,文件内容就不再贴出来了,前两篇文章中都有。

1.wildcard函数

wildcard是通配符函数,通过它可以得到当前工作目录中满足 _pattern模式的文件或目录名列表。

格式为:$(wildcard _pattern)

.PHONY:all	

SRC = $(wildcard *.c)

all:
@echo $(SRC)

运行make

fun.c main.c

2.patsubst函数

patsubst 函数被用来将名字列表 _text中符合 _pattern模式的名字替换为 _replacement,并将替换后的名字列表返回。

格式为:$(patsubst _pattern, _replacement , _text)

.PHONY:all

SRC = fun.c main.c
objects := $(patsubst %.c, %.o, $(SRC))
all:
@echo $(objects)

运行make

fun.o main.o

有了这个两个函数,我们可以对之前的makefile进行优化

优化前

.PHONY:clean

CC = gcc
RM = rm TARGET = app
OBJS = main.o fun.o $(TARGET) : $(OBJS)
$(CC) -o $@ $^
%.o : %.c
$(CC) -o $@ -c $^
clean:
$(RM) $(TARGET) $(OBJS)

优化后

.PHONY:clean

CC = gcc
RM = rm TARGET = app
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS)) $(TARGET) : $(OBJS)
$(CC) -o $@ $^
%.o : %.c
$(CC) -o $@ -c $^
clean:
$(RM) $(TARGET) $(OBJS)

3.abspath函数

abspath函数被用于将 _names中的各路径名转换成绝对路径,并将转换后的结果返回。

格式为:$(abspath _names)

.PHONY:all

ROOT := $(abspath /usr/../lib)

all:
@echo $(ROOT)

运行make

/lib

4.addprefix函数

addprefix函数被用于给名字列表 _names中的每一个名字增加前缀 _prefix,并将增加了前缀的名字列表返回。

格式为:$(addprefix _prefix, _names)

.PHONY:all

without_dir := fun.c main.c
with_dir := $(addprefix objs/, $(without_dir)) all:
@echo $(with_dir)

运行make

objs/fun.c objs/main.c

5.addsuffix函数

addsuffix函数被用于给名字列表 _names中的每一个名字增加后缀 _suffix,并将增加了后缀 _suffix的名字列表返回。

格式为:$(addsuffix _suffix, _names)

.PHONY:all

without_suffix := funA funB
with_suffix := $(addsuffix .c, $(without_suffix)) all:
@echo $(with_suffix)

运行make

funA.c funB.c

6.filter函数

filter函数被用于从一个名字列表 _text中根据模式 _pattern得到满足需要的名字列表并返回。

格式为:$(filter _pattern, _text)

.PHONY:all

sources = fun.c main.c other.o test.h
sources := $(filter %.c %.o, $(sources)) all:
@echo $(sources)
# touch other.o test.h
# ls
fun.c main.c Makefile other.o test.h

运行make,可以看到,调用filter函数后,sources变量中只会有.c和.o的文件, .h文件不符合要求被过滤了

fun.c main.c other.o

7.filter-out函数

filter-out函数被用于从名字列表 _text中根据模式 _pattern滤除一部分名字,并将滤除后的列表返回。

格式为:$(filter-out _pattern, _text)

.PHONY:all

objects = funA.o funB.o fun.c main.c other.o test.h
results = $(filter-out fun%.o, $(objects)) all:
@echo $(results)

利用touch命令新建funA.o,funB.o文件,运行make

fun.c main.c other.o test.h

8.notdir函数

notdir函数被用来从路径 _names中抽取文件名,并将文件名返回。

格式为:$(notdir _names)

.PHONY:all

file_name := $(notdir code/src/fun.c code/src/main.c)
all:
@echo $(file_name)

运行make

fun.c main.c

9.realpath函数

realpath函数被用于获取names所对应的真实路径名。

格式为:$(realpath _names)

.PHONY:all

ROOT := $(realpath ./..)

all:
@echo $(ROOT)

运行make

/mnt/hgfs/Work/Makefile/3.2

10.strip函数

strip函数可以将将 _string 中的多余空格去除后返回。

格式为:$(strip _string)

.PHONY:all

orginal := fun.c       main.c
stripped := $(strip $(orginal)) all:
@echo "original = $(orginal)"
@echo "stripped = $(stripped)"

运行make

original =  fun.c       main.c
stripped = fun.c main.c

小结

本文介绍了一些常用的函数,只要加以灵活运用,会让你的Makefile变得高效又智能。

————————————————————————————————

码字不易,点个赞再走吧!

欢迎关注我的同名公众号,这里有更多好料等着你哦!

轻松玩转makefile | 函数的使用的更多相关文章

  1. [C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数

    了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数 目录 简介 特点 方法的参数 方法的返回值 与批处理交互的一个示例 简介 我们知道,新建一个控制台应用程序的时候,IDE 会同时创建 ...

  2. 完整版的CAD技巧!3天轻松玩转CAD,零基础也能学会

    最近有很多小伙伴反应,CAD图纸学起来有点小困难,也许你还没能掌握技巧,CAD大神带你3天轻松玩转CAD,零基础也能快速学会. 一.看懂图纸是关键 CAD制图首先得让自己知道要绘制什么,如果心中对图纸 ...

  3. 2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级

    去年.NET Conf China 技术大会上,我给大家分享了主题<轻松玩转.NET大规模版本升级>,今天把具体分享的内容整理成一篇博客,供大家研究参考学习. 一.先说一下技术挑战和业务背 ...

  4. 干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏)

    作者 | Will Koehrsen 翻译 | Lemon 译文出品 | Python数据之道 (ID:PyDataRoad) 本文通过一个项目案例,详细的介绍了如何从 Bokeh 基础到构建 Bok ...

  5. 详解Makefile 函数的语法与使用

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

  6. CAP带你轻松玩转Asp.Net Core消息队列

    CAP是什么? CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案,是.Net Core Community中的第一个千星项目(目前已经1656 Star),具有轻量级.易使用.高性能 ...

  7. makefile笔记10 - makefile 函数库文件

    函数库文件也就是对 Object 文件(程序编译的中间文件)的打包文件.在 Unix 下,一般是由命令"ar"来完成打包工作. 一.函数库文件的成员 一个函数库文件由多个文件组成. ...

  8. makefile笔记7 - makefile函数

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

  9. 详解Makefile 函数的语法与使用 (转)

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

  10. 【 MAKEFILE 编程基础之四】详解MAKEFILE 函数的语法与使用!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/771.html   ...

随机推荐

  1. Solon v2.6.5 发布(助力信创)

    Solon 是什么框架? Java "生态级"应用开发框架.从零开始构建,有自己的标准规范与开放生态(历时六年,具备全球第二级别的生态规模). 相对于 Spring,有什么特点? ...

  2. [转帖]设置CMD默认代码页为65001或936

    https://www.cnblogs.com/songzhenhua/p/9312769.html 之前不知道怎么改的,CMD的代码页被默认设置成了65001   但我右击CMD标题,选择'默认值' ...

  3. [转帖]Oracle如何重启mmon/mmnl进程(AWR自动采集)

    https://www.cnblogs.com/jyzhao/p/10119854.html 学习一下 环境:Oracle 11.2.0.4 RAC现象:sysaux空间满导致无法正常生成快照,清理空 ...

  4. [转帖]TiDB 使用 dumpling 导出数据,并使用 lightning 导入到另一个 TiDB 库

    本文介绍从 TiDB-A 库导出数据到 TiDB-B 库: 导出 Dumpling 包含在 tidb-toolkit 安装包中,可在此下载. 从 TiDB/MySQL 导出数据 需要的权限 SELEC ...

  5. [转帖]TiDB调优小结

    https://www.jianshu.com/p/d5ee4dca66d8 TiDB概览 先来一段官网的描述     TiDB server:无状态SQL解析层,支持二级索引,在线ddl,兼容MyS ...

  6. [转帖]Tiup 常用运维操作命令干货

    https://zhuanlan.zhihu.com/p/356031031 **导读**> 作者:杨漆> 16年关系型数据库管理,从oracle 9i .10g.11g.12c到Mysq ...

  7. [转帖]ES集群开启X-pack认证

    https://www.cnblogs.com/jclty/p/12913996.html 1.下载 1 # wget https://artifacts.elastic.co/downloads/e ...

  8. [转帖]【有效解决】Edge浏览器提示你的连接不是专用连接怎么办?

    https://www.xitongzhijia.net/xtjc/20230524/290887.html Win11正式版iso镜像最新(22H2新版) V2023 大小:4.22 GB类别:Wi ...

  9. [转帖]Linux shell 单引号和双引号

    https://www.cnblogs.com/airoot/p/15324883.html 在编写shell脚本的时候经常会用到引号,有些时候却老是忘记单引号和双引号之间的区别,所以就整理一下供以后 ...

  10. [转帖]CentOS8完美升级gcc版本方法

    https://blog.whsir.com/post-6114.html 在CentOS8系统中,默认gcc版本已经是8.x.x版本,但是在一些场景中,还是需要高版本的gcc,网上一些作死的文章还在 ...