2010年12月24日

PECLが ERROR: `phpize' failed でいつも失敗する

peclのインストールが必ず失敗する現象に前からなっていて、軽く困っていたものの、いつもソースからビルドしてしまっていた。
具体的には、phpize の実行が必ず失敗する。
% sudo pecl install APC
downloading APC-3.1.6.tgz ...
Starting to download APC-3.1.6.tgz (148,835 bytes)
.................................done: 148,835 bytes
49 source files, building
running: phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
ERROR: `phpize' failed


peclが使えないと、新しく環境構築するたびにいちいち手でビルドするのが面倒なので、この際調べてみた。すると、{/usr/local/lib/php/}PEAR/Builder.php の 関数_runCommand()内、関数pclose()が、正しいファイルハンドルを渡しているのに常に失敗することがわかった。

function _runCommand($command, $callback = null)
{
:

:
if ($callback && isset($olddbg)) {
$callback[0]->debug = $olddbg;
}

$exitcode = is_resource($pp) ? pclose($pp) : -1;
return ($exitcode == 0);
}

pclose()が -1 を返すので、結果がいつも false だ。

ナンデダ!と思って情報を探ったところ、PHPのconfigureオプションで--enable-sigchildを付けるとpclose関数で-1が返るという情報を発見。

むう。なるほど。。。
ということは、
  1. --enable-sigchildを付けないPHPにする
  2. peclを使わずいつも手で入れる
  3. _runCommand()をなんとかする
くらいか。

1.をするのがマットウと思えるが、今回は2.のために、PECLっぽく引数を与えるとソースをダウンロードしてコンパイルしてインストールする、というのをスクリプトで自動化してみた。

#!/bin/sh
tgz=`pecl download $2 | awk '/downloading/{print \$2;}'`
dir=`echo "${tgz}" | sed 's/\.tgz//'`
case "$1" in
"install" )
tar xvfz ${tgz}
cd ${dir}
phpize
./configure
make
make test
make install
cd ..
;;
"download" )
exit
;;
* )
echo "$0 {install,download} package"
;;
esac
rm -rf ${tgz} ${dir}

こんなスクリプト peclinstaller.sh を作って、peclinstaller.sh install APC などとする。インストール済かどうかの管理は出来ないけど、とりあえず初期環境構築の時の省力化にはアリかな。

あるいは、Builder.php の _runCommand() を

$exitcode = is_resource($pp) ? (($pret = pclose($pp)) == -1 ? 0 : $pret) : -1;

とかしちゃうのも逃げとしてはアリか?
posted by usoinfo at 08:30 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]