Makefile函数介绍

1.wildcard函数

wildcard是通配符函数,通过它可以得到当前工作目录中满足 _pattern模式的文件或目录名列表。

格式为:$(wildcard _pattern)

例子:

.PHONY:all 
​
SRC = $(wildcard *.c)
​
all:
 @echo $(SRC)

运行结果:

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)

运行结果

fun.o main.o

3.abspath函数

abspath函数被用于将 _names中的各路径名转换成绝对路径,并将转换后的结果返回。

格式为:$(abspath _names)

例子:

.PHONY:all
​
ROOT := $(abspath /usr/../lib)
​
all:
 @echo $(ROOT)

运行结果

/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)

运行结果:

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)

运行结果:

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)

运行结果:

fun.c main.c

9.realpath函数

realpath函数被用于获取_names所对应的真实路径名。

格式为:$(realpath _names)

例子:

.PHONY:all

ROOT := $(realpath ./..)

all:
 @echo $(ROOT)

运行结果:

/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)"

运行结果:

original =  fun.c       main.c
stripped =  fun.c main.c
11.foreach函数

在Makefile中如果想做一些循环或遍历操作时,可以使用foreach函数,foreach函数的工作过程是:把LIST中使用空格分割的单词依次取出并赋值给变量VAR,然后执行TEXT表达式。重复这个过程,直到遍历完LIST中的最后一个单词。函数的返回值是TEXT多次计算的结果

格式为:$(foreach VAR,LIST,TEXT)

例子: 

假设一个项目,MP3播放器,分别有lcd、keyboad、usb、media目录,分别存放不同的源文件:

# tree
.
├── keyboard
│ └── key.c
├── lcd
│ └── lcd.c
├── makefile
├── media
│ └── decode.c
└── usb
└── usb.c
.PHONY: all
dirs = lcd usb media keyboard
srcs = $(foreach dir, $(dirs), $(wildcard $(dir)/*))
all:
    @echo "srcs = $(srcs)"

运行结果:

srcs = lcd/lcd.c usb/usb.c media/decode.c keyboard/key.c

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值