original = foo.c bar.c
stripped := $(strip $(original))
all:
@echo $(stripped)
上篇文章 主要介绍了Makefile中的wildcard和patsubst函数,本文继续详细介绍下,Makefile中的主要函数,及其用法
1、abspath函数
用法:$(abspath _names)
该函数主要用于将_names中的各路径转换成绝对路径,并将转换后的结果返回。测试代码如下
ROOT := $(abspath /usr/../lib)
all:
echo $(ROOT)
2、addprefix函数
用法:$(addprefix _prefix, _names)
该函数主要用于给名字列表_names中的每一个名字增加前缀_prefix,并将增加了前缀的名字列表返回。测试代码如下
without_dir = main.c bar.c foo.c
with_dir := $(addprefix src/, $(without_dir))
all:
echo $(with_dir)
3、addsuffix函数
用法:$(addsuffix _suffix, _names)
该函数主要用于给名字列表_names中的每一个名字增加后缀_suffix,并将增加了后缀_suffix的名字列表返回。测试代码如下
without_suffix = main foo bar
with_suffix := $(addsuffix .c, $(without_suffix))
all:
echo $(with_suffix)
4、filter函数
用法:$(filter _pattern, _text)
该函数用于从一个名字列表_text中根据模式_pattern得到满足需要的名字列表返回。测试代码如下
sources = foo.c bar.c baz.s ugh.h
sources := $(filter %.c %.s, $(sources))
all:
echo $(sources)
5、eval函数
用法:$(eval _text)
eval函数的存在使得Makefile具有动态语言的特征。eval函数使得make将再一次解析_text语句。测试如下所示
sources = foo.c bar.c baz.s ugh.h
$(eval sources := $(filter %.c %.s, $(sources)))
all:
echo $(sources)
测试结果与4中使用filter是一样的,但是在某系场合却非得用eval函数不可。
6、filter-out函数
用法:$(filter-out _pattern, _text)
该函数用于从名字列表_text中根据模式_pattern滤除一部分名字,并将滤除后的列表返回。测试代码如下:
objects = main1.o foo.o main2.o bar.o
result = $(filter-out main%.o, $(objects))
all:
@echo $(result)
7、notdir函数
用法:$(notdir _names)
该函数用于从路径_names中抽取文件名,并将文件名返回。测试代码如下
file_name := $(notdir code/foo/src/foo.c code/bar/src/bar.c)
all:
@echo $(file_name)
8、patsubst函数
用法:$(patsubst _pattern, _replacement, _text)
该函数用于将名字列表_text中符合_pattern模式的名字替换为_replacement,并将替换后的名字列表返回。测试代码如下:
mixed = foo.c bar.c main.o
objects = $(patsubst %.c, %.o, $(mixed))
all:
@echo $(objects)
当然也可以采用变量赋值的高级用法,即在赋值的时候,完成文件名后缀替换工作,如下所示
mixed = foo.c bar.c main.o
objects = $(mixed:.c=.o)
all:
@echo $(objects)
以上两种替换方法都是可行的
9、realpath函数
用法:$(realpath _names)
用于获取_names所对应的真实路径,测试代码如下
ROOT := $(realpath ./..)
all:
@echo $(ROOT)
10、strip函数
用法:$(strip _string)
用于清除名字列表中的多余空格,测试代码如下
11、wildcard函数
用法:$(wildcard _pattern)
该函数是通配符函数,通过它可以得到当前工作目录中满足_pattern模式的文件或目录名列表,测试代码如下
SRCS = $(wildcard *.c)
all:
echo $(SRCS)