Waf

Wafはビルドツールの一つで、python で書かれている。ちょっと面白いので調べてみた。

Waf とは

Wafは、MakeやRakeのようにソースツリーをビルドするツール。スクリプト言語で書かれているので機能を簡単に拡張できるところはRakeにちかいか。Rakeと同様に、ビルドスクリプトpythonそのもののプログラムとなる。

RubyDSLを書きやすい構造になっているおかげで、Rakeのスクリプトはぱっと見Rubyのプログラムには見えないが、Pythonはそういうふうにできていないので、モロにPythonのプログラムとして書くことになる。下は、main.c と test_staticlib.c から作ったライブラリをリンクしてappを作るビルドスクリプト。あんまり格好良くない。だが、それがいい

def build(bld):
        bld.stlib(
                source   = 'test_staticlib.c',
                target   = 'mylib',
                name     = 'stlib1') 

        bld.program(
                source   = 'main.c',
                target   = 'app',
                includes = '.',
                use      = ['stlib1']) 

実行方法

実行方法というか配布方法が結構面白い。Wafの配布ファイルは単一のpython ファイルになっている。タイプしてみると前半はpythonプログラムなのだけど、後半はバイナリになっている。このバイナリはbzipで圧縮されたディレクトリ構造となっており、そこに本体が入っている。起動すると、後半のバイナリをファイルに書きだした上で、ディレクトリを展開し、そこに制御を移すようになっている。

Python2系と3系両方に対応しているのだけど、コード自体は3で書かれているようだ。で、2系の場合はディレクトリを展開した後、スクリプトでコードを書き換えて2系対応にするようだ。無茶するなあ。

弱点

こういう構造なので、wafスクリプトが置かれている直下に本体のディレクトリを展開することになる。ということは何を意味するかというと、waf はそれを使うユーザのwritableなディレクトリに置かなければならないということ。なので、/usr/local/bin とかにコピーして使うことはできない。

しかしサイズにして100K足らずの小さいツールなので、あんまりみんなでシェアする必要はないのかもしれない。プロジェクトのホームにコピーしておけばいい。

所感

こんな面倒なブートシーケンスなのに、さくっと立ち上がるのがすごい。最近の計算機の速度にはびっくりだ。