読者です 読者をやめる 読者になる 読者になる

SCons で Erlang/OTP 用 Builder の作成 #1

長いです。スルーしてください。
結論としては SCons で Erlang 用 Builder は 3 時間では書けないってことです。


Erlang のビルドには Make をいつも使ってるのですが、せっかくなので SCons で Builder を使って Program('spam.erl') とかやるだけでにしたいなぁとは思っていたのですが、そこまではとてつもなく道のりは遠そうです。erlc.py を書くのはしんどそう。

ということでまずは Builder を書いてみればいいのではないかと思い立ち、簡単に書いてみましたが、はまるはまる。

for を使わない方法を探し求めましたが結局必要そうです。まずは1ファイルだけコンパイル出来ればいいかなと思い適当に書いてみました。

ポイントはフォルダの固定にあるんでしょうか、doc, ebin, src, deps, include, test くらいで十分でしょうか。c_src はまだ使ったことが無いので保留。

結局の所 src/*.erl を ebin/*.beam にするだけなのですが、罠が数点あります。behaviour を自分で書いてたりするとまずは behaviour を先にコンパイルして ebin 下に起き、-epa あたりで ebin を指定する必要があります。

SCons は ebin への移動を Install で行うため事前に ebin へ持って行くファイルを準備しておく必要があります。

さて、SCons 歴 3 時間なので、偉そうなことは何も言えませんが、不満点。

不満を列挙しておけば、これこうやるといいよねって教えてくれるネ申が出てくる気がするので。

  • Target がファイル名前提。Erlang の場合ソースファイルが spam.erl だったらビルド後は spam.beam なので ebin というフォルダ指定だけで十分なのに、色々面倒。だからといって Dir('ebin') で渡すと Builder はビルド済みのファイル名一覧を返してくれなくなるのでこの辺の融通が利かない。
  • filter-out が無い。Chrome とかみると linux_env.FilterOut とか書いてあったので本気でない気がする。これは Glob('src/*.erl') でとった Node リストから自作 Behaviour を取りの続載に必要なのだけれど、なんらかの努力が必要。
  • とにかくファイル以下のなんたら、って処理がしんどい。wildcard や filter-out が気軽に使えない。
  • Builder の書き方がアンドキュメント過ぎる。簡単には書いてあるのですが、少しでもやろうとすることがドキュメントと変わった瞬間に困ることありまくり。
  • man をみても Builder の action 以外の情報が明確になっていない。suffix や src_suffix, さらには source_factory, target_factory とかどこにも載ってないのでソース読めな感じ。
  • Alias とか Install がわかりにくい。scons install とかやるために env.Alias('install', Intall オブジェクト) があったりとか。

色々言いましたが、そもそも SCons は環境依存の排除が前提であるので、これら不満点が的を得てません。

書いてみて思ったのは、ドキュメントあるけどなんか的を得てない。でも Python で書けるのは素晴らしいけど、Action とか理解するのしんどい。

そもそも Erlang は VM だし環境依存は VM が吸収するんだから Make でいいよねと何度思ったか。

ですが、SCons から学べることは沢山ありそうなので、引き続き勉強は続けていきたいと思います。

Builder の勉強方法は ...