在Makefile模板中定义的规则无效

在Makefile模板中定义的规则无效,makefile,gnu-make,Makefile,Gnu Make,我正在尝试使用foreach模板来创建多个规则构造。下面是我的全部示例代码 variable.mk: echo'variable.mk' echo'测试变量.mk'>$@ 文件:=cpf dma 定义生成模板 $warning input为$1 end $1:variable.mk 回声[CC]$1 回显“测试$1”>1美元 恩德夫 $foreach module、$FILES、$eval$call generate_template、$module sh:cpf-dma echo[CC]run

我正在尝试使用foreach模板来创建多个规则构造。下面是我的全部示例代码

variable.mk: echo'variable.mk' echo'测试变量.mk'>$@ 文件:=cpf dma 定义生成模板 $warning input为$1 end $1:variable.mk 回声[CC]$1 回显“测试$1”>1美元 恩德夫 $foreach module、$FILES、$eval$call generate_template、$module sh:cpf-dma echo[CC]run.sh echo'testrun.sh'>$@ 但当我在命令行上运行make run.sh时,它显示以下错误:

make:**run.sh所需的目标“cpf”无规则。停止 cpf目标的规则预期由第14行中的模板generate_模板创建,但它不按预期工作。
有人能帮我解决这个问题吗?我在谷歌搜索了一下,但还是找不出答案。

试图使用$eval的典型错误。。。关于生成的规则:生成器没有生成最后一行结束,因此make不会像您认为的那样解析生成的规则

解决方案:始终以空行结束定义规则的多行宏。这样可以确保规则是正确的$eval'd

variable.mk: 回音$@ echo'test$@'>$@ 文件:=cpf dma 宏末尾的空行是故意的 定义生成模板 $warning input为$1 end $1:variable.mk 回声[CC]$$@ echo'test$$@'>$$@ 恩德夫 $foreach module、$FILES、$eval$call generate_template、$module run.sh:cpf dma 回声[CC]$@ echo'TEST$@'>$@ 试运行:

$make run.sh Makefile:14:输入为cpf结束 Makefile:14:输入为dma结束 echo变量.mk variable.mk echo'test variable.mk'>variable.mk 回声[CC]cpf [CC]中央公积金 echo'测试cpf'>cpf echo[CC]dma [CC]dma 回波测试dma'>dma'> echo[CC]run.sh [CC]run.sh echo'testrun.sh'>run.sh $cat variable.mk cpf dma run.sh 测试变量.mk 试验cpf 测试dma testrun.sh 我还建议重写宏,只执行一次评估,即

$eval$foreach module、$FILES、$call generate_template、$module
提示:如果是$eval。。。未按预期工作,我总是将其更改为$info eval。。。以准确查看正在评估的内容。这通常很容易在代码生成宏中发现点错误和键入错误。

在定义规则时,不需要在定义宏的末尾留下一行空白:make可以解析没有尾随换行符的make文件。但是,您建议用info替换eval以查看make sees是一个很好的建议。@Madscient我已经多次遇到这个$eval问题,几乎总是宏末尾的空尾行修复了它,现在我总是自动添加它。这是我对OPs原始makefile所做的唯一更改,为了使其正常工作,我必须还原选项卡,因为它们在复制和粘贴后无法保存。我遵循了您的代码,但在使用GNU make 3.79.1时仍然失败。然后我尝试使用GNU Make 4.2.1,它可以工作!因此,这似乎是由GNU Make版本引起的,而不是多行宏末尾缺少的空行。为什么您仍在尝试使用GNU Make 3.79.1?据我回忆,它有太多的bug,基本功能缺失,因此我们在makefile模板中添加了一个版本检查,如果软件开发人员试图使用任何早于3.80的版本运行构建,它将立即失败。那是十多年前的事了……我在没有换行符的情况下运行了原版,它成功了。FWIW,我从不在我的定义末尾添加换行符,它总是有效的。你唯一需要做的是当你真的需要在define的末尾换行时,而define永远不会与eval一起使用,因为eval提供了一个全新的解析上下文,就像读取一个新文件一样,make不需要解析上下文以换行结束,就像makefile不需要以换行结束一样。还有其他方法可以使用需要换行符的define宏。run.sh需要构建cpf目标,但您不会说如何制作程序,如何实现itcpf目标。你需要为cpf目标创建规则这是我的观点。cpf目标的规则应由模板generate_模板从第7行到第14行创建。但是模板并没有像预期的那样工作,它适合我,GNU Make 4.2。1@MikeKinghan,好吧,当我使用Make4.2.1时,它仍然失败,但有另一个错误消息:Make:**没有规则将目标设置为“variable.mk”,这是“cpf”所需要的。停止我不明白为什么variable.mk后面有一个空格/换行符。在makefile的generate_template定义中variable.mk后面一定有一些额外的字符,它显示为空格,但不是标准的空格字符。试着删除那个。