假设我有以下内容:一系列依赖项,每个依赖项可能存在也可能不存在,并且每个依赖项都以完全相同的方式安装(除了依赖项的字符串名称)。为了摆脱重复的makefile代码,我将以下函数原型化:
define install_utility =
$(1):
# recursion
$(foreach bar, $(1)_dependencies,$(eval $(call install_utility,$(bar)))
ifeq(`which $(1)`,) # check for existence of dependency
echo will install $(1) # show me make is executing expected commands
endif
endef
foo_dependencies=A B
foo=foo
eval $(call install_utility,$(foo))
# Expected results:
will install A
will install B
will install foo
# Actual result: no error message, just:
... (infinite loop that prints nothing)
当我跑步时,我得到以下错误:无限循环。
这看起来非常简单。但是,我无法让它在make中工作。有没有一种方式我可以预期"在make中做到这一点?
有点修改......并且根据我是否发出递归来获取各种错误:
$(1):
$(foreach bar, ...
ifeq(`which $(1)`,)
...
# error messages:
make: *** no rule to make target '$(foo_dependencies)
ifeq(`which', needed by 'foo'. Stop.
答案 0 :(得分:1)
我真的不明白你要做什么......对我来说,这看起来非常不合适。
但是,这肯定不会起作用:
ifeq(`which $(1)`,)
如果您希望将其作为配方的一部分,则必须使用TAB字符缩进它并以shell语法编写,而不是使用语法。
如果您希望将其作为makefile(而不是配方)的一部分,则需要使用正确的make语法编写它:首先,您必须在ifeq
和(
之间包含空格。其次,make不支持反引号。如果要运行shell命令,则必须使用$(shell ...)
函数。