ログ日記

作業ログと日記とメモ

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!"

Haskellコンパイル

ghc -ffi -c testffi.hs

PHP extensionを再コンパイル

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 などに変えた方がいいかもしれない。