【发布时间】:2015-06-08 17:22:11
【问题描述】:
我在尝试使用 make 3.82 运行一些小型 Makefile 后遇到了一些问题。
错误:
[me@localhost make]$ make
Makefile:3: *** empty variable name. Stop.
这适用于 make 3.81,但不适用于新版本。我知道旧版本有一些向后兼容性。
我有两个 Makefile,一个基本文件和一个主要文件。
这是我的 Makebase
define TestFile
ifeq ($$(shell test $(1) $(2) || echo 1),1)
$$(error $(2) mmm, not found)
endif
endef
define CheckIt
$(eval $(call TestFile,-d,$(1)))
endef
define CheckDir
p := $(foreach d,$1,$(call CheckIt,$d))
endef
define SomeCheck
$(call CheckDir,$(1))
endef
这是我的 Makefile
include Makebase
$(call SomeCheck, ~/test/make)
正如我所说,它在 make 3.81 中运行良好。
任何帮助将不胜感激。 谢谢
BR
【问题讨论】:
-
你确定它的工作方式和你认为的 3.81 一样吗?这看起来像将
p设置为目标,=作为先决条件。 (您没有在调用SomeCheck的结果上使用eval。添加eval也会使3.82 在makefile 上工作,无论我可以称之为混乱的工作定义。)这似乎是一种相当可怕的做法事情(您在 在 make 解析时间期间反复强行炮击,这将是昂贵的)。这一切的目标是什么? -
嗨 Etan,这是我正在处理的大混乱的摘录,不是我做的。问题是,在更新到 3.82 之后,有很多空变量名错误,这只是该问题的概念证明。看起来像 eval 做的工作,但不知道为什么 eval 在 3.82 中做不同的事情?非常感谢
-
现在想一想,eval 应该扭曲 SomeChek 的调用还是可以在 SomeCheck 的定义中完成?谢谢
-
老实说,我建议要么根本不升级 make,要么放弃任何可以执行此类操作的 make 系统,然后从头开始。因为我根本不相信上述方法可以正常工作,而且设计也很糟糕。
-
我完全同意你的看法,但现在退出系统不是一种选择。保持 3.81 也不是一种选择。会看到...谢谢伊坦。