从列表定义的名称生成宏

时间:2014-11-13 13:53:32

标签: makefile

我在Makefile中有这个定义:

PREFIX = PRE
POSTFIXES = POST1 POST2 POST3

现在我想以编程方式生成以下宏:

NAME_1 = PRE_POST1
NAME_2 = PRE_POST2
NAME_3 = PRE_POST3
#...

怎么做?

1 个答案:

答案 0 :(得分:2)

假设NAME_#是文字的,这就是你想要的。

$(foreach f,$(POSTFIXES),$(eval NAME_$(subst POST,,$f) = $(PREFIX)_$f))

结果:

NAME_1 = PRE_POST1
NAME_2 = PRE_POST2
NAME_3 = PRE_POST3

说明:

  • 从每个后缀中删除POST,只留下数字:$(subst POST,,$f)
  • NAME_与上一步中的数字连接起来:NAME_$(subst POST,,$f)
  • 连接$(PREFIX)和当前后缀以创建所需的值字符串:$(PREFIX)_$f
  • 使用$(eval)将值分配给计算的变量名称:$(eval NAME_$(subst POST,,$f) = $(PREFIX)_$f)
  • 为列表中的每个后缀执行所有操作:$(foreach f,$(POSTFIXES),$(eval NAME_$(subst POST,,$f) = $(PREFIX)_$f))

NAME_#值无关的顺序POSTFIXES变量的更新:

make don不做数学,所以你需要玩游戏来计算"计算"。 (感谢奇妙的GMSL向我展示了这个技巧。)

POSTFIXES = POST_X POST_Y POST_Z

N := x
$(foreach f,$(POSTFIXES),$(eval NAME_$(words $N) = $(PREFIX)_$f)$(eval N += x))

结果:

NAME_1 = PRE_POST_X
NAME_2 = PRE_POST_Y
NAME_3 = PRE_POST_Z