在makefile中使用变量word函数

问题描述 投票:0回答:1

我想做一个自定义函数,从序列1和关键字2中获取3美元作为indx.所以我检查了下面的一个函数,效果不错。

define get_indx
         @echo $(words $1)
         for n in $(shell seq 1 $(words $1)) ;\
         do \
                 echo $$n ;\
        done
endef

NLIST:= AA BB CC
$(call get_indx,$(NLIST),BB,indx)

但是下面的不能用,它说 "***非数字的第一个参数到`word'函数:'$n'。 '停止。

define get_indx
       @echo $(words $1)
       for n in $(shell seq 1 $(words $1)) ;\
       do \
               echo $$n ;\
               echo $(word $$n, $1) ;\          
       done
NLIST:= AA BB CC
$(call get_indx,$(NLIST),BB,indx)

我怎样才能访问n或者怎样才能转换为数字?

makefile gnu-make
1个回答
0
投票

如果你想创建一个自定义函数来从列表中获取索引,我想你不能把它作为一个参数来获取,因为函数的所有参数都是 仅限。你可以让你的函数输出一个文本,然后将其分配给一个变量,就像这样。

$ cat Makefile
NLIST := AA BB CC

# $1 - list to check
# $2 - 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) 函数只是为了去掉多余的空格。

如果需要的话,这种方法可能需要变得更加复杂,这取决于具体情况(数值是否可能重复等)。

在for循环执行之前,输出。

$ make
>2<
>3<
>1<

0
投票

$(word ...) 在for循环执行之前被替换,这意味着变量----------------。n 在替换过程中不存在。你可能想通过 --warn-undefined-variables 调试时调用make,想必在这种情况下会被发现。

至于解决方法,我可以考虑将你的 $(word ...) 与shell对应。也许是个好主意,把它全部包在一个脚本中,而不是用 define 块。

© www.soinside.com 2019 - 2024. All rights reserved.