ぬるぽを見かけたら 全力でぶっ叩くのみ


by Denullpo Smasher Hammerson
カレンダー
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

Makefile革命

ぶっちゃけ、makefileってめんどい。
…というきっかけから、いろんな派生品が生まれたわけではありますが、
どれも使い勝手は今ひとつ。

その理由は、
・従来のmakefileの記法を踏襲しつつ
・中途半端に高度な機能を盛り込んでて
・拡張機能を覚え直すのに手間かかる割に
・めんどいという点があまり改善されてない
というところにある。

自分がmakefileに求める要件とは
・動的にコマンドを生成して実行する
・依存関係を考慮してコマンドの実行順序を決める
・依存元が更新されたときだけコマンドが実行される
ぐらいか。ならば、先に挙げた不満な点とは全く無関係なので、
単純にその逆をいくのが理想だ。

・従来のmakefileの記法は全く無視して
・便利な機能をとことん追求し
・わざわざ拡張機能覚え直す必要なくて
・めんどさを徹底的に解消する

一見無理難題に見えるが、これは既存の汎用的なスクリプト言語を
ベースにするだけで一通り解決できる。
ここではPHPを使っているが、別にRubyでもPythonでもいい。
汎用的スクリプト言語なら、中途半端な拡張機能特有の仕様不備に
悩まされることなく自前でとことん機能を強化できるし、機能強化の
ために独自の言語体系を覚え直す必要もない。

…ということで、これを実現したらどうなるかのデモ目的で
サンプル付きβ版を公開してみる。
[ymk.zip](YMk's Makefile killerの略…かどうかは謎)
なお、今のところはWindows依存なので悪しからず。




ファイル構成とか細かい説明は割愛(ぉ
デモということで、使い方だけ。
test 内がサンプルになっているので、ここをカレントディレクトリにして
コマンドプロンプトから実行という想定なんだけど、その前に準備。

予めインストールしておくソフト
PHP5
BorlandCまたはC++Builder(*1)
MingW(*1)
VisualStudio2005 Express(*1)
NASM(*2)
YASM(*3)(*4)
PExports(*3)
Microsoft Platform SDK(*4)

*1:最低どれか1つ
*2:BorlandCでビルドする場合に必要
*3:MingWでビルドする場合に必要
*4:VisualCでビルドする場合に必要


その他準備
・pathにPHPを通しておく
・MingWでビルドする場合、pathにMinGW4_5\binを通しておく
・VisualCでビルドする場合、VisualStudio2005\VC\bin\vcvars32.bat を実行しておく
・YMkCfgを各自の環境に合わせて再設定
 各ソフトのインストールディレクトリを書き換えておく
 (個別環境依存部はmakefile本体から隔離しておく趣旨なのよん)

ビルドしてみる
testディレクトリをカレントにして
> ymk
で普通にビルド。
成功すると bin/gsar0/ というディレクトリが掘られ、
中にtest_c.exe test_w.exe ができる。
前者がCUI版で、後者がGUI版。
この後もう一度
> ymk
を実行すると
:[YMk] (TestAppRule) nothing to do.
と出てくる。ソースに変更ないのでコマンドを実行するまでもないという意味。
ここで例えばtest_c.cppを適当に書き換えて
> ymk
を実行すると、test_c.cppのコンパイルとtest_c.exeのリンクだけが行われる。
もしリビルドをしたいときは、
> ymk -f
だけでよい。従来のmakefileのようにリビルド目的で中間ファイルを消す必要はない。
それでも消したいときは
> ymk clean
で掃除。
ただし、スクリプトでの自動ファイル削除ってのは誤爆が怖いので実際に削除はしない。
_ymk_trash_というディレクトリが掘られて、その中へ移動という動作になる。
実際に削除するときは、_ymk_trash_の中身が不要であることを確認してから
手動で消してくださいまし。

マルチコア環境なんかで並列動作させたい場合、-mオプションを付加する。
例えば、4コアなら
> ymk -m4
で4つのコマンドが同時に実行される。
もちろん、並列動作させても依存関係による実行タイミングは調整される…はず。
ここらへんの細かい挙動をみたい場合は、-vオプションを付加するといろいろ
ログに吐き出されて把握できる。

なお、規定ではMingWでビルドが行われる。
BorlandCでビルドするときは
> ymk +c:b
VisualCでビルドするときは
> ymk +c:v
とする。んでもって、
> ymk +c:bgv
とかすると3系統同時にビルドできたり。

他には、
+a TCHAR型をANSI文字として扱う
+u TCHAR型をUnicode文字として扱う
+d デバッグ版ビルド
+r リリース版ビルド
+l:s スタティックライブラリ版ビルド
+l:d ダイナミックライブラリ版ビルド
というコンテクストオプションが用意してある。
これらは全て同時指定でき、
> ymk +c:bgv +l:sd +a +u +d +r
とかすると3x2x2x2で全24系統同時ビルドという酔狂なことになる。

さらに、+dは1以上、+rは0以上の整数を追記することで細かい
コンテクスト分けができる。デバッグビルドで含めるデバッグ機能を分けたり、
リリースビルドで最適化アルゴリズムを分けたりといった使い方をするためにある。

今後の予定
まず、ソースを解析してヘッダファイルの依存設定を自動的に行う機能。
これを手動設定することはmakefileのめんどい要素最筆頭に挙げられるほど
超重要な機能だが、ぢつはまだ未実装だったり。

あと、現在はymk.batから起動するようになっているが、これは機能的に
不充分なのでexe化する予定。
[PR]
by denullpo | 2011-11-19 01:16 | こっち関係