12

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

4

2 回答 2

5

没错,Make 不喜欢%目标名称中的两个符号。这只是 Make 的通配符处理并不是人们所希望的方式之一。有一种方法可以自动生成迭代一个变量的值(并%用于另一个变量)的所有模式规则;它有点难看,但如果这是您想要的,我们可以向您展示。

但是这条线是一团糟:

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

除了目标中两个通配符的问题之外,最后一个 preqtargetName.xml*将完全意味着:一个目标(或文件)名为targetName.xml*. 星号不会扩展,也不会扩展为以 开头的所有现有文件的列表targetName.xml或其他任何文件。

然后是MODEL\=%,表示这个makefile的作者有点糊涂(不相信测试)。如果通配符的值为foo,那么这将指示一个先决条件,即名为 的目标(或文件)MODEL=foo。“\转义” =,因此 Make 不会中止,但这只是对健康错误消息的抑制。我认为作者的想法是这样的:

targetName%.xml: MODEL=%

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

第一条规则不是指定先决条件,而是设置特定于目标的变量。因此,当 Make 尝试构建targetNamefoo.xmldoing some things,该变量MODEL将具有该foo命令上下文中的值。第二条规则有一个 preq 列表,由wildcard;生成。您不能在一行中混合使用特定于目标的变量和 preqs。

我们可以提供进一步的建议,但如果我们能更清楚地看到您正在尝试做什么,这将有所帮助。

于 2012-06-14T17:06:19.167 回答
2

值得注意的是有关此事的官方文档:

10.5 定义和重新定义模式规则

您可以通过编写模式规则来定义隐式规则。模式规则看起来像一个普通规则,除了它的目标包含字符%恰好是其中一个)。目标被认为是匹配文件名的模式;可以%匹配任何非空子字符串,而其他字符只匹配它们自己。先决条件同样用于%显示它们的名称与目标名称的关系。

因此,模式规则%.o : %.c说明了如何从另一个文件stem.c制作任何文件stem.o

请注意,使用%模式规则的扩展发生任何变量或函数扩展之后,这发生在读取 makefile 时。请参阅如何使用变量函数来转换文本

来源:https ://www.gnu.org/software/make/manual/html_node/Pattern-Rules.html

于 2020-05-22T01:02:52.747 回答