当前位置: 首页 > news >正文

Linux Makefile文本处理函数知识详解

1.Makefile函数

GNU make 提供了大量的函数用来处理文件名、变量、文本和命令。通过这些函数,用户可以节省很多精力,编写出更加灵活和健壮的Makefile。函数的使用和变量引用的展开方式相同:

$(function arguments)${function arguments}

关于函数的使用格式,有以下需要注意的地方:

  • 函数主要分为两类:make内嵌函数和用户自定义函数。对于 GNU make内嵌的函数,直接引用就可以了;对于用户自定义的函数,要通过make的call函数来间接调用。
  • 函数和参数列表之间要用空格隔开,多个参数之间使用逗号隔开。
  • 如果在参数中引用了变量,变量的引用建议和函数引用使用统一格式:要么是一对小括号,要么是一对大括号。

函数使用示例:如果我们想要获取某个目录下所有的C文件列表,可以使用扩展通配符函数:wildcard

SRC  = $(wildcard *.c)HEAD = $(wildcard *.h)all:    @echo "SRC = $(SRC)"    @echo "HEAD = $(HEAD)"

在当前目录下,我们新建一些C文件和H文件,然后使用make命令:

# lsadd.c  add.h  hello.c  main.c  makefile  sub.c  sub.h# makeSRC = hello.c main.c add.c sub.cHEAD = add.h sub.h

1.1用户自定义函数

GNU make提供了大量的内嵌函数,大大方便了用户Makefile的编写。但有时候根据需要,用户也可以自定义一些函数,然后在Makefile中引用它们:

PHONY: alldefine func    @echo "pram1 = $(0)"    @echo "pram2 = $(1)"endefall:    $(call func, hello zhaixue.cc)

用户自定义函以define开头,endef结束,给函数传递的参数在函数中使用$(0)、$(1)引用,分别表示第1个参数、第2个参数…对于用户自定义函数,在Makefile中要使用call函数间接调用,各个参数之间使用空格隔开:

# makepram1 = funcpram2 =  hello zhaixue.cc

2.Makefile文本处理函数 

GNU make提供了一系列文本处理函数:subst、patsubst、strip、findstring、filter、filer-out、sort、word、wordlist、words、fistword。接下来我们一一讲解:

2.1subst函数

subst函数用来实现字符串的替换,将字符串text中的old替换为new

$(subst old,new,text)

编写一个Makefile,将当前目录下的所有c文件的名称xx.c转换为xx.o

.PHONY: allSRC  = $(wildcard *.c)OBJ  = $(subst .c,.o,$(SRC))all:    @echo "OBJ = $(OBJ)"    @echo $(subst banana, apple, "banana is good, I like banana")

执行make命令,可以看到执行结果:字符串中的banana替换成了apple,SRC变量中的所有.c 替换成了 .o:

# lsadd.c  add.h  hello.c  main.c  makefile  sub.c  sub.h# makeOBJ = hello.o main.o add.o sub.o apple is good, I like  apple

2.2patsubst函数

patsubst函数主要用来模式替换:使用通配符 % 代表一个单词中的若干字符,在PATTERN和REPLACEMENT如果都包含这个通配符,表示两者表示的是相同的若干个字符,并执行替换操作。

$(patsubst PATTERN, REPLACEMENT, TEXT)

如果我们想把某个目录下的所有.c文件皆为的文件名转换为以.o皆为的目标文件名,相比subst,使用patsubst会更加方便:

.PHONY: allSRC  = $(wildcard *.c)OBJ  = $(patsubst %.c, %.o, $(SRC))all:    @echo "OBJ = $(OBJ)"

SRC变量中包括多个字符串,代表各个文件名,各个字符串之间使用空格隔开,使用OBJ变量保存转换后的字符串。在当前目录下直接执行make,可以看到运行结果:

# lsadd.c  add.h  hello.c  main.c  makefile  sub.c  sub.h# makeOBJ =  hello.o  main.o  add.o  sub.o

