所以我有一个具有目标依赖性的makefile,如下所示:
all: $(foreach lang, $(LANGS), $(foreach models,$(MODELS),targetName$(model).xml$(lang)))
和targetName目标看起来像这样:
targetName%.xml%: MODEL\=% targetName.xml*
但是它不起作用。我收到此错误:
make[1]: *** No rule to make target `targetNameMYMODEL.xmlen', needed by `all'. Stop.
但是,在targetName目标中使用硬编码语言调用“ all”,如下所示:
all: $(foreach lang, $(LANGS), $(foreach models,$(MODELS),targetName$(model).xmlen))
并且在不使用all或targetName语言的情况下调用'all'也很好。我在想,也许Makefile不喜欢目标名称中有两个百分号。
而且,由于我有点继承了这个makefile,因此有人可以告诉我MODEL \ =%是什么意思吗?还有另一个目标看起来像这样:MODEL%: ;
,但我不确定\ =%的含义。
编辑:因此,根据此响应进一步说明:
我有一个清单,例如5种模型和一份清单,例如5种语言,目标是生成25个文件,每种语言和模型的组合一个。
targetName%.xml目标最初会生成一个名为targetName.xml的文件,但现在我需要它来构建诸如targetName.xml之类的文件。这就是为什么我需要两个%符号的原因。
我正在使用嵌套的foreach遍历这两个列表,但是我很难将这些变量传递给目标。我尝试从foreach语句中导出语言变量,并尝试将targetName%.xml的内容放入for循环中以遍历那里的语言。后者不起作用,因为在循环的“ do”部分有Makefile命令(例如eval)。
您是正确的,Make不喜欢目标名称中的两个%
符号。那只是Make的通配符处理并非所有人都希望的方式之一。有一种方法可以自动生成对一个变量的值进行迭代的所有模式规则(对另一个变量使用%
)。这有点丑陋,但是如果您要那样,我们可以告诉您。
但是这行很乱:
targetName%.xml%: MODEL\=% targetName.xml*
除了目标中有两个通配符的问题之外,最后一个前置词targetName.xml*
的确切含义是:一个名为targetName.xml*
的目标(或文件)。星号不会扩展,也不会扩展到以targetName.xml
开头的所有现有文件的列表。
然后有MODEL\=%
,表示此makefile的作者有点困惑(并且不相信测试)。如果通配符的值为foo
,则这将指示一个前提条件,该前提条件是名为MODEL=foo
的目标(或文件)。 \
“转义” =
,因此Make不会中止,但这只是抑制了正常的错误消息。我认为作者的想法是这样的:
,它是设置目标特定的变量。因此,当Make尝试通过targetName%.xml: MODEL=% targetName%.xml: $(wildcard targetName.xml*) do some things
第一条规则不是指定先决条件
targetNamefoo.xml
构建doing some things
时,变量MODEL
在该命令的上下文中将具有值foo
。第二条规则有一个由wildcard
生成的优先列表。您不能在一行中混合使用特定于目标的变量和前提条件。我们可以提供进一步的建议,但是如果我们可以更清楚地了解您要尝试的操作,这将有所帮助。
值得注意的是official documentation: