一. 前言
可使用的通配符有"*", "?", "[...]",例如,*.c表示当前工作目录下所有的以.c结尾的文件,但是,Makefile中这些通配符不是可以用在任何地方。
二. 通配符的使用
Makefile中的通配符可以出现在以下两种场合
1. 用在规则的目标和依赖
make在读取Makefile时会自动对其进行匹配处理。示例如下:
# 打印当前工作目录的全部的.c文件
print: *.c
ls $?
2. 用在规则的命令中
通配符的统配处理在shell执行命令时完成。示例如下:
# 删除所有的.o文件
clean:
rm -f *.o
Makefile中的通配符不适用的场合
1. 对变量的定义使用通配符
示例如下:
objects = *.o
foo : $(objects)
cc -o foo $(CFLAGS) $(objects)
上面的objects将会是一个字符串"*.o",而不是所有的".o"文件的列表。这里如果所有的".o"文件都被删除了,"cc -o foo $(CFLAGS) $(objects)" 指令将会报错。
这里需要用到wildcard,正确使用是应该是objects = $(wildcard *.o)。
三. wildcard函数的使用
在规则中,通配符会自动展开,但是在变量的定义和函数的使用时,通配符将失效。此时,如果仍然想要通配符有效,就需要使用函数"wildcard"。
1. 用法
$(wildcard PATTERN)
2. 效果
他将被展开已经存在的,使用空格分开,匹配该模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。
3. 案例
示例代码如下:
objects := $(patsubst %.c,%.o,$(wildcard *.c))
target:$(objects)
cc -o target $(objects)
首先使用$(wildcard *.c)获取当前工作目录下的所有".c"文件名,再使用函数patsubst将".c"文件名替换为".o"文件名,赋值给objects变量。注意,cc -o target $(objects)还使用了Makefile的隐含规则。
四. 总结
本文介绍了通配符的含义,并介绍了通配符适用的两个场合:用在规则的目标和依赖中,用在命令中;不适用的场合:变量的定义。并引出了wildcard,wildcard适用于变量的定义,最后举例说明了其用法。