前言

在上一篇文章中,尽管使用了变量和模式,但还是有不够好的地方,在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. centos7 docker配置防火墙firewalld

    docker防火墙使用的是底层iptables,封装后的firewalld默认不生效 如果想要使用firewalld,需要做以下调整: 让firewalld移除DOCKER-USER并新建一个 # R ...

  2. SV 字符串类型

    概述 常见使用方式 string b; string b=""; // 拼接字符串 string a = {"hi",b}; // 将字符串a赋值给[15:0] ...

  3. P5729 【深基5.例7】工艺品制作

    1.题目介绍 [深基5.例7]工艺品制作 题目描述 现有一个长宽高分别为 \(w,x,h\) 组成的实心玻璃立方体,可以认为是由 \(1\times1\times1\) 的数个小方块组成的,每个小方块 ...

  4. Error adding module to project: null I(IDEA创建maven项目时遇到此提示)

    1.问题 在已创建一个springboot项目的时候,想要再增添一个Maven项目,发生报错 2.解决 根本原因是创建maven模块时选择的sdk版本过高(选用了openjdk19).选用jdk1.8 ...

  5. 【BUS】LIN Bus

    概述 随着汽车内电子设备的增多,市场上对于成本低于 CAN 的总线的需求日益强烈,不同的车厂相继开发各自的串行通信(UART/SCI)协议,以在低速和对性能要求不高的场合取代CAN.由于不同车厂定义的 ...

  6. Laravel - Eloquent 模型查询

    Laravel 的 Eloquent ORM 提供了漂亮.简洁的 ActiveRecord 实现来和数据库进行交互.每个数据库表都有一个对应的「模型」可用来跟数据表进行交互.你可以通过模型查找数据表内 ...

  7. 如何看待《李跳跳》APP因被腾讯公司发律师函称“不正当竞争”而无限期停止更新?

    一波未平一波又起,继李跳跳无限期停更后,又一安卓神奇工具被下发律师函!近期各路安卓工具APP,被某讯大厂可谓是尽数剿灭~ 不难看出此次行动是"蓄谋已久"了.与李跳跳.大圣净化类似的 ...

  8. Python学习之十六_virsh批量获取虚拟机IP地址的方法

    Python学习之十六_virsh批量获取虚拟机IP地址的方法 Linux命令说明 for j in \ $(for i in `virsh list |grep -v Id |grep runnin ...

  9. 关于JVM指针压缩性能的研究

    关于JVM指针压缩性能的研究 摘要 JVM的内存对消最小是 8bytes 所以32G内存的情况下可以使用 32位的指针就可以了. 32位就是4G 在乘以最小的内存extent 8 bytes 的出来可 ...

  10. [转帖]远超DDR4,速度可达DDR5 6400!DDR5内存技术、产品解析

    https://www.sohu.com/a/326810241_616364 内存是计算机技术的重要组成部分,经历了长时间的竞争更替和路线选择之后,PC内存技术被稳定在以DDR技术为基础的发展路线上 ...