Makefileで使える関数の解説は、今回取り上げるshell関数が最後だ。この関数はほかの関数とは異なり、シェルプロセスを起動してそちらで処理を行わせ、その出力を結果として利用する。レシピで行われている処理を明示的に行うようなイメージだ。強力な関数で何かと便利なのでつい使いたくなるが、乱用はしない方が良い。

shell関数

Makefileでは、Makefileに用意されている機能を使って処理を行い、レシピの部分だけがシェルで処理される。基本的にレシピ以外の部分はmakeが処理を行っており、シェルスクリプトのようにシェルコマンドは処理されない。

しかし、Makefileに用意されている機能だけでは記述ができないことがある。シェルやコマンドを使いたいケースがあるのだ。そうした場合に使えるのがshell関数である。同関数は、シェルで言うところのコマンド置換のような動きをする。shell関数の動作を簡単にまとめると次のようになる。

関数 シンタックス
shell $(shell シェルコマンド)
関数 内容
shell シェルのコマンド置換のように、引数に指定された文字列をシェルコマンドとして実行し、その結果に置き換える。結果に含まれる末尾の改行は削除されるほか、中に含まれている改行はスペースに置き換えられる

shell関数はシェルを起動し、そちらへ処理を依頼する。そして、その処理結果がshell関数の結果として使われる仕組みだ。ただし、結果に含まれている改行だけは空白に置換され、実行結果の最後に含まれている改行は削除される。

shell関数は呼ばれるたびに新しくシェルを生成する。そのため、再帰的に何度も呼び出されるような書き方の末端に書いてあると、処理が重くなる可能性もある。現在のマシンスペックやシステムコールの実装を考えると、これはもう無視しても良い程度の負荷かなという気もするが、一応心に留めておくと良いだろう。

shell関数を実行してみよう

この記事は
Members+会員の方のみ御覧いただけます

ログイン/会員登録(無料)

会員サービスの詳細はこちら