GNU Make をシェルスクリプトに変換 ― 2013年12月06日 12時42分04秒
Make を使うのは依存関係の解決の為。問題なくいけば全てを一度ずつ実行すればいいのでこれでも十分実用になる。
% gmake -B -n TMP='$${TMP}' | \
sed -e '/^gmake\[[0-9].*\]/d' -e 's@$@ || exit 1@' > Makefile.sh
GNU Make を -B を用いて全ての手順を強制実行。しかし、-n を用いて、実際には何もせずコマンドを出力するだけ。GNU Make は再帰呼び出し等があるとディレクトリ等の情報を出力するので、それを sed で除去。そして、エラーがあったら停止したいので全ての行末に戻り値が 0 で無いときに exit を呼ぶ。
TMP は Make の変数をシェルスクリプトからでも変更できるように小細工。Make の変数にシェルの変数を代入する。Make 内で $ をエスケープする必要があるので、二つ渡すことになる。シェルスクリプトを実行するときに、% TMP=/tmp/data sh Makefile.sh 等のように、実行時に指定できる様になる。
Make の利点は依存関係の解決。コンパイルをするだけでなく、複雑な依存関係を持ったデータの移行処理等でも、とても有効に使える。
十以上の異なったシステムとプログラムからデータを一時吐かせて、何度も処理をして新しいデータ構造に再処理するプログラムを書いたことがある。途中で出来るデータにも依存関係があって、正しい順番に処理をしていかないといけない。自分でその手順を一気に処理するプログラムを書いてしまうと、問題があったときにどの段階で問題が起きているのか掴みづらい。また、後になって新しい依存関係が発覚して、あれこれとプログラムを書き換えるもの容易ではない。それこそ見事なスパゲッティができあがってくる。Make を用いて、各々の処理を書き、それを点とする。そして、各々の入力の依存関係を羅列、つまり点を繋いでいくことにより、Make が作業点の集まりから作業の流れを作ってくれる。これで、上手なマカロニが調理できる。問題があったとしても、全ての工程の入出力が残り、各々の処理も単純なものを繰り返しなので追いやすい。また、開発とテストも一つ一つの作業に注視すれば良いだけなので、進みも早い。
コメント
トラックバック
このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2013/12/06/7096302/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。