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

String Makefile:返回字符串的前两个字符,string,parsing,makefile,String,Parsing,Makefile,给定Makefile中的字符串,是否可以使用Makefile语法(不使用shell调用)提取未知字符串的前两个字符 比如说, VAR := UnKnown VAR_TERSE = $(call get_first_two_chars, $(VAR)) define get_first_two_char ... endef 好吧,这是可以做到的,但是手工操作相当麻烦。最简单的方法是获取,它具有内置的substr函数。如果这太过分了,您可以从库中提取该函数,但正如我所说的,它令人惊讶地混乱 基本

给定Makefile中的字符串,是否可以使用Makefile语法(不使用shell调用)提取未知字符串的前两个字符

比如说,

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

define get_first_two_char
...
endef

好吧,这是可以做到的,但是手工操作相当麻烦。最简单的方法是获取,它具有内置的
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"

我真的不赞成强迫Make做它显然不想做的事情,但是。。。我无法抗拒一个好的谜题

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

确实令人费解。任何注释?聪明的技巧,但如果您碰巧有单字符变量与原始变量值开头的字符相匹配,或者与这些变量值开头的字符相匹配,这将以真正不可预测的方式打破。例如,尝试在示例makefile的开头添加“U:=XXX”。