wildcard 的理解

原地址: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 如下:
src = $(wildcard *.c /usr/src/linux-2.6.24/drivers/char/ip2/*.c)

all:
        @echo $(src)
运行输出:
# make
hello.c world.c /usr/src/linux-2.6.24/drivers/char/ip2/i2cmd.c /usr/src/linux-2.6.24/drivers/char/ip2/i2ellis.c /usr/src/linux-2.6.24/drivers/char/ip2/i2lib.c /usr/src/linux-2.6.24/drivers/char/ip2/ip2.mod.c /usr/src/linux-2.6.24/drivers/char/ip2/ip2base.c /usr/src/linux-2.6.24/drivers/char/ip2/ip2main.c /usr/src/linux-2.6.24/drivers/char/ip2/ip2main.mod.c
上面输出了当前目录下的两个 .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)

输出:
# make
/root/Makefile/include/config.mk

情况二
[Plain Text]  纯文本查看  复制代码
?
1
2
3
4
5
OBJTREE = .
src = $(wildcard $(OBJTREE)/include/config.mk)
 
all:
         @echo $(src)

输出:
# make
./include/config.mk

情况三
[Plain Text]  纯文本查看  复制代码
?
1
2
3
4
5
OBJTREE = hello
src = $(wildcard $(OBJTREE)/include/config.mk)
 
all:
         @echo $(src)

输出:
# make
/*输出内容为空*/

对比上面 3 种情况可以看到,wildcard 也可以用来匹配变量,即这个变量可以是任意的情况。只是注意,wildcard 的核心是“匹配存在的文件”!像上面,将 OBJTREE 变量设为 hello ,当然是不可能找到 hello/include/config.mk 这个不存在的文件的,所以它的输出为空;而将正确的路径赋给 OBJTREE 时,它最后就能够正常的输出。

你可能感兴趣的:(Makefile)