2011-08-18 20 views
2

Makefileに文字列を指定すると、(シェル呼び出しを使用しないで)Makefile構文を使用して未知の文字列の最初の2文字を抽出できますか?例えばMakefile:文字列の最初の2文字を返します。

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

define get_first_two_char 
... 
endef 

答えて

3

まあ、それは行うことができますが、それは手で実装するのはかなり厄介です。一番簡単な方法は、を取得することです。これには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)を使用します

1

私は本当にMakeが強制的にそれをしたくないことを認めていませんが、良いパズルに抵抗することはできません。

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

確かに不思議です。コメントはありますか? –

+0

明快なトリックですが、元の変数の値の先頭にある文字に一致する1文字の変数や、_those_変数の値の先頭にある文字に一致する1文字の変数があると、これは実際には予測できない方法で破損します。たとえば、サンプルのmakefileの先頭に "U:= XXX"を追加してみてください。 –

関連する問題