Makefile静态模式规则匹配问题

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

我认为gnu make(如果有必要的话,我正在使用3.81)静态模式规则匹配(显然其他人在我工作的地方也这么做了,因为这是在我试图修复一条被注释掉的规则时发现的)有一些基本的我遗漏的东西。我试图将我的示例简化到关键点(希望我没有“遗漏真实示例中的任何基本内容”)

因此,这似乎像我预期的那样起作用

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
也可以)