その形態は、xCross で

Windows で簡単に exe を作れるプログラミング環境……のタマゴを試してみた。

「何ですか?」「知らないんです」

xCross は、haXe/NekoVM で作ったアプリを実行可能形式にするツールとライブラリ。
実は Windows 用の exe だけじゃなくて、LinuxMac のバイナリも一緒に作ってくれるらしい。
以下は、Windows で試してみたメモ。

「インストールするにゃー」「わかったにゃー」

NekoVM 入れましょう。"Windows binaries" を選んで zip を展開だコラー。

download [NekoVM]
http://nekovm.org/download

パスを通したら、次に haXe 入れましょう。インストーラを使ってもいいし、"haXe 1.16 for Windows" とか書いてあるのを選べば zip 形式でも入手できる。zip の方は、展開したら中にある haxesetup を実行だコラー。

download [haXe.org]
http://haxe.org/download

ちなみに、haxesetup を実行すると、ユーザ環境変数に HAXEPATH、NEKO_INSTPATH が追加され、PATH が通されるみたい。
んで、いよいよ xCross のインストールです。展開した haXe の中に haxelib というツールがあるので、ネットにつながる環境なら、コマンドプロンプトから次のコマンドを実行するだけでいい。

haxelib install xcross

プロキシ使ってる環境だとつながらなかったりするので、そんな場合は、Web ブラウザで http://lib.haxe.org/files/ に行き、xcross-x,xx.zip ってのの最新を取ってくる。んで、以下のコマンドを実行すれば OK だコラー。

haxelib test xcross-x,xx.zip

「おいすー^^」「あ、サンプルたんインしたお!」

いまの時点だと、解説ページがこれしかない。

xCross Help
http://code.google.com/p/xcross/wiki/help

ここに書いてある通り、こんな感じのファイルを Test.hx って名前で作って、

class Test {
    static function main() {
         xcross.Api.message("はろー","はろーっていってるんすよ");
    }
}

コンパイルして、

haxe -neko test.n -lib xcross -main Test

これで NekoVM 用の中間コードが test.n にできるので、

haxelib run xcross test.n

とすると、バイナリができる。

ファイル名 サイズ
Test-linux 214,379
Test-osx 323,468
Test-win.exe 132,195

おお、ほんとに 3 つできた。しかも結構ちっちゃい。
Test-win.exe だけ試してみたけど、実行するとちゃんと日本語のメッセージダイアログが出た。

「効果は発動しなかった」「倒された……」

とりあえず今日はここまで。
xCross 自体には、メッセージダイアログと、処理状況を簡易表示するためのクラスくらいしか入っていない。
ただし haXe の標準 API が使えるから、ある程度の処理はできそう。ファイル読み書きとか。

api [haXe.org]
http://haxe.org/api/
import neko.Sys;
import neko.FileSystem;

import xcross.Winlog;

// カレントディレクトリのファイルを順に処理してるふりをする
class Test {
    static function main() {
        var w = new Winlog("Hello");
        w.button = "Cancel";
        w.enabled = false;
        
        Sys.sleep(0.5);
        w.logProgress("Initializing...");
        Sys.sleep(0.5);
        w.log("done.");
        
        var files = FileSystem.readDirectory(".");
        for( f in files ) {
            w.log(f);
            Sys.sleep(0.5);
        }
        
        w.destroy();
    }
}