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

CygwinでUnixモジュールを使う

OCaml

Unixモジュールはソケット関連とかプロセス制御とか,そういう関数が定義されているモジュールです.Unixという名前ですが,Windowsでも大体動きます*1.いわんやCygwinをや(完璧に動くらしいです).キタコレ

しかし,調子に乗ってCygwinインタプリタから使おうとすると,残念な結果になります.

# #load "unix.cma"
Cannot load required shared library dllunix.
Reason: dynamic loading not supported on this platform.

インタプリタからUnixモジュールを使うことができません.

これは,CygwinプラットフォームでUnixモジュールが必要な共有ライブラリを動的にロードできないことが問題なので*2Unixモジュールと関連ファイルを静的にリンクしたインタプリタを使えば解決します.

残念なことにそんなCygwinユーザにとってだけ都合の良いものはデフォルトでは用意されていませんが,ocamlmktopというコマンド一発で作成できます.

$ ocamlmktop -o ocamlcyg unix.cma
$ ./ocamlcyg.exe
        Objective Caml version 3.09.2

# Unix.getenv "WINDIR";;
- : string = "C:\\WINDOWS"

ユニットテスティングフレームワークOUnitとかUnixモジュールに依存する拡張ライブラリは結構あるので,これで幸せになれるかもしれません.

あと,ついでにbigarrayモジュールもリンクしてしまいましょう.これも共有ライブラリが必要なので,悲しい思いをすることになります.

$ ocaml
        Objective Caml version 3.09.2

# #load "camomile.cma";;
Reference to undefined global `Bigarray'
# #load "bigarray.cma";;
Cannot load required shared library dllbigarray.
Reason: dynamic loading not supported on this platform.

ちなみにSourceForge.net: camomile - Project Web Hosting - Open Source Softwareというのはid:yoriyukiさんが開発されているUnicodeライブラリです.

$ ocamlmktop -o ocamlcyg unix.cma bigarray.cma
$ ./ocamlcyg.exe -I +site-lib/camomile
        Objective Caml version 3.09.2

# #load "camomile.cma";;
# module C = Camomile;;
  ...省略

で書いてから気づいたんですが,Unixモジュールの説明してあるところになんか書いてあったのでちょっとぐんにゃりしました.まあ良いけど.

*1:例えばforkとかWin32APIにないやつは無理です.OCamlにはcreate_processがあるので,わざわざforkすることはないと思いますが

*2:なんでだろ?LoadLibraryできるし,dlopen(だったっけ?)もできるはずなのに