Makefileに文字列を指定すると、(シェル呼び出しを使用しないで)Makefile構文を使用して未知の文字列の最初の2文字を抽出できますか?例えばMakefile:文字列の最初の2文字を返します。
、
VAR := UnKnown
VAR_TERSE = $(call get_first_two_chars, $(VAR))
define get_first_two_char
...
endef
Makefileに文字列を指定すると、(シェル呼び出しを使用しないで)Makefile構文を使用して未知の文字列の最初の2文字を抽出できますか?例えばMakefile:文字列の最初の2文字を返します。
、
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)
を使用します
私は本当にMakeが強制的にそれをしたくないことを認めていませんが、良いパズルに抵抗することはできません。
$(eval FOO := $$$(VAR))
$(eval FOO := $$$(FOO))
VAR_TERSE:= $(VAR:$(FOO)=)
確かに不思議です。コメントはありますか? –
明快なトリックですが、元の変数の値の先頭にある文字に一致する1文字の変数や、_those_変数の値の先頭にある文字に一致する1文字の変数があると、これは実際には予測できない方法で破損します。たとえば、サンプルのmakefileの先頭に "U:= XXX"を追加してみてください。 –