轻松玩转makefile | 函数的使用
前言
在上一篇文章中,尽管使用了变量和模式,但还是有不够好的地方,在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 | 函数的使用的更多相关文章
- [C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数
了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数 目录 简介 特点 方法的参数 方法的返回值 与批处理交互的一个示例 简介 我们知道,新建一个控制台应用程序的时候,IDE 会同时创建 ...
- 完整版的CAD技巧!3天轻松玩转CAD,零基础也能学会
最近有很多小伙伴反应,CAD图纸学起来有点小困难,也许你还没能掌握技巧,CAD大神带你3天轻松玩转CAD,零基础也能快速学会. 一.看懂图纸是关键 CAD制图首先得让自己知道要绘制什么,如果心中对图纸 ...
- 2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级
去年.NET Conf China 技术大会上,我给大家分享了主题<轻松玩转.NET大规模版本升级>,今天把具体分享的内容整理成一篇博客,供大家研究参考学习. 一.先说一下技术挑战和业务背 ...
- 干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏)
作者 | Will Koehrsen 翻译 | Lemon 译文出品 | Python数据之道 (ID:PyDataRoad) 本文通过一个项目案例,详细的介绍了如何从 Bokeh 基础到构建 Bok ...
- 详解Makefile 函数的语法与使用
使用函数: 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做变量来使 ...
- CAP带你轻松玩转Asp.Net Core消息队列
CAP是什么? CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案,是.Net Core Community中的第一个千星项目(目前已经1656 Star),具有轻量级.易使用.高性能 ...
- makefile笔记10 - makefile 函数库文件
函数库文件也就是对 Object 文件(程序编译的中间文件)的打包文件.在 Unix 下,一般是由命令"ar"来完成打包工作. 一.函数库文件的成员 一个函数库文件由多个文件组成. ...
- makefile笔记7 - makefile函数
在 Makefile 中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能. make 所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做变量来使用. ...
- 详解Makefile 函数的语法与使用 (转)
使用函数: 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做变量来使 ...
- 【 MAKEFILE 编程基础之四】详解MAKEFILE 函数的语法与使用!
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/771.html ...
随机推荐
- 在TypeScript项目中搭配Axios封装后端接口调用
前言 本来是想发 next.js 开发笔记的,结果发现里面涉及了太多东西,还是拆分出来发吧~ 本文记录一下在 TypeScript 项目里封装 axios 的过程,之前在开发 StarBlog-Adm ...
- [转帖]理解 Linux backlog/somaxconn 内核参数
引言 在研究IOTDB的时候,启动服务的时候会有个报警. WARN: the value of net.core.somaxconn (=4096) is too small, please set ...
- [转帖]分享一个Navicat16最新版永久试用的办法
https://zhuanlan.zhihu.com/p/614621302 新建bat,就叫 navicat无限试用.bat @echo off echo Delete HKEY_CURRENT_U ...
- [转帖]xsos:一个在 Linux 上阅读 SOSReport 的工具
https://www.sohu.com/a/315931829_100034897 xsos 是一个帮助用户轻松读取 Linux 系统上的 sosreport 的工具.另一方面,我们可以说它是 so ...
- nginx 进行目录浏览的简单配置
1. 公司网络安全不让用vsftpd的匿名网络访问了, 没办法 只能够使用 nginx 通过http协议来处理. 2. 最简单的办法就是另外开一个nginx进程简单设置一下nginx的配置文件 wor ...
- Linux与Windows系统字符集的简要学习
背景 最近同事反馈公司的产品再更新了mysql-8.0.31的驱动jar包后部分功能报错. 问题核心原因 研发这边石磊老师已经找到了. 结论是Mysql8.0.26之后的数据库驱动好像会识别操作系统的 ...
- CentOS8 安装Oracle19c RPM的办法
1. 下载相应的rpm包 我这边使用的主要有: -rw-r--r-- 1 root root 19112 Apr 5 15:13 compat-libcap1-1.10-7.el7.x86_64.rp ...
- 物联网浏览器(IoTBrowser)-Web串口自定义开发
物联网浏览器(IoTBrowser)-Web串口自定义开发 工控系统中绝大部分硬件使用串口通讯,不论是原始串口通讯协议还是基于串口的Modbus-RTU协议,在代码成面都是使用System.IO.Po ...
- 基于javaPoet的缓存key优化实践
一. 背景 在一次系统opsreview中,发现了一些服务配置了@Cacheable注解.@cacheable 来源于spring cache框架中,作用是使用aop的方式将数据库中的热数据缓存在re ...
- Promise.all()方方详解
1.Promise.all()方方详解 Promise.all,只有所有的Promise成功,才能够算作成功,只要有一个失败了,就直接失败: 它包含一个参数,这个参数是指包含多个Promise的数组: ...