原地址:http://www.groad.net/bbs/thread-2947-1-2.html 在此表示感谢
wildcard 用来明确表示通配符。因为在 Makefile 里,变量实质上就是 C/C++ 中的宏,也就是说,如果一个表达式如 objs = *.o ,则 objs 的值就是 *.o ,而不是表示所有的 .o 文件。若果要使用通配符,那么就要使用 wildcard 来声明 * 这个符号,使 * 符号具有通配符的功能。如下举例:
在当前目录下随意建立两个 *.c 文件,如 hello.c 和 world.c ,现在编写一个 Makefile 如下: 运行输出: 上面输出了当前目录下的两个 .c 文件以及/usr/src/linux-2.6.24/drivers/char/ip2/ 目录下所有的 .c 文件。wildcard 也可以用来匹配变量。
比较以下几个代码(假设和 Makefile 文件同目录下已经有 include/config.mk 文件):
情况一 :
[Plain Text]
纯文本查看
复制代码
1
2
3
4
5
|
OBJTREE = /root/Makefile
src = $(wildcard $(OBJTREE)/include/config.mk)
all:
@echo $(src)
|
输出:
情况二 :
[Plain Text]
纯文本查看
复制代码
1
2
3
4
5
|
OBJTREE = .
src = $(wildcard $(OBJTREE)/include/config.mk)
all:
@echo $(src)
|
输出:
情况三 :
[Plain Text]
纯文本查看
复制代码
1
2
3
4
5
|
OBJTREE = hello
src = $(wildcard $(OBJTREE)/include/config.mk)
all:
@echo $(src)
|
输出:
对比上面 3 种情况可以看到,wildcard 也可以用来匹配变量,即这个变量可以是任意的情况。只是注意,wildcard 的核心是“匹配存在的文件”!像上面,将 OBJTREE 变量设为 hello ,当然是不可能找到 hello/include/config.mk 这个不存在的文件的,所以它的输出为空;而将正确的路径赋给 OBJTREE 时,它最后就能够正常的输出。