【问题标题】:Makefile:124: *** unterminated call to function `foreach': missing `)'. StopMakefile:124: *** 对函数“foreach”的未终止调用:缺少“)”。停止
【发布时间】:2014-08-29 16:31:18
【问题描述】:

我正在创建 Makefile,它给了我以下错误

    Makefile:124: *** unterminated call to function `foreach': missing `)'. Stop.

第 124 行的 Makefile 是

    .PHONY: popiso
popiso: isolinux_cfg $(foreach x,$(_$(country)_pops_roles), pop_iso_$(x)) $(isomedia)
@echo $@
@echo
@echo allhostname $(allhostname)
@echo
@echo
@echo allnetwork_setup $(allnetwork_setup)
@sudo cp $(addsuffix .ks.cfg,$(allhostname)) $(isomedia)
@sudo cp isolinux.cfg $(isomedia)/isolinux/
@echo ready to make iso

$(_$(country)_pops_roles) 得到正确扩展,它调用 pop_iso_XXXX 4 次,因为它假设。 然后它给出了上述错误。

我正在使用 RHEL6 - 64 位机器 我对 Makefile/Gmake 没有那么深入,所以我不确定是什么问题。

$ make -v

GNU Make 3.81

Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-redhat-linux-gnu

和满树

编辑:重制版本:使用'remake all -X'运行

主线是这样展开的

popiso: isolinux_cfg pop_iso_loc2_role1 pop_iso_loc2_role2 pop_iso_loc1_role1 pop_iso_loc1_role2 /raw/ops-xxxx/media

前5个目标成功,然后停止如下

end pop_iso_loc1_role2
/raw/patel/xxxx-build-test/build-tools/ks/Makefile:166   Successfully remade target file `pop_iso_loc1_role2'.
<- (/raw/patel/xxxx-build-test/build-tools/ks/Makefile:166)
pop_iso_loc1_role2
remake<19>
-> (/raw/patel/xxxx-build-test/build-tools/ks/Makefile:119)
/raw/ops-xxxx/media:

remake<20>
/raw/patel/xxxx-build-test/build-tools/ks/Makefile:124     Must remake target `popiso'.
Makefile:125: *** unterminated call to function `foreach': missing `)'.  Stop.

***Entering debugger because we encountered a fatal error.
** Exiting the debugger will exit make with exit code 2.
popiso
remake<21>

然后出于测试目的,我删除了第六个目标“/raw/ops-xxxx/media”,但错误仍然相同

【问题讨论】:

  • 您确定这是导致该错误消息的行吗?
  • 使用remake - 及其-x 标志- 来调试此类错误。
  • 错误信息显示第 124 行,即 foreach 命令之后的行。行 foreach 是第 123 行。我会检查重拍。
  • 所以isomedia 又名/raw/ops-xxxx/media 依赖于popiso(循环依赖?)并最终再次调用配方,其中一些变量未设置和/或拙劣?不确定这是不是解释,但这就是我对可用信息所做的。
  • $(isomedia): $(noop $$(pmkdir $$@)) @echo end $$@ 似乎没有循环依赖。它只是创建目标目录。

标签: linux makefile gnu-make


【解决方案1】:

你说“它按预期调用 pop_iso_XXXX 4 次”。

这就证明问题不在这个foreach()上。如果是这样,我希望 foreach 根本不会扩展。

以下简短的独立 Makefile 可以正常工作并给出预期结果且没有错误:

_a_pops_roles=foo bar

country=a

popiso: $(foreach x, $(_$(country)_pops_roles), pop_iso_$(x))

pop_iso_foo:
    echo 1

pop_iso_bar:
    echo 2

此用法与您的用法相同。

在你的 Makefile 中寻找其他的 foreach 循环,这实际上是问题所在。

例如:您在同一行上对 $(isomedia) 进行了另一个调用。如果这个宏扩展为一个 foreach,并且它有一个语法错误,这将被报告为这一行的错误,即使错字在其他地方。

你不能总是相信行号。

【讨论】:

  • 感谢您的回答。 $(isomedia) 仅在目标目录不存在时创建它。我已经用完整的调试测试了脚本,它没有报告任何错误,这是一个问题。没有任何错误,除了行号,我什么都没有。
  • pop_iso_foo/bar 也是假的,它们被定义为定义 popiso_pop_role .PHONY: pop_iso_$(1)_$(2) pop_iso_$(1)_$(2): isolinux.cfg。 head rpms.m4 ks_network.cfg.m4 @echo Hemanshu
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 2019-02-06
  • 2022-01-20
  • 2013-09-26
相关资源
最近更新 更多