Makefile学习1 - 文件名通配符

一. 前言

        可使用的通配符有"*", "?", "[...]",例如,*.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适用于变量的定义,最后举例说明了其用法。

猜你喜欢

转载自blog.csdn.net/to_be_better_wen/article/details/130021611