制作文件:模式规则

Make file: Pattern Rules

我对 make 文件中模式规则的使用感到困惑。

查阅了很多网站和资源后,我发现可以使用下面的makefile为目录中的每个源文件生成可执行文件。

CC = gcc
CFLAGS = -Wall -Werror
LDFLAGS = -lpthread

all: $(basename $(wildcard *.c))

%: %.c
    $(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)

.PHONY: clean

clean: 
    rm -rf $(basename $(wildcard *.c))

我理解“$(basename $(wildcard *.c))”returns .c 文件的文件名没有扩展名。这又被用作目标 all 的依赖项。

但是,我不明白以下内容:% 运算符如何映射到目标中提到的依赖关系 'all'?

我不确定我是否理解问题。

make 维护着一个模式规则字典。当 make 想要构建一个目标时,如果目标没有明确的规则,那么它将通过模式规则字典来寻找将构建目标的规则。

此处,目标模式是 %,它将匹配任何内容(% 是一个通配符,有点像 shell 的 * 通配符) .所以每个想要构建的目标都会匹配这个模式。然后 make 查看先决条件是否存在或是否可以构建,替换先决条件中的词干(匹配 % 的文本)。

所以如果make要构建foo,它会匹配这个规则和foo的词干,然后如果它能找到或构建foo.c(因为%.c 词干为 foo 的结果是 foo.c) 然后该规则匹配,make 将使用它。

如果不是,make 将继续查找其隐式规则字典的其余部分。如果 none 个匹配,它会说“No rule to make 'foo'”并失败。