最近Erlangのコードを書いてるんだけど、いちいちEShellを立ち上げてコンパイルするのが面倒になってきたのでmake / Erlang Worldを参考にしてMakefileを作ってみた。リンク先のMakefileにcleanコマンドを追加するなどちょこっと変えてある。
.SUFFIXES: .erl .beam .erl.beam: erlc $< > $@ SOURCES = $(wildcard *.erl) PROGS = $(SOURCES:.erl=.beam) all: $(PROGS) clean: rm -f *~ *.beam
でもって実行のほうもコマンド一発で出来るようにしようと考えたのだが、これがなかなか面倒だった。
Erlnagはスクリプト言語なのでRubyやPythonなんかと同じく普通にターミナルから実行できると思ったら大間違いで、どうやらEshellを立ち上げないと実行できないらしい。(yawsやらはどうやって動かしてるのだろう…)なので、メモ代わりに使わせてもらってます。を参考にモジュールとメソッド名を打ち込むだけで自動実行するスクリプトを組もうとしたら、これがなかなかうまくいかなかった。*1実際よくシェルスクリプトを理解してないので、諦めてrubyで作ろうと思っていたところでErlang Tipsからもっと簡単な書き方を発見。これを元に次のコードを書いてやっと思い通りの開発環境が構築できた。
#!/bin/bash erl -noshell -eval "io:format(\"~p~n\", [$1]),halt()."
上のコードをexecute.shなど名前をつけて保存し、実行権限をつければ用意は万端。
まずmake clean, makeとしてbeamファイルを作成し、
make clean make
次にexecute.shに呼び出したいメソッド名を書けば実行できる。(エントリメソッドの返り値もio:formatせずに表示される)
./execute.sh main:main\(\)
この際メソッドの括弧をエスケープすることを忘れずに。これにハマって二十分無駄にした。バックスラッシュが美しくないと言う方は次のようにダブルクォーテーションで囲めばよい。
./execute.sh "main:main()"
それにしても、Erlangをターミナルから呼び出すのになぜこんなに手間がかかるのだろう?