php_mecabがインストールできない←解決
[形態素解析で検索キーワードの続き]
php_mecab の拡張をインストールしようと0.3.0のパッケージ
を入手して取ってきてもうまくコンパイルできない。(その前に、README には「./phpize」とシステムにインストールされているコマンドがカレントディレクトリ付で実行例が示されているので、ここでまずひと躓き…)。
$ ./configure checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu checking for gcc... gcc ... checking PHP version... configure: error: need at least PHP 4.0.0
config.m4 でのPHPのバージョンチェックがPHP5用になっていないらしくて引っかかる。
皆さん苦労されてるようで、
- 空模様:CodeGen_PECLの設定
- カイハツニッキ:[イベント] 第1回PHP拡張勉強会
- 実例で学ぶPHP拡張モジュールの作り方:第3回 WEBカメラから画像をキャプチャ
- PHPのエクステンションを作ってみる – ぱせらんメモ
って、ほとんどが2007年末から2008年頭あたりまでの情報しか見つからない。PECL自体が廃れてるのかなぁ。
config.m4 を下記のように変更し、phpize をやり直し。
--- config.m4.orig 2009-08-19 09:09:42.000000000 +0900 +++ config.m4 2009-08-19 16:06:27.000000000 +0900 @@ -11,7 +11,7 @@ AC_MSG_CHECKING(PHP version) AC_TRY_COMPILE([#include <php_version.h>], [ -#if PHP_VERSION_ID <40000 +#if PHP_MAJOR_VERSION <4 #error this extension requires at least PHP version 4.0.0 #endif ],
この config.m4 自体は/usr/share/php5-pear/CodeGen/PECL/Extension.php のファイルを元に生成しているのかも?(↓)
echo " AC_MSG_CHECKING(PHP version) AC_TRY_COMPILE([#include <php_version.h>], [ #if PHP_VERSION_ID <".$this->minPhpVersionId()." #error this extension requires at least PHP version ".$this->minPhpVersion()." #endif ], [AC_MSG_RESULT(ok)], [AC_MSG_ERROR([need at least PHP ".$this->minPhpVersion()."])])
で、これで configure までは通るようになったのだが、今度はコンパイルが通らない。
/XXX/php_mecab-0.3.0/mecab.c:353: error: `arg' undeclared here (not in a function) /XXX/php_mecab-0.3.0/mecab.c:354: error: initializer element is not constant /XXX/php_mecab-0.3.0/mecab.c:354: error: (near initialization for `arginfo_mecab_new[1].name') /XXX/php_mecab-0.3.0/mecab.c:354: error: initializer element is not constant /XXX/php_mecab-0.3.0/mecab.c:354: error: (near initialization for `arginfo_mecab_new[1]') make: *** [mecab.lo] エラー 1
mecab.cの該当箇所は次のようになっている。
PM_BEGIN_ARG_INFO_EX(mecab_new, 0, 0, 0) ZEND_ARG_ARRAY_INFO(0, arg, 0) PM_END_ARG_INFO()
ZEND_ARG_ARRAY_INFOの箇所を強引に外してみるとコンパイルは通ったが、やはりライブラリ読み込みはできなかった…(←当たり前)。
どうもZendについて調べてみると、pecl-genで生成されているようだったので、これの簡単な例を試してみたのだが、
この場合でも、似たような Zend 絡みのエラーが出てしまう。
In file included from /XXX/php-module/helloworld/helloworld.c:17: /XXX/php-module/helloworld/php_helloworld.h:78: error: `ZEND_SEND_BY_VAL' undeclared here (not in a function) /XXX/php-module/helloworld/php_helloworld.h:78: error: initializer element is not constant /XXX/php-module/helloworld/php_helloworld.h:78: error: (near initialization for `helloworld_arg_info[0].pass_by_reference') /XXX/php-module/helloworld/php_helloworld.h:78: error: initializer element is not constant /XXX/php-module/helloworld/php_helloworld.h:78: error: (near initialization for `helloworld_arg_info[0]') make: *** [helloworld.lo] エラー 1
PHP, PECL 等の環境の自動更新はしているんだが、どれかが古いんだろうか??(下記の日付らしきバージョン情報を見ると確かに古そうではあるが)。
$ phpize -v Configuring for: PHP Api Version: 20031224 Zend Module Api No: 20041030 Zend Extension Api No: 220040412
別のFreeBSD環境でバージョンをチェックしてみると次のようになった:
% phpize -v Configuring for: PHP Api Version: 20041225 Zend Module Api No: 20060613 Zend Extension Api No: 220060519
うーむ…。どうやって更新するのか情報がイマイチ見つからない。
前者のVine環境で、「apt-get upgrade」等は実行していたのだが、明示的に「apt-get -f install php5-devel」とすると、phpize の環境が更新されたようで、各バージョンが更新され、phpize 後の configure でのバージョン問題も、make 時の Zend のエラーもなくなった…。
$ phpize -v Configuring for: PHP Api Version: 20041225 Zend Module Api No: 20060613 Zend Extension Api No: 220060519
これで php_mecab がビルドできるようになったが、今度は make test が 100% FAIL になる。
でも、これはまた別の話か…。
「make test」時に、php_mecab 側でアーカイブを展開したディレクトリ下の ./modules/ ディレクトリからビルドされた mecab.so を読み込もうとするのだが、このとき、他の /etc/php5/php.d/*.ini で指定されている拡張もここから読み込もうとして結果拡張の読み込み自体ができず、make test もすべて FAIL になっていたらしい。
Makefile を見ると、「EXTENSION_DIR = /usr/lib/php5」の記述もあるのだが、test: 箇所に「$(top_srcdir)/run-tests.php -d extension_dir=modules/」の記述があり、この指定のみが有効になってしまうようだ。このオプション指定時にはコロンでのパスの並列表記もできないようで、modules/ 内に $EXTENSION_DIR にあるライブラリのシンボリックリンクを作成「(cd modules; ln -s /usr/lib/php5/*.so .)」することで対応してみた(←もっとうまくできんのか)。
- phpのextension_dirを複数指定したい – 教えて!goo
- 単に ln などでリンクを作れば済む話ではないでしょうか?
よりマトモそうな方法としては、make test 時には、他の拡張の *.ini ファイルは読み込まない等で無効にするといいのかな。
とかなんとかで、(引き続き、「make install」の /usr/lib/php5/mecab.so 設置後に、/etc/php5/php.d/mecab.ini に「extension=mecab.so」を記述、httpd再起動で)やっと php_mecab が組み込めて phpinfo() でも確認できた。
下記の Programming Magic さんのところ
のサンプルを参考に以下となった。
<pre> $str = "これは、形態素解析のサンプルです。"; print_r(mecab_split($str)); </pre>
Array ( [0] => これ [1] => は [2] => 、 [3] => 形態素 [4] => 解析 [5] => の [6] => サンプル [7] => です [8] => 。 )
[追記]
ちょっと作業で php php-apache php-mysql php-pear あたりのパッケージを再インストールしたら、他のPHP拡張は読み込めるのに、MeCabのみはmecab.iniでの指定では読み込めなくなってしまった…。dl(‘mecab.so’) では動作するので、しばらくこちらでの使用になりそう。