在Makefile中,如果我们已经得到了需要编译的C文件,想要得到它们对应的目标文件,经常使用上面的patsubst函数进行转换。

2.3strip函数

strip函数是一个去空格函数:一个字符串通常有多个单词,单词之间使用一个或多个空格进行分割,strip函数用来将多个连续的空字符合并成一个,并去掉字符串开头、末尾的空字符。空字符包括:空格、多个空格、tab等不可显示的字符。

.PHONY: allSTR =     hello a    b   cSTRIP_STR = $(strip $(STR))all:    @echo "STR = $(STR)"    @echo "STRIP_STR = $(STRIP_STR)"

执行make后的结果:

# makeSTR = hello a    b   cSTRIP_STR = hello a b c

strip函数经常用在条件判断语句的表达式中,去掉多余的空格等因素,确保表达式比较的可靠和健壮。

ifeq ($(strip $(foo)),)    echo "foo is empty"endif

2.4findstring 函数

findstring函数用来查找一个字符串。使用格式如下:

$(findstring FIND, IN)

findstring函数会在字符串IN中查找“FIND”字符串,如果找到,则返回字符串FIND,否则,返回空。

.PHONY: allSTR =     hello a    b   cFIND = $(findstring hello, $(STR))all:    @echo "STR = $(STR)"    @echo "FIND = $(FIND)"

执行make,运行结果为:

# makeSTR = hello a    b   cFIND = hello

2.5filter 函数

filter函数用来过滤掉一个指定的字符串,使用格式如下:

$(filter PATTERN…,TEXT)

filter函数用来过滤掉字符串TEXT中所有不符合PATTERN模式的单词,只留下符合PATTERN格式的单词。

.PHONY: allFILE = a.c b.h c.s d.cppSRC = $(filter %.c, $(FILE))all:    @echo "FILE = $(FILE)"    @echo "SRC = $(SRC)"

执行make,运行结果为:

# makeFILE = a.c b.h c.s d.cppSRC = a.c

2.6filter-out 函数

filer-out函数是一个反过滤函数,功能和filter函数恰恰相反:该函数会过滤掉所有符合PATTERN模式的单词,保留所有不符合此模式的单词。

.PHONY: allFILE = a.c b.h c.s d.cppSRC = $(filter-out %.c, $(FILE))all:    @echo "FILE = $(FILE)"    @echo "SRC = $(SRC)"

在上面的Makefile中,使用filter-out %.c 过滤掉所有的.c文件。执行make,运行结果为:

# makeFILE = a.c b.h c.s d.cppSRC = b.h c.s d.cpp

2.7sort函数:单词排序

$(sort LIST)

sort函数对字符串LIST中的单词以首字母为准进行排序,并删除重复的单词。

.PHONY: allFILE = a.c b.h c.s d.cppSRC = $(filter-out %.c, $(FILE))all:    @echo "FILE = $(FILE)"    @echo "SRC = $(SRC)"

执行make,运行结果为:

# makeLIST = banana pear apple peach apple orangeSTR = apple banana orange peach pear

2.8word函数:取单词

word函数的作用是从一个字符串TEXT中,按照指定的数目N取单词:

 $(word N,TEXT)

函数的返回值是字符串TEXT中的第N个单词。如果N的值大于字符串中单词的个数,返回空;如果N为0,则出错。

.PHONY: allLIST = banana pear apple peach orangeword1 = $(word 1, $(LIST))word2 = $(word 2, $(LIST))word3 = $(word 3, $(LIST))word4 = $(word 4, $(LIST))word5 = $(word 5, $(LIST))word6 = $(word 6, $(LIST))all:    @echo "word1 = $(word1)"    @echo "word2 = $(word2)"    @echo "word3 = $(word3)"    @echo "word4 = $(word4)"    @echo "word5 = $(word5)"    @echo "word6 = $(word6)"

执行make,运行结果为:

# makeword1 = bananaword2 = pearword3 = appleword4 = peachword5 = orangeword6 =

