給定一個Makefile中的字符串,是否可以使用Makefile語法(不使用shell調用)提取未知字符串的前兩個字符?Makefile:返回字符串的前兩個字符
例如,
VAR := UnKnown
VAR_TERSE = $(call get_first_two_chars, $(VAR))
define get_first_two_char
...
endef
給定一個Makefile中的字符串,是否可以使用Makefile語法(不使用shell調用)提取未知字符串的前兩個字符?Makefile:返回字符串的前兩個字符
例如,
VAR := UnKnown
VAR_TERSE = $(call get_first_two_chars, $(VAR))
define get_first_two_char
...
endef
好了,這是可以做到的,但它是相當混亂的手來實現。最簡單的方法是獲取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)
,現在去掉您最初注入的空間:
我真的不贊成強制讓事情顯然不想做,但是......我無法抗拒一個好的謎題。
$(eval FOO := $$$(VAR))
$(eval FOO := $$$(FOO))
VAR_TERSE:= $(VAR:$(FOO)=)
確實令人困惑。任何評論? –
聰明的把戲,但如果碰巧有單字符變量匹配原始變量值開始處的字符,或者匹配_those_變量值開始處的字符,那麼這將會以非常不可預知的方式中斷。例如,嘗試在示例makefile的開頭添加「U:= XXX」。 –