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

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


http://www.kler.cn/a/302138.html

相关文章:

  • 综合文化信息管理系统|基于java和小程序的综合文化信息管理系统设计与实现(源码+数据库+文档)
  • 云原生周刊:Istio 1.24.0 正式发布
  • 11. 观光景点组合得分问题 |豆包MarsCode AI刷题
  • 两种鼠标hover切换对应图片方法对比
  • 删库跑路,启动!
  • 跟着尚硅谷学vue2—基础篇4.0
  • 【Http 每天一小问 ,Post上传文件时, 文件和 -d(--data)和 -F(--form) 不能同时存在 ,怎么办】
  • Linux系统安装CUDA
  • JSON对象
  • JSDelivr NPM CDN 国内加速节点
  • java设计模式(持续更新中)
  • 英伟达与甲骨文携手加速企业级AI和数据处理
  • 搭建一个本地 SMTP 服务器
  • [苍穹外卖]-05Redis快速入门
  • 【算法】冒泡排序
  • CSP-J 算法基础 二分查找与二分答案
  • 【Python爬虫】利用爬虫抓取双色球开奖号码,获取完整数据并通过随机森林和多层感知两种模型进行简单的预测
  • VulnHub DC-1-DC-7靶机WP
  • 计算机网络期末试题及答案
  • Java学习路线
  • Redis及其他缓存
  • 数字孪生之-3D可视化
  • Linux系统安装
  • C++20那些事之何时使用可能性属性?
  • 银行业金融机构反洗钱现场检查数据接口规范(试行)
  • 如何升级用 Helm 安装的极狐GitLab Runner?