Makefileで存在チェック - wildcard関数

wildcard関数はそもそもその名の通り、*や?といった文字を展開する関数。
しかし、これに*や?のない単純なファイル名を与えることで、ファイルの存在チェックができる。

ファイルが存在しているときは、与えたファイル名がそのまま返るが、そうでない場合、空文字が返る。
これにより、空文字かどうかをチェックするif関数と組み合わせることで、ファイルの存在チェックができるということだ。
このwildcard関数とif関数の組み合わせは、イディオムとして広く使われているようだ。 こんな感じ。

# $(call do-it, foobar.txt) のように使う
do-it = $(if $(wildcard $1),,command)

無理矢理すぎるだろう…
えーと、UNIXの思想、小さなことをしっかりやる単機能を組み合わせて大きな力を生む、という考えはとても好きだ。
だが、…このmakeに関しては失敗しているように思う。
シンプルさが裏目に、わかりづらい、読みづらい方向に出ている。
そう、シンプルな単機能をどう切り出すかによって、物の使いやすさがかわってしまうということが体感としてわかる例だなと感じる。
make自体に歴史があって、設計思想がすごくうまく機能している要素と、そうでない要素に分かれていると感じる。

大元の、変更日付をチェックしてコマンドを依存するものに波及していく、という思想はものすごく良いと思う。
データ、というかルールでドリブンする機能で、本当に美しい。
だが、たとえば.c.oや、%を使った展開などは、疑問に感じる。
Makefileを短くすることには寄与したかもしれないが、読みづらすぎる。
makeに抵抗感を感じてしまうのには、こういった読みづらさ、取っつきの悪さが原因になっているのではないだろうか。

もう一個語りたいのは、makeフォロワーの苦しさ。
makeはちっとも綺麗じゃないとは思うのだけれど、ほかのビルド構成ツールもいまだにmakeを超えられていないと感じる。
疲れたので多くを語るのは避けるが、makeは巨大でいびつな物となっているものの、結局一番まともだと思う。

おわり