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