December 08, 2020

文字列の関数

make の関数は $(function arguments) の形式で呼び出します。 arguments はカンマ(,)区切りで複数指定できますし、空白区切りのリストも指定できます。

文字列に関する関数はいくつかありますが、主に使うのが substpatsubst です。

subst

subst は単純に文字列を置換する関数です。

$(subst from,to,text)
subst:
	echo $(subst og,xx,hoge)
$ make subst
echo hxxe
hxxe

patsubst

patsbust は簡単なパターン置換を行う関数です。

$(patsubst pattern,replacement,text)

% を含むパターンを置換します。

patsubst:
	echo $(patsubst %a,%,hoge fuga vaa)
$ make patsubst
echo hoge fug va
hoge fug va

代用参照

シェルの変数展開(Parameter Expansion)のように、 文字列を置換できるのが「代用参照(Substitution Reference)です。

$(var:pattern=replacement)

代用参照は patsubst と同じように動くので、先程の例はこのように書けます。 一度変数に格納しないといけませんが、短く書けます。

var := hoge fuga vaa

subst-ref:
	$(var:%a=%)
$ make subst-ref
echo hoge fug va
hoge fug va

残念なカンマ

なんとも残念な感じですが、make の関数呼び出しではカンマ(,)が扱えません。 エスケープする手段もないため、このように一度変数化して展開する必要があります。

clist := hoge,fuga,vaa
comma := ,

comma:
	echo $(subst $(comma), , $(clist))
$ make comma
echo hoge
hoge

凝ったことをしない限りこれに困らされることはありませんが、やはり特性にあった使い方をするのが大事かなと思います。

リンク