在GNU makefile中的最后一个单词之前获取单词

在GNU makefile中的最后一个单词之前获取单词,makefile,Makefile,我需要从$(MAKEFILE\u LIST)中提取最后一个单词之前的单词 到目前为止,我想不出比这种怪物更好的东西: LIST := a b c LAST_WORD_INDEX = $(words $(LIST)) BEFORE_LAST := $(word $(shell echo $(LAST_WORD_INDEX) - 1 | bc),$(LIST)) $(info word before last is $(BEFORE_LAST)) 当我运行它时: word before last

我需要从
$(MAKEFILE\u LIST)
中提取最后一个单词之前的单词

到目前为止,我想不出比这种怪物更好的东西:

LIST := a b c

LAST_WORD_INDEX = $(words $(LIST))
BEFORE_LAST := $(word $(shell echo $(LAST_WORD_INDEX) - 1 | bc),$(LIST))
$(info word before last is $(BEFORE_LAST))
当我运行它时:

word before last is b
make: *** No targets.  Stop.
结果是正确的,但是有没有更优雅、更理智的方法来达到同样的效果呢?

我最终使用了library,这使事情更加连贯:

include gmsl-1.1.6/gmsl

$(lastword $(call chop,$(MAKEFILE_LIST)))
$(words${LIST})
将为您提供最后一个单词的索引,如果您在列表元素前面加上前缀


请注意,
1st
在那里。

可能的重复不是确切目标的重复,但我的答案有你需要的(实际上我在我的答案中谈到了
$(MAKEFILE\u列表)
。@EtanReisner感谢你的GMSL点你可以使用
$(lastword$(filter out$(lastword$(MAKEFILE\u列表)),$(MAKEFILE\u列表)))
@Beta--抱歉,评论这个有点晚了--如果列表中的最后两个条目是相同的,即
abc
,那么
过滤器将清除这两个
c
,并将错误地返回
b
…您将
$(单词${list})
在那里多呆一段时间。@HardcoreHenry你试过了吗?那是正确的。如果列表有4个单词,我们就把它列为5个单词的列表,然后取第4个单词
$(单词4,4,1st a b c d)
。整洁哈?@HardcoreHenry不,我当然错了,我没有使用
$(单词列表)
。make也错了,不错的一个!看起来像
$(word 4,…args…,list)
“有效。”它从它在最后一个参数中找到的列表中获取单词。哦,好吧。因此,经过一点调查,如果列表中正好有两个条目,这看起来会失败。因为
word
是一个内置的,只需要两个参数,所以第二个逗号不作为参数分隔符-
$(信息word 1:$(单词1,1,a b c d))
1,a
被认为是第一个单词。@HardcoreHenry是的,忽略第二个逗号,你对
$(单词)
的看法也是正确的。然而,我最初的两次调用
$(单词)
仍然有效,即使在
${LIST}
没有或只有一个单词。扩充列表的第一个新项只有类似于
1,1st的内容。我已编辑了文本。感谢您的注意!
BEFORE_LAST := $(word $(words ${LIST}),1st ${LIST})