我的makefile目标中可以有多个%符号吗?

问题描述 投票:8回答:2

所以我有一个具有目标依赖性的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)。

makefile gnu-make
2个回答
4
投票

您是正确的,Make不喜欢目标名称中的两个%符号。那只是Make的通配符处理并非所有人都希望的方式之一。有一种方法可以自动生成对一个变量的值进行迭代的所有模式规则(对另一个变量使用%)。这有点丑陋,但是如果您要那样,我们可以告诉您。

但是这行很乱:

targetName%.xml%: MODEL\=% targetName.xml*

除了目标中有两个通配符的问题之外,最后一个前置词targetName.xml*的确切含义是:一个名为targetName.xml*的目标(或文件)。星号不会扩展,也不会扩展到以targetName.xml开头的所有现有文件的列表。

然后有MODEL\=%,表示此makefile的作者有点困惑(并且不相信测试)。如果通配符的值为foo,则这将指示一个前提条件,该前提条件是名为MODEL=foo的目标(或文件)。 \“转义” =,因此Make不会中止,但这只是抑制了正常的错误消息。我认为作者的想法是这样的:

targetName%.xml: MODEL=%

targetName%.xml: $(wildcard targetName.xml*)
    do some things

第一条规则不是指定先决条件

,它是设置目标特定的变量。因此,当Make尝试通过targetNamefoo.xml构建doing some things时,变量MODEL在该命令的上下文中将具有值foo。第二条规则有一个由wildcard生成的优先列表。您不能在一行中混合使用特定于目标的变量和前提条件。

我们可以提供进一步的建议,但是如果我们可以更清楚地了解您要尝试的操作,这将有所帮助。


0
投票

值得注意的是official documentation

© www.soinside.com 2019 - 2024. All rights reserved.