For loop 如何替换makefile变量的条目

For loop 如何替换makefile变量的条目,for-loop,sed,makefile,gnu-make,For Loop,Sed,Makefile,Gnu Make,我在一个Makefile中有一个变量MY_VAR,定义为MY_VAR=read橙黄蓝绿白黑。我正在尝试编写一个Makefile函数/宏,该函数/宏将颜色列表作为输入,并通过向颜色添加后缀来替换它们。在Makefile中,我可以按照 MY_NEW_VAR=$(shell echo$(MY_VAR)| sed-e's/black/blackcolor/'-e's/red/redcolor/'-e's/white/whitecolor/')但是使用带有for循环的函数执行此操作时遇到问题 define

我在一个Makefile中有一个变量
MY_VAR
,定义为
MY_VAR=read橙黄蓝绿白黑
。我正在尝试编写一个Makefile函数/宏,该函数/宏将颜色列表作为输入,并通过向颜色添加后缀来替换它们。在Makefile中,我可以按照
MY_NEW_VAR=$(shell echo$(MY_VAR)| sed-e's/black/blackcolor/'-e's/red/redcolor/'-e's/white/whitecolor/')
但是使用带有
for
循环的函数执行此操作时遇到问题

define append_color
for color in $(2); do \
  $(eval $(1) += $(shell echo $(MY_VAR) | sed 's/$$color/$$color$(3)/')); \
done;      
endef  
此处
$2
是要替换的颜色列表,
$(1)
将包含结果,
$3
包含要附加的后缀。 下面是Makefile中的函数调用:

MY_VAR = read orange yellow blue green white black
$(call append_color,MY_NEW_VAR,black red white,color)    
Makefile.mk:50: *** missing separator.  Stop.  
makefile在makefile内调用此函数时返回以下错误:

MY_VAR = read orange yellow blue green white black
$(call append_color,MY_NEW_VAR,black red white,color)    
Makefile.mk:50: *** missing separator.  Stop.  
有没有关于我遗漏了什么的建议或者做同样事情的替代方案


谢谢

您可以这样做,只使用make函数

define replace
$(foreach color,$2,\
    $(eval $1 := $(subst $(color),$(color)$3,$($1))))

endef

COLOR_LIST := red black green orange

COLOR_TO_REPLACE := black green

$(eval $(call replace,COLOR_LIST,$(COLOR_TO_REPLACE),suf))

$(info $(COLOR_LIST))
在每次展开
eval
时,将后缀逐个附加到颜色。 (要分解它,首先将
replace
扩展为
$(每种颜色,黑绿色,$(eval color\u LIST:=$(subst$(color),$(color)suf,$(color\u LIST))
然后按此顺序展开
eval
部分


请注意,对宏的调用中的
suf
不应包含任何空格,否则也会添加空格。

您可以这样做,只使用make函数

define replace
$(foreach color,$2,\
    $(eval $1 := $(subst $(color),$(color)$3,$($1))))

endef

COLOR_LIST := red black green orange

COLOR_TO_REPLACE := black green

$(eval $(call replace,COLOR_LIST,$(COLOR_TO_REPLACE),suf))

$(info $(COLOR_LIST))
在每次展开
eval
时,将后缀逐个附加到颜色。 (要分解它,首先将
replace
扩展为
$(每种颜色,黑绿色,$(eval color\u LIST:=$(subst$(color),$(color)suf,$(color\u LIST))
然后按此顺序展开
eval
部分


请注意,对宏的调用中的
suf
不应包含任何空格,否则也会添加空格。

有几种方法可以完成任务: 使用经典的
patsubst
函数:

append_color = $(patsubst %,%$(3),$(filter $(2),$(1))) $(filter-out $(2),$(1))
MY_NEW_VAR := $(call append_color,$(MY_VAR),black red white,color)
或使用foreach的
命令

append_color = $(foreach w,$(1),$(if $(filter $(w),$(2)),$(w)$(3),$(w)))
MY_NEW_VAR := $(call append_color,$(MY_VAR),black red white,color)

有几种方法可以帮助您完成任务: 使用经典的
patsubst
函数:

append_color = $(patsubst %,%$(3),$(filter $(2),$(1))) $(filter-out $(2),$(1))
MY_NEW_VAR := $(call append_color,$(MY_VAR),black red white,color)
或使用foreach的
命令

append_color = $(foreach w,$(1),$(if $(filter $(w),$(2)),$(w)$(3),$(w)))
MY_NEW_VAR := $(call append_color,$(MY_VAR),black red white,color)

您不能在配方之外的makefile中为循环使用类似shell的
。您应该使用
$(foreach…
,请参阅GNU make docs。您是否始终需要为变量中的所有颜色项添加后缀,还是仅为某些颜色添加后缀?如果始终是所有项,则可以使用
$(patsubst%,%color,$(MY VAR))
。不,需要添加后缀的条目在
$(3)
中提供。在配方之外的makefile中,不能对
循环使用类似shell的
。应使用
$(foreach…)
,另请参见GNU make docs,您是否始终需要为变量中的所有颜色条目添加后缀,还是仅为某些颜色添加后缀?如果始终为所有条目,则可以使用
$(patsubst%,%color,$(MY_VAR))
。不,需要添加后缀的条目在
$(3)中提供
请注意,第一种方法将对色纹进行大量重新排序。这是我想要的。请注意,第一种方法将对色纹进行大量重新排序。这是我想要的。