黑暗滚球兽的Makefile学习笔记(3)

一、前言

        在这篇文章中,我们首先会把我认为常用的函数逐一列出,附上示例,我认为函数是使像我这样的新手读不懂Makefile的重要原因之一。因为Makefile中函数和我们常用的语言中的,如C/C++等,具有较大的差距,这可能会使我们一时间摸不到头脑,但是只要习惯了,注意了就没什么好怕的了:)

二、函数使用

2.1函数调用方式

        Makefile的函数与常用语言的函数存在着较大差别,它有三个规则:

        1)函数名与参数之间以空格连接

        2)参数之间以逗号连接

        3)通过"$(*)"调用函数,其中*代表函数名与参数

        在刚接触Makefile时,我常常会因为分不清函数嵌套的逻辑,记不住函数的功能而导致无法明确代码语义。

2.2字符串处理函数

2.2.1subst 

使用方式:ans = $(subst $(a),$(b),$(var))

功能:将var中的a转换为b,并将结果赋给ans

2.2.2patsubst 

使用方式:ans = $(patsubst <pattern1>,<pattern2>,$(var))

功能:检索var中符合<pattern1>的字符串,并将其变为<pattern2>,将结果赋给ans

注:上述说明可能会比较抽象,实际这个函数比较想我写的上一篇文章的变量实用用法

obj = a.o b.o c.o

src = $(obj .o=.c)与src = $(patsubst %.o,%.c,$(obj))等价

2.2.3strip

使用方式:ans = $(strip $(var))

功能:去除var前后的空格,并将结果赋给ans

2.2.4findstring

使用方式:ans = $(findstring $(a),$(var))

功能:在var中查找a,若找到则返回a,否则返回空字符串

2.2.5filter

使用方式:ans = $(filter <pattern>,$(var))

功能:在var筛选出符合<pattern>的值,并将符合的赋给ans

2.2.6filter-out

与filter相反

2.2.7sort

使用方式:ans = $(sort $(var))

功能:将var中的单词按照升序排序,并将结果赋给ans

2.2.8word

使用方式:ans = $(word num,$(var))

功能:返回var中的第num个单词,并将其赋给ans

2.2.9words

使用方式:ans = $(words $(var))

功能:返回var中单词的数量,并将其赋给ans

2.3文件名操作函数

        大部分和文件名相关的函数都是成对出现的,因此我们一组一组的总结。我觉得我列出的这些文件名操作函数真的时非常有用的,因为Makefile是为了大型工程的“自动化编译”,文件数量往往较多,批量的文件操作是十分常用的。

2.3.1dir/notdir

使用方式:ans = $(dir(notdir) <names>)

功能:返回文件的路径(名字)

name = ./include/sort.h ./include/types.h ./src/sort.c
name_dir = $(dir $(name))
name_notdir = $(notdir $(name))


all:
	@echo $(name_dir)
	@echo $(name_notdir)

输出如下:

./include/ ./include/ ./src/
sort.h types.h sort.c

2.3.2suffix/basename

使用方式:ans = $(suffix(basename) <name>)

功能:取name中每个字符串的后缀(前缀),并将其赋给ans

name = ./include/sort.h ./include/types.h ./src/sort.c
name_suffix = $(suffix $(name))
name_basename = $(basename $(name))

all:
	@echo $(name_suffix)
	@echo $(name_basename)

输出为:

.h .h .c
./include/sort ./include/types ./src/sort

2.3.3addsuffix/addprefix

使用方式:ans = $(addsuffix(addprefix) <name>,$(var))

功能:把<name>架子啊var中每个字符串的后面(前面),并赋给ans

name1 = ./include/
name2 = .h
prog = test sort
ans = $(addsuffix $(name2),$(addprefix $(name1),$(prog)))

all:
	@echo $(ans)

输出为:

./include/test.h ./include/sort.h

2.3.4join

使用方式:ans = $(join $(var1),$(var2))

功能:将var2的单词依次接在var1中每个单词的后面,并将结果赋给ans

var1 = sort test
var2 = .o .c
all:
    @echo $(join $(var1),$(var2))

输出为:

sort.o test.c

三、结语

        由于篇幅的显示,这篇文章中仅罗列了较为基本的函数,如果我在工作过程中给遇到了其他函数,我会在未来的学习笔记中添加,或者直接修改这篇文章。在大型工程的Makefile中不一定会大量使用一些复杂的函数,相反其中大多数情况是多个简单函数的嵌套,因此我觉得在这部分一定要做到熟练记忆并使用各种简单函数!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值