- 在规则中使用通配符
在规则中使用通配符
如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。make支持三个通配符:*
, ?
和 ~
。这是和Unix的B-Shell是相同的。
波浪号( ~
)字符在文件名中也有比较特殊的用途。如果是 ~/test
,这就表示当前用户的 $HOME
目录下的test目录。而 ~hchen/test
则表示用户hchen的宿主目录下的test目录。(这些都是Unix下的小知识了,make也支持)而在Windows或是 MS-DOS下,用户没有宿主目录,那么波浪号所指的目录则根据环境变量“HOME”而定。
通配符代替了你一系列的文件,如 .c
表示所有后缀为c的文件。一个需要我们注意的是,如果我们的文件名中有通配符,如: ,那么可以用转义字符
\
,如 *
来表示真实的 *
字符,而不是任意长度的字符串。
好吧,还是先来看几个例子吧:
- clean:
- rm -f *.o
其实在这个clean:后面可以加上你想做的一些事情,如果你想看到在编译完后看看main.c的源代码,你可以在加上cat这个命令,例子如下:
- clean:
- cat main.c
- rm -f *.o
其结果你试一下就知道的。 上面这个例子我不不多说了,这是操作系统Shell所支持的通配符。这是在命令中的通配符。
- print: *.c
- lpr -p $?
- touch print
上面这个例子说明了通配符也可以在我们的规则中,目标print依赖于所有的 .c
文件。其中的$?
是一个自动化变量,我会在后面给你讲述。
- objects = *.o
上面这个例子,表示了通配符同样可以用在变量中。并不是说 .o
会展开,不!objects的值就是.o
。Makefile中的变量其实就是C/C++中的宏。如果你要让通配符在变量中展开,也就是让objects的值是所有 .o
的文件名的集合,那么,你可以这样:
- objects := $(wildcard *.o)
另给一个变量使用通配符的例子:
- 列出一确定文件夹中的所有
.c
文件。
- objects := $(wildcard *.c)
- 列出(1)中所有文件对应的
.o
文件,在(3)中我们可以看到它是由make自动编译出的:
- $(patsubst %.c,%.o,$(wildcard *.c))
- 由(1)(2)两步,可写出编译并链接所有
.c
和.o
文件
- objects := $(patsubst %.c,%.o,$(wildcard *.c))
- foo : $(objects)
- cc -o foo $(objects)
这种用法由关键字“wildcard”,“patsubst”指出,关于Makefile的关键字,我们将在后面讨论。