在带有变量的makefile中使用word函数
Using word function in makefile with variable
我想制作一个自定义函数,从系列 $1 和关键字 $2 中获取 $3 作为索引。
所以我检查了下面的一个效果很好。
define get_indx
@echo $(words )
for n in $(shell seq 1 $(words )) ;\
do \
echo $$n ;\
done
endef
NLIST:= AA BB CC
$(call get_indx,$(NLIST),BB,indx)
但是下面不行。
它说'***'word'函数的第一个非数字参数:'$n'。停止。'
define get_indx
@echo $(words )
for n in $(shell seq 1 $(words )) ;\
do \
echo $$n ;\
echo $(word $$n, ) ;\
done
NLIST:= AA BB CC
$(call get_indx,$(NLIST),BB,indx)
如何访问 n 或如何将其转换为数字?
$(word ...)
在for循环执行前被代入,意思是代入时变量n
不存在。您可能希望在调试时将 --warn-undefined-variables
传递给您的 make 调用,认为在这种情况下它会被捕获。
至于解决方案,我会考虑将 $(word ...)
替换为 shell 等价物。将其全部包装在脚本中而不是使用 define
块可能是个好主意。
如果您想创建自定义函数以从列表中获取索引,我认为您无法将其作为参数取出,因为函数的所有参数都在 in 而已。您可以让您的函数输出一个文本,然后您可以将其分配给一个变量,如下所示:
$ cat Makefile
NLIST := AA BB CC
# - list to check
# - element to find
# returns - index of element
define get_index
$(sort $(eval index_count :=) \
$(foreach word,$(1), \
$(eval index_count := $(index_count) x) \
$(if $(findstring $(word),$(2)),$(words $(index_count)))) \
)
endef
bb_index := $(call get_index,$(NLIST),BB)
$(info >$(bb_index)<)
$(info >$(call get_index,$(NLIST),CC)<)
$(info >$(call get_index,$(NLIST),AA)<)
这里的想法是我们使用列表作为计数器。对于原始列表中的每个单词,我们通过向计数器列表添加另一个值来增加计数器。实际值并不重要,因为唯一重要的是计数器列表中元素的数量。如果我们找到一个有趣的值,我们将输出计数器列表中的元素数,它表示找到该元素的索引。然后可以像往常一样将该输出存储在变量中。 $(sort)
函数仅用于去除多余的空格。
如果需要,根据情况(值是否可能重复等),此方法可能需要变得更复杂。
输出:
$ make
>2<
>3<
>1<
我想制作一个自定义函数,从系列 $1 和关键字 $2 中获取 $3 作为索引。 所以我检查了下面的一个效果很好。
define get_indx
@echo $(words )
for n in $(shell seq 1 $(words )) ;\
do \
echo $$n ;\
done
endef
NLIST:= AA BB CC
$(call get_indx,$(NLIST),BB,indx)
但是下面不行。 它说'***'word'函数的第一个非数字参数:'$n'。停止。'
define get_indx
@echo $(words )
for n in $(shell seq 1 $(words )) ;\
do \
echo $$n ;\
echo $(word $$n, ) ;\
done
NLIST:= AA BB CC
$(call get_indx,$(NLIST),BB,indx)
如何访问 n 或如何将其转换为数字?
$(word ...)
在for循环执行前被代入,意思是代入时变量n
不存在。您可能希望在调试时将 --warn-undefined-variables
传递给您的 make 调用,认为在这种情况下它会被捕获。
至于解决方案,我会考虑将 $(word ...)
替换为 shell 等价物。将其全部包装在脚本中而不是使用 define
块可能是个好主意。
如果您想创建自定义函数以从列表中获取索引,我认为您无法将其作为参数取出,因为函数的所有参数都在 in 而已。您可以让您的函数输出一个文本,然后您可以将其分配给一个变量,如下所示:
$ cat Makefile
NLIST := AA BB CC
# - list to check
# - element to find
# returns - index of element
define get_index
$(sort $(eval index_count :=) \
$(foreach word,$(1), \
$(eval index_count := $(index_count) x) \
$(if $(findstring $(word),$(2)),$(words $(index_count)))) \
)
endef
bb_index := $(call get_index,$(NLIST),BB)
$(info >$(bb_index)<)
$(info >$(call get_index,$(NLIST),CC)<)
$(info >$(call get_index,$(NLIST),AA)<)
这里的想法是我们使用列表作为计数器。对于原始列表中的每个单词,我们通过向计数器列表添加另一个值来增加计数器。实际值并不重要,因为唯一重要的是计数器列表中元素的数量。如果我们找到一个有趣的值,我们将输出计数器列表中的元素数,它表示找到该元素的索引。然后可以像往常一样将该输出存储在变量中。 $(sort)
函数仅用于去除多余的空格。
如果需要,根据情况(值是否可能重复等),此方法可能需要变得更复杂。
输出:
$ make
>2<
>3<
>1<