WindowsXPのGHCでGtk2Hsを使ってみます

GUIに手を出してみます。とりあえずWindowsXP上のGHC 6.4.2でGtk2Hs 0.9.10を使ってみます。Gtk2HsっていうのはGtk2のHaskellバインディングです。
まずはインストール方法を説明します。とりあえず以下からGHC 6.4.2で使えるgtk2hs-0.9.10.exeとGtk2をGtk+/Win32 Development Environment 2.8.18-1をダウンロードしてインストールします。

またUPXを使わないとプログラムのサイズが大きくてやってられないのでこれもインストールしておきます。

次にお決まりのHello, worldプログラムとそのMakefileを示します。あ、このMakefileCygwin上で動かしてます。
ファイル: hello.hs

import Graphics.UI.Gtk

main :: IO ()
main = do 
  initGUI
  window <- windowNew
  button  <- buttonNew
  set window [windowTitle := "Hello", containerChild := button]
  set button [ buttonLabel := "Hello" ]
  onDestroy window mainQuit
  onClicked button mainQuit
  widgetShowAll window
  mainGUI

ファイル: Makefile

TARGET = hello

HC          = ghc
HCFLAGS     = -W -fno-warn-unused-matches --make
HCFLAGS_REL = -optl-mwindows
UPX         = upx
UPXFLAGS    = --overlay=strip --strip-relocs=0
EXE         = .exe

all: $(TARGET)_d$(EXE)
release: clean $(TARGET)$(EXE)

$(TARGET)_d$(EXE): $(TARGET).hs
	$(HC) $(HCFLAGS) $< -o $@

$(TARGET)$(EXE): $(TARGET).hs
	$(HC) $(HCFLAGS) $(HCFLAGS_REL) $< -o $@
	$(UPX) $(UPXFLAGS) $@

clean:
	rm -f $(TARGET)_d$(EXE) $(TARGET)$(EXE) *.o *.hi

以下、実行例です。とりあえずデバッグモジュールを作成します。デバッグモジュールは、hello_d.exeというファイルに生成されます。ダブルクリックしてプログラムを起動すると、コンソールウィンドウ(DOS窓みたいなの)もいっしょに表示されます。その場限りのデバッグプリントとかに使えます。また、このプログラムのファイルサイズが7Mbyte以上もあります。このプログラムをそのまま配布するのはちょっと厳しいでしょう。

$ make
ghc -W -fno-warn-unused-matches --make hello.hs -o hello_d.exe
Chasing modules from: hello.hs
Compiling Main             ( hello.hs, hello.o )
Linking ...
$ ls -l hello_d.exe
-rwxrwxrwx 1 s-tanaka なし 7055204 Aug  3 07:58 hello_d.exe
rm -f hello_d.exe hello.exe *.o *.hi

次にリリースモジュールを作成します。こちらはデバッグモジュールと違ってコンソールウィンドウは表示されません(ghcの-optl-mwindowsを使ってます)。またUPXを使って圧縮をかけています。7Mbyte→0.5Mbyteになります(upxのupx --overlay=strip --strip-relocs=0がかなり効きます)。

$ make release
ghc -W -fno-warn-unused-matches --make -optl-mwindows hello.hs -o hello.exe
Chasing modules from: hello.hs
Compiling Main             ( hello.hs, hello.o )
Linking ...
upx --overlay=strip --strip-relocs=0 hello.exe
                       Ultimate Packer for eXecutables
    Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006
UPX 2.01w       Markus Oberhumer, Laszlo Molnar & John Reiser   Jun 06th 2006

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   7055204 ->    499200    7.08%    win32/pe     hello.exe

Packed 1 file.
$ ls -l hello.exe
-rwxrwxrwx 1 s-tanaka なし 499200 Aug  3 07:58 hello.exe

参考: