给定Makefile中的字符串,是否可以使用Makefile语法提取未知字符串的前两个字符(不使用shell调用)?
例如,
VAR := UnKnown
VAR_TERSE = $(call get_first_two_chars, $(VAR))
define get_first_two_char
...
endef
答案 0 :(得分:4)
嗯,可以做到,但手工实施却相当混乱。最简单的方法是获取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"
答案 1 :(得分:2)
我真的不赞成强迫Make做它显然不想做的事情,但是......我无法抗拒一个好的谜题。
$(eval FOO := $$$(VAR))
$(eval FOO := $$$(FOO))
VAR_TERSE:= $(VAR:$(FOO)=)