前言

在上一篇文章中,尽管使用了变量和模式,但还是有不够好的地方,在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. spring--@Autowired @Qualifier @Resource @Value 四者的区别

    @Autowired,@Qualifier,@Resource,和 @Value 是 Spring 框架中用于依赖注入的注解,它们各有特点和用途: @Autowired: @Autowired 注解用 ...

  2. 【解决方案】如何使用 Http API 代替 OpenFeign 进行远程服务调用

    目录 前言 一.何为OpenFeign 1.1@FeignClient注解 1.2注意事项 二.常见的Http API 2.1Apache 2.2Okhttp 2.3Hutool 三.RestTemp ...

  3. 一个WPF开发的打印对话框-PrintDialogX

    今天五月一号,大家玩的开心哦. 1. 介绍 今天介绍一个WPF开发的打印对话框开源项目-PrintDialogX,该开源项目由<WPF开源项目:AIStudio.Wpf.AClient>作 ...

  4. [STM32H7] 实战技能分享,如何让工程代码各种优化等级通吃,含MDK AC5,AC6,IAR和GCC

    引出问题:    一个好的工程项目代码,特别是开源类的,如果能做到各种优化等级通吃,是一种非常好的工程案例,这样别人借鉴的时候,可以方便的适配到自己工程里.但实际项目中,针对一款产品代码,我们一般不会 ...

  5. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.05)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  6. VMware虚拟机部署Linux Ubuntu系统的方法

      本文介绍基于VMware Workstation Pro虚拟机软件,配置Linux Ubuntu操作系统环境的方法.   首先,我们需要进行VMware Workstation Pro虚拟机软件的 ...

  7. 快速定位Java应用卡顿的原因

    快速定位Java应用卡顿的原因 背景 同事的环境说出现了一周的卡顿现象. 元旦加班期间告诉我时已经是2024.1.1下午五点了. 当时没有来得及去查看. 上班之后发现问题很简单. 不过为了能够指导一下 ...

  8. [转帖]nginx配置默认首页(index.html index.htm)全流程(包含遇到问题的解决)

    https://www.cnblogs.com/tujietg/p/10753041.html#:~:text=%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%9 ...

  9. [转帖]elasticsearch 8.0 linux安装部署

    1. 下载安装包 https://www.elastic.co/cn/downloads/elasticsearch 选择下载linux版本,elasticsearch-8.0.0-linux-x86 ...

  10. [转帖]Redis各版本特性汇总

    redis4 redis5 redis6 redis6.2 重大特性 1.模块系统 2.PSYNC2 3.LFU淘汰策略 4.混合RDB-AOF持久化 5.LAZY FREE延迟释放 6.MEMORY ...