For loop 如何替换makefile变量的条目
我在一个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
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)中提供
请注意,第一种方法将对色纹进行大量重新排序。这是我想要的。请注意,第一种方法将对色纹进行大量重新排序。这是我想要的。