制作文件:模式规则
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'”并失败。
我对 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'”并失败。