Makefile静态模式规则匹配问题
我认为gnu make(如果有必要的话,我正在使用3.81)静态模式规则匹配(显然其他人在我工作的地方也这么做了,因为这是在我试图修复一条被注释掉的规则时发现的)有一些基本的我遗漏的东西。我试图将我的示例简化到关键点(希望我没有“遗漏真实示例中的任何基本内容”) 因此,这似乎像我预期的那样起作用Makefile静态模式规则匹配问题,makefile,gnu,gnu-make,Makefile,Gnu,Gnu Make,我认为gnu make(如果有必要的话,我正在使用3.81)静态模式规则匹配(显然其他人在我工作的地方也这么做了,因为这是在我试图修复一条被注释掉的规则时发现的)有一些基本的我遗漏的东西。我试图将我的示例简化到关键点(希望我没有“遗漏真实示例中的任何基本内容”) 因此,这似乎像我预期的那样起作用 JUNK:=foo bar BINS:=$(patsubst %,bin/%,$(JUNK)) all : $(BINS) .PHONY : all # This works $(BINS) : b
JUNK:=foo bar
BINS:=$(patsubst %,bin/%,$(JUNK))
all : $(BINS)
.PHONY : all
# This works
$(BINS) : bin/% : %
mkdir -p bin && cp $< $@
更令人困惑的是,在我正在检查的make文件中,存在着几乎相同的其他静态模式规则
因此,如果需要,我显然知道如何“解决”这个问题,但我想理解为什么第二个(以及第二个代码块中注释掉的部分)没有做我期望他们做的事情
提前感谢您提供的任何帮助/见解。第一个不起作用,因为在展开
JUNK
变量后,make看到以下情况:
foo bar : bin/% : %
静态模式规则的工作方式是第一个模式(目标模式)必须匹配目标列表中的每个单词。这告诉make目标名称的哪个部分是干(与%
匹配的部分)。如果目标模式不匹配,make不知道杆是什么。模式bin/%
与文本foo
不匹配(文本foo
中没有bin/
),因此您会看到错误
第二个不起作用,因为在本例中(bin/$(JUNK):bin/%:%%
)中,检查JUNK
变量的结果如下所示:
bin/foo bar : bin/% : %
这里,bin/foo
与模式匹配,但是bar
不匹配,因此您会得到与上一个相同的错误
要使其工作,您必须为每个目标预先设置
bin/
,而不仅仅是第一个目标,因此使用patsubst
(或者,addprefix
也可以工作)。第一个不工作,因为在展开JUNK
变量后,make看到以下情况:
foo bar : bin/% : %
静态模式规则的工作方式是第一个模式(目标模式)必须匹配目标列表中的每个单词。这告诉make目标名称的哪个部分是干(与%
匹配的部分)。如果目标模式不匹配,make不知道杆是什么。模式bin/%
与文本foo
不匹配(文本foo
中没有bin/
),因此您会看到错误
第二个不起作用,因为在本例中(bin/$(JUNK):bin/%:%%
)中,检查JUNK
变量的结果如下所示:
bin/foo bar : bin/% : %
这里,bin/foo
与模式匹配,但是bar
不匹配,因此您会得到与上一个相同的错误
要使其工作,您必须为每个目标预先设置
bin/
,而不仅仅是第一个目标,因此使用patsubst
(或者,addprefix
也可以工作)。第一个不工作,因为在展开JUNK
变量后,make看到以下情况:
foo bar : bin/% : %
静态模式规则的工作方式是第一个模式(目标模式)必须匹配目标列表中的每个单词。这告诉make目标名称的哪个部分是干(与%
匹配的部分)。如果目标模式不匹配,make不知道杆是什么。模式bin/%
与文本foo
不匹配(文本foo
中没有bin/
),因此您会看到错误
第二个不起作用,因为在本例中(bin/$(JUNK):bin/%:%%
)中,检查JUNK
变量的结果如下所示:
bin/foo bar : bin/% : %
这里,bin/foo
与模式匹配,但是bar
不匹配,因此您会得到与上一个相同的错误
要使其工作,您必须为每个目标预先设置
bin/
,而不仅仅是第一个目标,因此使用patsubst
(或者,addprefix
也可以工作)。第一个不工作,因为在展开JUNK
变量后,make看到以下情况:
foo bar : bin/% : %
静态模式规则的工作方式是第一个模式(目标模式)必须匹配目标列表中的每个单词。这告诉make目标名称的哪个部分是干(与%
匹配的部分)。如果目标模式不匹配,make不知道杆是什么。模式bin/%
与文本foo
不匹配(文本foo
中没有bin/
),因此您会看到错误
第二个不起作用,因为在本例中(bin/$(JUNK):bin/%:%%
)中,检查JUNK
变量的结果如下所示:
bin/foo bar : bin/% : %
这里,bin/foo
与模式匹配,但是bar
不匹配,因此您会得到与上一个相同的错误
要使其工作,您必须为每个目标预先设置bin/
,而不仅仅是第一个目标,因此使用patsubst
(或者,addprefix
也可以)