如果N的值为0,Makefile含有下面的语句:

word0 = $(word 0, $(LIST))

则会报错:

makefile:9: *** first argument to 'word' function must be greater than 0.  Stop.

2.9wordlist函数:取字串

wordlist函数用来从一个字符串TEXT中取出从N到M之间的一个单词串:

$(wordlist N, M, TEXT)

N 和 M都是从1开始的一个数字,函数的返回值是字符串TEXT中从N到M的一个单词串。当N比字符串TEXT中的单词个数大时,函数返回空。

.PHONY: allLIST = banana pear apple peach orangesub_list = $(wordlist 1, 3, $(LIST))all:    @echo "LIST = $(LIST)"    @echo "sub_list = $(sub_list)"

执行make时,wordlist函数会将字符串LIST中的前三个单词赋值给sub_list:

# makeLIST = banana pear apple peach orangesub_list = banana pear apple

2.10words函数:统计单词数目

words函数用来统计一个字符串TEXT中单词的个数:

$(words TEXT)

words函数的返回值为字符串TEXT中单词的个数。

.PHONY: allLIST = banana pear apple peach orangeall:    @echo "LIST = $(LIST)"    @echo "LIST len = $(words $(LIST))

执行make,运行结果为:

# makeLIST = banana pear apple peach orangeLIST len = 5

2.11firstword函数:取首个单词

firstword函数用来取一个字符串中的首个单词。

$(firstword NAMES…)$(word 1,TEXT)

firstword函数其实就相当于$(word 1,TEXT):

.PHONY: allLIST = banana pear apple peach orangeall:    @echo "LIST = $(LIST)"    @echo "first word = $(firstword $(LIST))"

执行make,运行结果为:

# makeLIST = banana pear apple peach orangefirst word = banana

相关文章:

Linux Makefile文本处理函数知识详解

1.Makefile函数 GNU make 提供了大量的函数用来处理文件名、变量、文本和命令。通过这些函数,用户可以节省很多精力,编写出更加灵活和健壮的Makefile。函数的使用和变量引用的展开方式相同: $(function arguments)${function arguments}关于…...

Rust的数据类型

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust到底值不值得学,之一 -CSDN博客 Rust到底值不值得学,之二-CSDN博客 3.5 数据类型的定义和分类 在Rust…...

如何在vim中批量注释和取消注释

一、批量注释 首先在你需要注释的初始所在行在命令模式下输入CTRL v,然后按下HJKL来控制方向(不能使用键盘上的箭头方向键): 然后输入 shifti: 输入两个斜杠然后加exc就可以完成批量注释: 二、批量取消注…...

Centos7.9 安装Elasticsearch 8.15.1(图文教程)

本章教程,主要记录在Centos7.9 安装Elasticsearch 8.15.1的整个安装过程。 一、下载安装包 下载地址: https://www.elastic.co/cn/downloads/past-releases/elasticsearch-8-15-1 你可以通过手动下载然后上传到服务器,也可以直接使用在线下载的方式。 wget https://artifacts…...

哈希表-数据结构

一、哈希表基本概念 哈希表(也称为散列表)是根据键而直接访问在内存存储位置的数据结构,也就是说实际上是经过哈希函数进行映射,映射道表中一个位置来访问记录,这个存放记录的数组称为散列表。 哈希函数:就…...

指针之旅(4)—— 指针与函数:函数指针、转移表、回调函数

目录 1. 函数名的理解 1.1 “函数名”和“&函数名”的含义 1.2 函数(名)的数据类型 2. 函数指针(变量) 2.1 函数指针(变量)的创建格式 2.2 函数指针(变量)的使用格式 2.3 例子 判别 3. typedef 关键字 3.1 typedef的作用 3.2 typedef的运作逻辑 和 函数指针类型…...

