在GNU make
手册在解释这一部分不擅长,我找不到解释或者我不能推断其他地方的信息.
我知道%
是一种通配符,但之间有什么区别%
和*
的背景下targets
,dependencies
和commands
?我在哪里可以使用它,到处都有相同的含义?
target: dependencies ... commands
tripleee.. 7
通配符*
仅用于在当前目录中生成匹配文件列表。模式替换字符%
是当前可能存在或不存在的文件的占位符。
为了扩展您已经发现的手册中的通配符陷阱示例,
objects = *.o
只是为变量分配了*.o
几乎没有用的字面值-一个目标文件,该文件可能依赖于字面命名的文件,而该文件*.c
当然也不存在。这样您会得到一个错误和/或不稳定的行为。
正确的表达方式就像
objects := $(patsubst %.c,%.o,$(wildcard *.c))
make
本身在这种情况下不执行通配符扩展,但是,当然,如果您将文字值传递*.o
给Shell,则在扩展发生时(如果存在匹配项),因此这可能很难调试。 make
将在规则的目标中执行通配符扩展,因此您可以说
foo: *.o
并使其完全按照您的预期工作(前提是在评估此依赖项时保证所需文件已存在)。
相比之下,您可以拥有一个带有模式占位符的规则,该规则将用任何匹配的名称填充,以make
尝试查找可用于生成所需依赖项的配方。有内置的规则,例如
%.o: %.c $(CC) $(CCFLAGS) $^ -o $@
(这里近似真实的东西)说“给定文件匹配%.c
,则%.o
可以如下生成相应的文件”。在这里,%
是一个可以用任何东西代替的占位符;因此,如果将其应用于现有文件,foo.c
则会说明如何foo.o
生成。
您可以改写为“ *
匹配每个匹配文件,同时%
匹配任何匹配文件”。
通配符*
仅用于在当前目录中生成匹配文件列表。模式替换字符%
是当前可能存在或不存在的文件的占位符。
为了扩展您已经发现的手册中的通配符陷阱示例,
objects = *.o
只是为变量分配了*.o
几乎没有用的字面值-一个目标文件,该文件可能依赖于字面命名的文件,而该文件*.c
当然也不存在。这样您会得到一个错误和/或不稳定的行为。
正确的表达方式就像
objects := $(patsubst %.c,%.o,$(wildcard *.c))
make
本身在这种情况下不执行通配符扩展,但是,当然,如果您将文字值传递*.o
给Shell,则在扩展发生时(如果存在匹配项),因此这可能很难调试。 make
将在规则的目标中执行通配符扩展,因此您可以说
foo: *.o
并使其完全按照您的预期工作(前提是在评估此依赖项时保证所需文件已存在)。
相比之下,您可以拥有一个带有模式占位符的规则,该规则将用任何匹配的名称填充,以make
尝试查找可用于生成所需依赖项的配方。有内置的规则,例如
%.o: %.c $(CC) $(CCFLAGS) $^ -o $@
(这里近似真实的东西)说“给定文件匹配%.c
,则%.o
可以如下生成相应的文件”。在这里,%
是一个可以用任何东西代替的占位符;因此,如果将其应用于现有文件,foo.c
则会说明如何foo.o
生成。
您可以改写为“ *
匹配每个匹配文件,同时%
匹配任何匹配文件”。