makefile - 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
的末尾会有一个额外的项目......
我做错了什么?我误解了什么?
解决方案
您错过了一个事实,即您提供的参数被扩展了两次:首先是call
,然后是eval
.
eval
您可以通过将其替换为以下内容来更好地了解正在发生的事情info
:
$(foreach lib,$(libs),$(info $(call Function,$(lib))))
这将向您显示eval
正在评估的文本。你会在这里看到:
libraries += $(libName)
libName
正在评估call
,在 eval
看到它之前。因此它扩展为上一次运行的设置libName
(或第一次运行中的空字符串)。
你需要检查你的define
和每个变量,就像你这样使用它的call
参数,所以扩展它,对于每个其他变量或函数引用,你可能想用它来转义它,这样就不会扩展它,它留给扩大:$(1)
call
$$
call
eval
define Function
libName = lib$(1)
libraries += $$(libName)
# [...more things...]
endef
推荐阅读
- django - Django 1.8 导入问题
- angular - Angular 5 - 相当于来自 AngularJS 的 $interval
- retrofit2 - onResponse 中的 Retrofit 2.0 条件逻辑不起作用
- aframe - 如何更改框架曲线组件中的曲线类型
- html - 如何在大屏幕上将列调整为 100% 高度并使用 flexbox 在移动设备上重新排序列
- node.js - 如何将 ProfilingPlugin 与 webpack-cli 一起用于 webpack 4
- virtual-machine - 在 Hyper-V 虚拟机中使用 GPU
- ruby-on-rails - Trix Gem 未正确加载资产
- sql-server - 将 csv 文件从 Excel VBA 上传到 SQL Server,而不声明列的数据类型
- dart - Flutter 示例中的流布局