PHPのextensionでHaskellを呼び出す
ソースをダウンロード。
apt-get source php5 cd php5-5.2.0+dfsg/ext ./ext_skel --extname=haskelltest cd haskelltest/
comfig.m4 のコメント解除。
PHP_ARG_ENABLE(haskelltest, whether to enable haskelltest support, Make sure that the comment is aligned: [ --enable-haskelltest Enable haskelltest support])
コンパイルテスト。
phpize ./configure make
php_haskelltest.h に関数宣言を追加。
PHP_FUNCTION(haskelltest);
haskelltest.c に 関数定義を追加。
PHP_FE(haskelltest, NULL) PHP_FUNCTION(haskelltest) { hs_init(0, 0); printf("%s\n", hsOutput); hs_exit(); return; }
Haskellのコードを書く。
module HaskellPhp where import Foreign.C.String foreign export ccall hsOutput :: IO CString hsOutput :: IO CString hsOutput = newCString "test haskell!"
ghc -ffi -c testffi.hs
make
makeはgccなので、Haskellのオブジェクトを指定してghcでリンクし直す。
ghc -optl-shared .libs/haskelltest.o testffi.o testffi_stub.o \ -optl-Wl,-soname -optl-Wl,haskelltest.so -o haskelltest.so
.soファイルをコピーしてPHP実行。
cp haskelltest.so /usr/lib/php5/20060613+lfs/ php -r "dl('haskelltest.so'); haskelltest();"
-
-
- -
-
何度目かのトライ。
最後の方が無理矢理だけどやっと動いた。
- 参考
# 取り敢えずコンパイルが通るまでをやったので構造は適当。hs_init()とhs_exit()を呼び出す位置は PHP_MINIT_FUNCTION などに変えた方がいいかもしれない。