Makefileで使える関数の解説は、今回取り上げるshell関数が最後だ。この関数はほかの関数とは異なり、シェルプロセスを起動してそちらで処理を行わせ、その出力を結果として利用する。レシピで行われている処理を明示的に行うようなイメージだ。強力な関数で何かと便利なのでつい使いたくなるが、乱用はしない方が良い。
shell関数
Makefileでは、Makefileに用意されている機能を使って処理を行い、レシピの部分だけがシェルで処理される。基本的にレシピ以外の部分はmakeが処理を行っており、シェルスクリプトのようにシェルコマンドは処理されない。
しかし、Makefileに用意されている機能だけでは記述ができないことがある。シェルやコマンドを使いたいケースがあるのだ。そうした場合に使えるのがshell関数である。同関数は、シェルで言うところのコマンド置換のような動きをする。shell関数の動作を簡単にまとめると次のようになる。
関数 | シンタックス |
---|---|
shell | $(shell シェルコマンド) |
関数 | 内容 |
---|---|
shell | シェルのコマンド置換のように、引数に指定された文字列をシェルコマンドとして実行し、その結果に置き換える。結果に含まれる末尾の改行は削除されるほか、中に含まれている改行はスペースに置き換えられる |
shell関数はシェルを起動し、そちらへ処理を依頼する。そして、その処理結果がshell関数の結果として使われる仕組みだ。ただし、結果に含まれている改行だけは空白に置換され、実行結果の最後に含まれている改行は削除される。
shell関数は呼ばれるたびに新しくシェルを生成する。そのため、再帰的に何度も呼び出されるような書き方の末端に書いてあると、処理が重くなる可能性もある。現在のマシンスペックやシステムコールの実装を考えると、これはもう無視しても良い程度の負荷かなという気もするが、一応心に留めておくと良いだろう。