如何以编程方式为 GNU Make 中的用户定义函数生成参数?

How to programmatically generate arguments to user-defined function in GNU Make?

我正在尝试在 GNU Make 中使用元编程的一个小项目,我有一个特殊的需要以编程方式创建所有将传递给我的一些用户定义函数的参数。

override CMD:=foo

define foo =
  $(info You have called function [[=10=]] with $='' and $='')
endef

# this doesn't work
override ARGS:=bar,baz
$(call $(CMD),$(ARGS))

# this doesn't work either
override COMMA:=,
override ARGS:=bar;baz
$(call $(CMD),$(subst ;,$(COMMA),$(ARGS)))

$(info ---)
$(info CMD was '$(CMD)')
$(info ARGS was '$(ARGS)')
$(info COMMA was '$(COMMA)')

我 运行 遇到的问题是 GNU Make 比我想要的更聪明,可以辨别句法逗号与变量或立即值中的逗号之间的区别:

You have called function [foo] with ='bar,baz' and =''
You have called function [foo] with ='bar,baz' and =''
---
CMD was 'foo'
ARGS was 'bar;baz'
COMMA was ','

是否有任何偷偷摸摸的方法可以让我的 'foo' 函数将 $1 视为 'bar',将 $2 视为 'baz'?还是我必须完全放弃这种方法?

注意 1: space 分隔符和 $(foreach) 不是一个合适的解决方案,因为那样只会把罐头踢到路上。最终,我需要 foo 被愚弄,以为它已经传递了预期数量的参数。 (尽管如此,我并不反对使用 $(foreach) 作为中间步骤的解决方案。)

注意 2: 虽然我不想阻止依赖于以编程方式生成次要 makefile 的解决方案包含在这个文件的底部——因为那可能对其他 SO 读者有用——我个人对任何此类方法都不感兴趣。

Eval 将使您免于不必要的包含:

$(eval $$(call $$(CMD),$(ARGS)))