首页 > 解决方案 > Makefile,将函数应用于列表

问题描述

在 aMakefile中,我试图通过从初始列表转换项目来填充列表。

在我的真实代码中,这些转换并非微不足道,我尝试使用一个define... endef构造来应用于初始列表的每个元素,其中包含我想要完成的逻辑。然后,我使用foreach包含 aeval和的 a 应用这个“函数” call

但是发生了一些奇怪的事情:似乎列表的最后一个元素没有被“函数”处理。

这是一个 MWE Makefile

libraries :=

define Function
    libName = lib$(1)

    libraries += $(libName)
    # [...more things...]
endef

libs = a b c
$(foreach lib,$(libs),$(eval $(call Function,$(lib))))

all:
    $(foreach lib,$(libs),$(lib))
    @echo $(libraries)

以及运行命令的结果make

a b c
liba libb

我预计第二行libc的末尾会有一个额外的项目......

我做错了什么?我误解了什么?

标签: makefile

解决方案


您错过了一个事实,即您提供的参数被扩展了两次:首先是call,然后是eval.

eval您可以通过将其替换为以下内容来更好地了解正在发生的事情info

$(foreach lib,$(libs),$(info $(call Function,$(lib))))

这将向您显示eval正在评估的文本。你会在这里看到:

libraries += $(libName)

libName正在评估call, eval看到它之前。因此它扩展为上一次运行的设置libName(或第一次运行中的空字符串)。

你需要检查你的define和每个变量,就像你这样使用它的call参数,所以扩展它,对于每个其他变量或函数引用,你可能想用它来转义它,这样就不会扩展它,它留给扩大:$(1)call$$calleval

define Function
    libName = lib$(1)

    libraries += $$(libName)
    # [...more things...]
endef

推荐阅读