Makefile:返回字符串的前两个字符

4

在一个 Makefile 中,如果给定一个字符串,能否使用 Makefile 语法(不使用 shell 调用)提取未知字符串的前两个字符?

例如,

VAR := UnKnown
VAR_TERSE = $(call get_first_two_chars, $(VAR))

define get_first_two_char
...
endef
3个回答

6
很好,这是可以做到的,但手动操作很复杂。最简单的方法是获取GNU Make Standard Library,它有一个内置的substr函数。如果这太过大材小用,你可以从库中提取出该函数,但如我所说,这会令人惊讶地凌乱。
实质上,您需要对字符串进行一系列替换,以在每个字符后插入一个空格:
EMPTY:=
SPACE:=$(EMPTY) $(EMPTY)
VAR := UnKnown
TMP:=$(subst a,a ,$(subst b,b ,$(subst c,c ,.........$(VAR)))))
# TMP now has "U n K n o w n"

接下来,您可以使用$(wordlist)函数来获取中间结果的前两个“单词”:

TMP2:=$(wordlist 1,2,$(TMP))
# TMP2 now has "U n"

最后,您再次使用$(subst),现在是为了去掉最初注入的空格:
VAR_TERSE := $(subst $(SPACE),,$(TMP2))
# VAR_TERSE now has "Un"

2

我真的不赞成强迫 Make 做它明显不想做的事情,但是... 我无法抵制一个好的谜题。

$(eval FOO := $$$(VAR))
$(eval FOO := $$$(FOO))
VAR_TERSE:= $(VAR:$(FOO)=)

3
确实令人费解。有任何评论吗? - Maxim Egorushkin
聪明的技巧,但如果您恰好有与原始变量值开头匹配的单字符变量或与那些变量值开头匹配的单字符变量,则此方法将以非常不可预测的方式中断。例如,请尝试在示例 makefile 的开头添加“U:= XXX”。 - Eric Melski

0

使用 shell 和 sed?

define get_first_two_char
$(shell echo $1 | sed 's/^\(..\).*/\1/' )
endef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接