― Web Technology and Life ―

ubuntuにphp-buildでphp5.5を入れるためにシェルスクリプトと格闘した記録

2013-09-15
ubuntu10.04とubuntu12.04(VirturalBox)にphpenvのプラグインとしてphp-buildを入れて、php5.5.3いれようたしたら、全然動かなくて、フリーズ状態だったところで、なんとか入ったのでその記録

サマリ ~今回の教訓~

  • ログには罠がある
  • 最終的にはソースを見よう(例え慣れていない言語でも、でなきゃ早く諦めるべし)
  • /dev/nullの使いどころをわきまえるべき
  • Linux力、最低でもソースからいれている経験は重要

概要と基本的なphpenv + php-buildによるphpのインストール

sudo aptitude install -y libxml2 re2c autoconf bison libxml2-dev libcurl4-dev libjpeg62 libjpeg62-dev libreadline6-dev libpng12-0 libpng12-dev libtidy-dev libxslt-dev libltdl-dev libltdl7 libltdl7-dev libmcrypt-dev openssl libcurl4-openssl-dev
cd ~
curl https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | /bin/bash
echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(phpenv init -)"' >> ~/.zshrc

mkdir $HOME/.phpenv/plugins
cd $HOME/.phpenv/plugins
git clone git://github.com/CHH/php-build.git
curl https://raw.github.com/hnw/php-build/plugin-to-chh-phpenv/bin/rbenv-install > php-build/bin/rbenv-install
phpenv install 5.5.3 #入れたいバージョンを適宜、たぶん、タブで一覧が出てくるので

そもそもこれですんなり入るのがふつう。入らないのはおかしい。

今回失敗していた大きな問題はaptitudeで入れている「autoconf」というコンパイルライブラリがないことにより、xdeubgのインストールに失敗していたことなんだけど、その発見が著しくおくれていたいことになった。その記録。

ログには罠がある

当初、phpenv install 5.5.3をたたいたあとには、以下のようなログが出てきた。

[Info]: Loaded apc Plugin.
[Info]: Loaded pyrus Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 5.5.3 into /home/hirobanex/.phpenv/versions/5.5.3
[Downloading]: http://www.php.net/distributions/php-5.5.3.tar.bz2
[Preparing]: /tmp/php-build/source/5.5.3
[Compiling]: /tmp/php-build/source/5.5.3
[Pyrus]: Downloading from http://pear2.php.net/pyrus.phar
[Pyrus]: Installing executable in /home/hirobanex/.phpenv/versions/5.5.3/bin/pyrus
[XDebug]: Downloading http://xdebug.org/files/xdebug-2.2.3.tgz
[XDebug]: Compiling in /tmp/php-build/source/xdebug-2.2.3

-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/fpm_main.c:1832:9: 警告: warn_unused_result 属性付きで宣言されている ‘write’ の戻り値を無視しています [-Wunused-result]
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/fpm_main.c:1841:8: 警告: warn_unused_result 属性付きで宣言されている ‘write’ の戻り値を無視しています [-Wunused-result]
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/fpm_signals.c: 関数 ‘sig_handler’ 内:
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/fpm_signals.c:177:7: 警告: warn_unused_result 属性付きで宣言されている ‘write’ の戻り値を無視しています [-Wunused-result]
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/fpm_unix.c: 関数 ‘fpm_unix_init_child’ 内:
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/fpm_unix.c:186:8: 警告: warn_unused_result 属性付きで宣言されている ‘chdir’ の戻り値を無視しています [-Wunused-result]
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/zlog.c: 関数 ‘zlog_ex’ 内:
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/zlog.c:191:8: 警告: warn_unused_result 属性付きで宣言されている ‘write’ の戻り値を無視しています [-Wunused-result]
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/zlog.c:195:8: 警告: warn_unused_result 属性付きで宣言されている ‘write’ の戻り値を無視しています [-Wunused-result]
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
-----------------------------------------

The full Log is available at '/tmp/php-build.5.5.3.20130915142126.log'.

これをみると、「PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.」というエラーでこけているかのごとく見える。

なので、phpのconfigure時に、pearが有効になっているか、pharが有効になっているかを確認する(そもそも、「[Compiling]: /tmp/php-build/source/5.5.3」って出ている時点でPHP自体のコンパイルには成功しているんだけど、その後のxdebugとかpyrusとかのインストールの違いが分かっていなかったのがここではまった大きな理由のひとつ)

