OCaml + Lablgtk2 + GTK2

先日、OCaml + Lablgtkの記事を書きましたが、その後、Lablgtkのコンパイル済みパッケージでは、ネイティブコンパイルができない(つまり、OCamlインタプリタを通してしか実行できない)ということが分かって、ソースからコンパイルすることにしました。
ソースからコンパイルするには、GTK2が使える状態になっていなければいけないので、GTK2のインストールからはじめることになりました。
既にCygwin環境は作ってあるので(参考:http://www.geocities.jp/lethevert/softwares/cygwin/GTKWindows環境向けコンパイル済みパッケージがhttp://www.gimp.org/~tml/gimp/win32/downloads.htmlにあるので、ここから取ってきました。取ってきたパッケージは次のものです。

atk-1.9.0.zip
atk-dev-1.9.0.zip
freetype-2.1.8-bin.zip
gettext-runtime-0.13.1.zip
gettext-tools-0.13.1.zip
glib-2.6.5.zip
glib-dev-2.6.5.zip
gtk+-2.6.8.zip
gtk+-dev-2.6.8.zip
jpeg-6b-4-bin.zip
libiconv-1.9.1.bin.woe32.zip
libpng-1.2.8-bin.zip
pango-1.8.0.zip
pango-dev-1.8.0.zip
pkgconfig-0.15.zip
tiff-3.7.2-bin.zip
zlib122-dll.zip

zlib以外は、Cygwinをインストールしたフォルダ(C:\cygwin など)に解凍し、zlibはbinフォルダ(C:\cygwin\bin など)に解凍しました。
そして、gtkのサンプルコードをコンパイルしてみました。サンプルコードはこちら(http://www.gtk.org/tutorial/ch-gettingstarted.html)にあります。コンパイルには、Cygwin環境で、サンプルソースが(base.c)であれば、

gcc -mno-cygwin -mms-bitfields base.c -o base `pkg-config --cflags --libs gtk+-2.0`

とすると、base.exeができます。
さて、ここで、LablgtkのReadmeによれば、すぐにLablgtkを./configure && make && make installでよいですよ、と書いてあったのですが、その前にocamlmklibを作成しなければいけないことが分かって、作成します。
ocamlmklibを作成するには、OCamlのホームページのダウンロードサイトhttp://caml.inria.fr/download.en.html)から、ソースコードをダウンロードします。そして、その中のtoolsフォルダを展開して、中から「ocamlmklib.mlp」を探します。
このファイルをコピーして、「ocamlmklib.ml」を作り、エディタで開きます。最初の所を、以下のように書き換えます。(環境によって適当に変更します。bindirについては、ocamlのインストールフォルダにパスが通っていたら、特に何も設定する必要はないです。)

let bindir = ""
and supports_shared_libraries = false
and mksharedlib = ""
and bytecc_rpath = ""
and nativecc_rpath = ""
and mksharedlib_rpath = ""
and ranlib = "ranlib"

そして、以下のようにコンパイルします。

ocamlc -c ocamlmklib.ml
ocamlc -o ocamlmklib.exe ocamlmklib.cmo

そうすると、「ocamlmklib.exe」ができるので、「C:\Program Files\Objective Caml\bin」に移動します。
ここまで来ると、lablgtkのコンパイルができます。
まず、lablgtkのソースを展開して、展開したルートディレクトリで、./configureとし、その後、make、make optとします。最後に、make installとすれば完了・・・のはずなのですが、上手くいかないのです。なにやらgtkThread.cmiがないといわれています。
configure.inを読んでみると、どうも、libフォルダの中がきちんと見えていないようで、config.makeの中が、

THREADS_LIB=no
HAS_DLL_SUPPORT=no

となっていたようです。
そこで、config.makeを書き込み可能にして、

THREADS_LIB=system
HAS_DLL_SUPPORT=yes

と修正してやりました。make cleanの後に、もう一度、make、make installとして、再度、make install。今度は成功です。
lablgtk2\examplesの下には、サンプルコードがたくさん置いてあります。これを使って、コンパイルテストしてみます。コンパイルするのに簡単なように、OCamlMakefileを使いました。Makefileに次のように書いて、一つ上のディレクトリにOCamlMakefileを置いて、makeとしたら、calc.exeが作成されました。

OCAMLMAKEFILE = ../OCamlMakefile

SOURCES = calc.ml
RESULT = calc
INCDIRS = +lablgtk2
THREADS = yes

OCAMLBLDFLAGS = lablgtk.cma gtkInit.cmo gtkThread.cmo
OCAMLNLDFLAGS = lablgtk.cmxa gtkInit.cmx gtkThread.cmx

include $(OCAMLMAKEFILE)

さて、これは、Windowsネイティブコードになっているのかな、と思って、エクスプローラからダブルクリックで起動してみたのですが・・・、「libgdk-win32-2.0-0.dll」がないと怒られて、動作しないようです。調べてみると、どうやら、GTK2のコンパイル済みパッケージが、そのような構成になっているようで、ocamlやlablgtkの問題ではないようです。配布する際は、ちょっと考えないとな。
それから、僕の環境では、サンプルのcalc.exeの起動が意外に遅いです。Delphiの場合はもっと速かったような気が・・・。そう思って、サンプルで、Cで組んだ方もチェックしてみると、こちらも起動が遅い感じ。困ったな。どうしようかな。