在带有变量的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<