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

2024-05-13

所以我有一个具有如下目标依赖项的 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 target 最初会构建一个名为 targetName.xml 的文件,但现在我需要它来构建类似 targetName.xml 的文件,这就是为什么我需要两个 % 符号。

我使用嵌套的 foreach 循环遍历这两个列表,如上所示,但我很难将这些变量传递给目标。我尝试从 foreach 语句导出语言变量,我尝试将 targetName%.xml 的内容放入 for 循环中以循环访问那里的语言。后者不起作用,因为循环的“do”部分中有 Makefile 命令(例如 eval)。


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

但这行很乱:

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

除了目标中两个通配符的问题,最后一个 preq,targetName.xml*确切的意思是:一个名为的目标(或文件)targetName.xml*。星号不会扩展,也不会扩展到以以下开头的所有现有文件的列表targetName.xml,或其他任何东西。

然后还有MODEL\=%,这表明这个 makefile 的作者有点困惑(并且不相信测试)。如果通配符的值为foo,那么这将指示先决条件,即名为的目标(或文件)MODEL=foo. The \“逃脱”了=,这样 Make 就不会中止,但这只是抑制健康的错误消息。我想,作者的初衷大概是这样的:

targetName%.xml: MODEL=%

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

第一条规则不是指定先决条件, it is 设置特定于目标的变量。所以当 Make 尝试构建时targetNamefoo.xml by doing some things,变量MODEL将会有价值foo在该命令的上下文中。第二条规则有一个 preq 列表,由以下命令生成wildcard;您不能在一行中混合特定于目标的变量和先决条件。

我们可以提供进一步的建议,但如果我们能更清楚地了解您想要做什么,将会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

makefile 目标中可以有多个 % 符号吗? 的相关文章

随机推荐