もちろん、結果的関係なく、いろいろなconfigureの当て方($HOME/.phpenv/plugins/php-build/share/php-build/default_configure_optionsにあるデフォルトのconfigureオプションからかえたり、$HOME/.phpenv/plugins/php-build/share/php-build/definitions/(バージョン番号)にある個別の設定変えたり)するものの、全く効果なし、そして、インストール先のPCのスペックが低いためインストールに2,30分かかり死ぬ。

最終的にはソースを見よう(例え慣れていない言語でも、でなきゃ早く諦めるべし)

完全にフリーズ状態だったんだけど、uzullaさんにいっしょに作業してもらって、phpのインストール自体はできていたり、あれこれとphpのソースビルドの周辺情報もらったり、php-buildのシェルスクリプト眺めたり、って領域に突入していった。

最初から、みればよかったんだけど、何分phpもシェルスクリプトも不得手なので、見てもわからないだろうとあきらめていた。

ただ、ソースをみていると、「[Info]: Loaded apc Plugin.」とかログをだしているコードをみつけて、「あぁ、このlog関数使ってwarnデバックやれば何かわかりそうだ」という基本的なところに行きついた。

すると、「.phpenv/plugins/php-build/share/php-build/plugins.d/xdebug.sh」の68-75行目の直前でこけていることが分かった。

{
    $PREFIX/bin/phpize > /dev/null
    "$(pwd)/configure" --enable-xdebug \
    --with-php-config=$PREFIX/bin/php-config > /dev/null

    make > /dev/null
    make install > /dev/null
} >&4 2>&1

なんか、「make」「configure」とか、ログを/dev/nullにつっこんでるけど、どうなのよって感じ。明らかに。

/dev/nullの使いどころをわきまえるべき

そんで、「> /dev/null」をはずして実行すると以下のようなログをえた

(略)
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/zlog.c:191: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result
/tmp/php-build/source/5.5.3/sapi/fpm/fpm/zlog.c:195: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

autoconfがないとはっきり出力されている。そんで、sudo aptitude install audoconfの後に、再度、phpenv install 5.5.3をかけるとなんとはいった!!

Linux力、最低でもソースからいれている経験は重要

今回は、重要なログが握りつぶされていたことがフリーズ状態の直接的な原因だった。

しかし、重要な背景に、ぼくのログを見る力不足で調査するべき的が外れていたことがあった。

つまり、phpへの理解やソースからのビルドの理解、シェルスクリプトのコードリーディング力など、トータル的にLinux力が足りていないことが大きな間接的な原因であった。

最初からわかるスーパーマンはいないし、とりあえず、こういう機会にある程度まとまったシェルスクリプトを眺めた(読めているわけではない)こと貴重な体験だった。

あと、上記の例だと、「[XDebug]: Compiling in /tmp/php-build/source/xdebug-2.2.3」の後にこけて入っていなかったぽいけど、.phpenv/plugins/php-build/share/php-build/plugins.d/pyrus.shでの以下のコード部分でこけていて、pyrusのインストールでも失敗したケースもありました。

"$PREFIX/bin/pyrus" set bin_dir "$PREFIX/bin/" &> /dev/null

「setコマンドにこんな使い方ないなー」って思って、yanchaで聞いたら、tsucchiさんとichigotakeさんに、「pyrusに set bin_dir "$PREFIX/bin/"っていう引数を渡しつつその実行で出てくる標準出力が画面に出なくなるっていう処理に見えますが」って教えてもらった。

なんか、いつの間にここでこけることがなくなっていたので、結局なんでこけていたのかわからないけど、「/dev/null」マジ恐怖

最後に

なかなか人に聞く機会ってないけど、人に教えてもらうと思い込み排除できたり、新しい視点をもらったりできて、ホント助かるし、ぼっちはマジでしんどい。こういう機会にいろいろ吸収しておきたい今日この頃。。。

とりあえず、毎度ですが、phpcon中なのに、一緒にインストールにはまってくれてたuzullaさんにマジ感謝ですし、yanchaでさっくと教えてくれたtsucchiさんとichigotakeさんにもマジ感謝です!

さてさて、やっとComporserとかPHPUnitとか、やろうかしらん・・・

PHP update_at : 2013-09-15T16:43:20
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus