轻松玩转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 ...
随机推荐
- 京东App秒杀抢购流程接口分析(基于pypp技术)
App数据抓包必需工具 必需工具:小米手机,Charles,HttpCanary 从2022年2月后,京东只限于从app发起抢购,所以,网上的很多工具已经无效了.只能分析app端的底层协议和流程. g ...
- 基于java+springboot的宠物商店、宠物管理系统
该系统是基于java+springboot开发的宠物商城,用户可以登录该网站购买宠物.该系统是给师弟开发的课程作业.运行过程中的问题,可以咨询github或留言. 演示地址 前台地址: http:// ...
- 异步httpClient(Async HttpClient)
一.简介 二.mvn依赖 三.客户端 3.1 官网实例 3.2. 根据官方文档的介绍,简单封装了一个异步HttpClient工具类 3.3 基本原理 四.参考文档 一.简介 HttpClient提供了 ...
- SD协议-基本概念
1.SD协议版本 SD 1.1 SD 2.0 SD 3.0 在看协议的时候,需要注意协议的版本,注意版本之间的差别 SD协议是常见的数据通信和存储卡之间的协议 HDMI是显示相关的协议,遵循HDMI协 ...
- MySQL高可用九种方案
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 参考视频 MMM 方案(单主) MySQL 高可用方案之 MM ...
- [转帖]Nginx - 根据IP分配不同的访问后端
https://www.cnblogs.com/hukey/p/11868017.html 1. 需求分析 为了在线上环境提供测试分支,规定将某IP转发到测试程序地址.如果是 ngx 直接对外,采用 ...
- [转帖]Nginx反向代理中使用proxy_redirect重定向url
https://www.cnblogs.com/kevingrace/p/8073646.html 在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用pr ...
- 【转帖】TCP内核参数
https://www.cnblogs.com/chia/p/7799231.html tcp_syn_retries :INTEGER默认值是5对于一个新建连接,内核要发送多少个 SYN 连接请求才 ...
- nginx 企业版与开源版本的区别
- 学习下Redis内存模型
作者:京东零售 吴佳 前言 redis,对于一个java开发工程师来讲,其实算不得什么复杂新奇的技术,但可能也很少人去深入了解学习它的底层的一些东西.下面将通过对内存统计.内存划分.存储细节.对象类型 ...