Makefile递归安装?

时间:2018-06-06 18:29:39

标签: makefile gnu-make

假设我有以下内容:一系列依赖项,每个依赖项可能存在也可能不存在,并且每个依赖项都以完全相同的方式安装(除了依赖项的字符串名称)。为了摆脱重复的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.

1 个答案:

答案 0 :(得分:1)

我真的不明白你要做什么......对我来说,这看起来非常不合适。

但是,这肯定不会起作用:

ifeq(`which $(1)`,)

如果您希望将其作为配方的一部分,则必须使用TAB字符缩进它并以shell语法编写,而不是使用语法。

如果您希望将其作为makefile(而不是配方)的一部分,则需要使用正确的make语法编写它:首先,您必须在ifeq(之间包含空格。其次,make不支持反引号。如果要运行shell命令,则必须使用$(shell ...)函数。