打造线上+线下相结合的O2O平台预约上门服务小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 本系统采用前后端分离的设计架构,前端以微信小程序为载体,提供直观、易用的用户界面;后端则采用稳定的服务器架构,确保数据处理的高效与安全。系统主要包括用户端、商户端和管理员端三大模块,通过API接口实现…...

python sys模块

在Python中,sys模块提供了访问和使用解释器的许多功能的方法,包括命令行参数、环境变量、路径管理、标准输入输出流等。sys模块是Python的标准库的一部分,不需要额外安装即可使用。 常用的sys模块功能 1. sys.argv sys.argv是一个包含命令…...

【Linux 报错】SSH服务器拒绝了密码。请再试一次。(xshell)

出现该错误 可能的原因: 你写入的登录密码错误了,错误原因有: 1、本来输入就错误了 2、创建用户时,只创建了用户名,但密码没有重新设置 3、多人使用同一台服务器时,该服务器管理员(本体&#x…...

云计算实训43——部署k8s基础环境、配置内核模块、基本组件安装

一、前期系统环境准备 1、关闭防火墙与selinux [rootk8s-master ~]# systemctl stop firewalld[rootk8s-master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus…...

TAbleau 可视化 干货分享 | 简单三步助你打造完美仪表板

只需单击几下,你将能轻松创建美观、信息丰富的可视化效果、节省时间并推动业务向前发展! 借助精心设计的仪表板,分析师可以更好地理解复杂数据背后的信息,更有效地向他人分享你的见解,从而做出更明智的决策。 值得思考…...

JVM性能调优之5种垃圾收集器

JDK垃圾收集器 一、Serial GC垃圾收集器Serial GC的工作原理Serial GC的特点Serial GC的配置参数Serial GC的适用场景Serial GC的优缺点优点:缺点: Serial GC的总结 二、Parallel GC垃圾收集器Parallel GC的工作原理Parallel GC的特点Parallel GC的配置参…...

基于单片机的仔猪喂饲系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…...

Helm Deploy Online Rancher v2.9.1

文章目录 准备安装查看下载 准备 $ kubectl get node NAME STATUS ROLES AGE VERSION kube-master01 Ready control-plane 19d v1.29.5 kube-node01 Ready <none> 19d v1.29.5 kube-node02 Ready <none&…...

【办公效率】Axure会议室预订小程序原型图,含PRD需求文档和竞品分析

作品说明 作品页数&#xff1a;共50页 兼容版本&#xff1a;Axure RP 8/9/10 应用领域&#xff1a;中小型企业的会议室在线预订 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为会议室预订小程序原型图&#xff0c;定位于拥有中大型…...

论文解析一: SuperPoint 一种自监督网络框架,能够同时提取特征点的位置以及描述子

目录 SuperPoint&#xff1a;一种自监督网络框架&#xff0c;能够同时提取特征点的位置以及描述子1.特征点预训练2.自监督标签3.整体网络结构3.1 先对图像进行卷积3.2 特征点提取部分&#xff08;Interest Point Decoder&#xff09;3.3 特征描述子提取部分&#xff08;Descrip…...

【评估指标】Fβ-score

1. Fβ-score 概述 Fβ-score 是一种综合考量精确率&#xff08;precision&#xff09;和召回率&#xff08;recall&#xff09;的分类评估指标。其公式为&#xff1a; 1.1 Precision&#xff08;精确率&#xff09;&#xff1a;预测为正类的样本中&#xff0c;实际为正类的比…...

1963Springboot个性化音乐推荐管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…...

solidity从入门到精通(持续更新)

我一度觉得自己不知何时变成了一个浮躁的人&#xff0c;一度不想受外界干扰的我被干扰了&#xff0c;再无法平静的去看一本书&#xff0c;但我仍旧希望我能够克服这些&#xff0c;压抑着自己直到所有的冲动和奇怪的思想都无法再左右我行动。 自律会让你更加自律&#xff0c;放纵…...

UEFI入门(二):edk2项目编译流程

UEFI入门&#xff08;二&#xff09;&#xff1a;edk2项目编译流程 一、编译构建流程&#xff1a;1. 安装依赖工具2. 初始化构建环境3. 配置工具链和目标4. 定义平台配置5. 构建并编译 二、uefi-tools编译edk2实践&#xff1a;1. 克隆EDK2 项目2. 构建并编译 参考文章&#xff…...

局域网一套键鼠控制两台电脑(台式机和笔记本)

服务端&#xff08;有键盘和鼠标的电脑作为服务端&#xff09; 下载软件 分享文件&#xff1a;BarrierSetup-2.3.3.exe 链接&#xff1a;https://pan.xunlei.com/s/VO66rAZkzxTxVm-0QRCJ33mMA1?pwd4jde# 配置服务端 一&#xff0c; 二&#xff0c; 客户端屏幕名称一定要和…...

最新Nessus2024.9.8版本主机漏洞扫描/探测工具下载Windows版

Nessus号称是世界上最流行的漏洞扫描程序&#xff0c;全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务&#xff0c;并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件&#xff0c;Nessus可同时在本机或远端上遥控&#xff0c;进行系统的漏洞分析扫描…...

关于使用 @iconify/vue2图标库组件的离线使用

Iconify 是最通用的图标框架&#xff0c;将各种图标库的图标集中在这里的一个组件库&#xff0c;例如ant-design,element-ui等 网站地址如下 https://iconify.design/getting-started/ 1.安装依赖 这两个包提供了图标组件和离线图标数据的支持。 npm install iconify/vue2 i…...

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据&#xff0c;将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdf…...

PLM系统有哪些品牌推荐?国内不错的PLM厂商有哪些?

在当今快速变化的商业环境中&#xff0c;产品生命周期管理PLM系统已成为企业技术创新和管理创新的重要工具。PLM系统涵盖了产品从概念设计到市场推出、使用维护直至最终报废的整个生命周期&#xff0c;通过整合与产品相关的所有信息&#xff0c;助力企业实现高效、协同的产品开…...

Linux网络:网络套接字-TCP回显服务器——多进程/线程池(生产者消费者模型)

1.多进程版本 这里选择创建子进程&#xff0c;让子进程再创建子进程。父进程等待子进程&#xff0c;子进程的子进程处理业务逻辑。因为子进程是直接退出&#xff0c;子进程的子进程变成孤儿进程被系统管理&#xff0c;所以父进程在等待的时候不是阻塞等待的&#xff0c;所以可…...

Redis 篇-深入了解基于 Redis 实现消息队列(比较基于 List 实现消息队列、基于 PubSub 发布订阅模型之间的区别)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 消息队列的认识 2.0 基于 List 实现消息队列 2.1 基于 List 实现消息队列的优缺点 3.0 基于 PubSub 实现消息队列 3.1 基于 PubSub 的消息队列优缺点 4.0 基于 St…...

python 学习一张图

python学习一张图&#xff0c;python的特点的是学的快&#xff0c;一段时间不用&#xff0c;忘记的也快&#xff0c;弄一张图及一些入门案例吧。 写一个简单的测试&#xff1a; #!/usr/bin/python # -*- coding: UTF-8 -*- import osdef add_num(a, b):return a bif __name__…...

通过Docker部署 MongoDB 服务器

今天我们将在三丰云的免费服务器上进行 MongoDB 的部署测试。这款不错的免费服务器提供了很好的性能&#xff0c;1核CPU、1G内存、10G硬盘和5M带宽&#xff0c;足以满足我们的基本需求。三丰云的服务稳定&#xff0c;操作简单&#xff0c;真是一个值得推荐的选择&#xff0c;特…...

无人机避障雷达技术详解

随着无人机技术的飞速发展&#xff0c;其应用领域已经从最初的军事领域扩展到商业、农业、建筑巡检、应急救援、物流运输等多个领域。在这些多样化的应用场景中&#xff0c;无人机的安全性和稳定性显得尤为重要。无人机避障技术作为保障无人机安全飞行的核心技术之一&#xff0…...