我可以在一个makefile目标不止一个%符号吗?(Can I have more than one

2019-09-18 03:12发布

所以我有这样的目标依赖一个makefile:

all: $(foreach lang, $(LANGS), $(foreach models,$(MODELS),targetName$(model).xml$(lang)))

和目标名称目标看起来是这样的:

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

但是,这是行不通的。 我得到这个错误:

make[1]: *** No rule to make target `targetNameMYMODEL.xmlen', needed by `all'.  Stop.

然而,呼吁“所有”与在目标名称目标的硬编码语言像这样的工作:

all: $(foreach lang, $(LANGS), $(foreach models,$(MODELS),targetName$(model).xmlen))

并呼吁“所有”没有全部或目标名称语言正常工作为好。 我想也许是Makefile文件不喜欢有目标名称的两个百分比符号。

此外,由于我有点继承了这个makefile文件,谁能告诉我这是什么型号\ =%手段? 还有另一个目标,看起来像这样: MODEL%: ; 但我不知道什么是\ =%表示。

编辑:那么进一步澄清在此基础上的回复:

我有,比方说,5种型号列表,并列表说5种语言,我们的目标是产生25个文件,一个是语言和模型的每个组合。

目标名称%.XML目标将原来建一个名为targetName.xml文件,但现在我需要它来建立类似targetName.xml这就是为什么我需要两个%的迹象。

我通过这两个列表以嵌套的foreach循环如上图所示,但我有一个很难周围路过那些变量​​的目标。 我试着从foreach语句输出语言变量,我试图把目标名称%.XML的内容在for循环遍历语言在那里。 后者不起作用,因为有在循环中的“做”部分生成文件命令(如EVAL例如)。

Answer 1:

你说得对,让不买两个%的目标名称符号。 这只是在这使的通配符的处理是不是所有的人们希望的途径之一。 有一种方法来产生所有的图案规则遍历一个变量的值(以及使用%自动为其他); 这是一个有点难看,但如果这就是你想要的东西,我们可以给你看。

但是,这条线是一个烂摊子:

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

除了目标两个通配符的问题,最后PREQ, targetName.xml*将意味着正是:一个目标(或文件)被称为targetName.xml* 。 星号将不会被替换,而不是与开始的所有现有文件的列表targetName.xml ,或其他任何东西。

再有就是MODEL\=%这表明此生成的文件的作者是有点困惑(在测试不相信)。 如果通配符的值是foo ,那么这将指示的一个先决条件是一个目标(或文件)命名MODEL=foo 。 该\ “转义”的= ,因此使不会中止,但是这仅仅是一个健康的错误消息的抑制。 我认为是作者的初衷是这样的:

targetName%.xml: MODEL=%

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

第一规则未指定的一个先决条件 ,则设定特定的目标变量 。 所以,当make试图建立targetNamefoo.xml通过doing some things ,变量MODEL的值将foo在该命令的范围内。 第二条规则有一个PREQ列表中,所产生的wildcard ; 你不能在一行混合特定目标变量和preqs。

我们可以给进一步的建议,但它会帮助,如果我们可以看到多一点你要清楚地做什么。



文章来源: Can I have more than one % sign in a makefile target?