我在Makefile中有这个定义:
PREFIX = PRE
POSTFIXES = POST1 POST2 POST3
现在我想以编程方式生成以下宏:
NAME_1 = PRE_POST1
NAME_2 = PRE_POST2
NAME_3 = PRE_POST3
#...
怎么做?
答案 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