Mountain LionでPHPのビルド

SSDに入れ替えたタイミングでOSもMountain Lionにアップデートしてみた。
XcodeとCommandline Toolsを入れてHomebrewで各種入れ直すところまではすんなりいったけど、自前のPHPビルドだけうまくいかなくて苦労した。


普通にやると個々のコンパイルは通ってるっぽいんだけど最後にこんな感じでリンカのエラーが出る。

Undefined symbols for architecture x86_64:
  "_compress", referenced from:
      _php_mysqlnd_net_encode_pub in mysqlnd_net.o
     (maybe you meant: _zim_Phar_compress, _zim_Phar_compressFiles , _phar_compress_filter , _zim_PharFileInfo_compress )
  "_uncompress", referenced from:
      _php_mysqlnd_net_decode_pub in mysqlnd_net.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libs/libphp5.bundle] Error 1
make: *** Waiting for unfinished jobs....
Failed to make.


んで、色々調べてみたところどうもシステム標準のzlibだと上手くいかないらしい。


Use zlib from homebrew for php 5.4 (fixes issue with OS X 10.8) by ablyler · Pull Request #189 · Homebrew/homebrew-php · GitHub


そんで上記にもある通りhomebrew/dupesからzlibを入れてそっちにリンクするようにすればよいみたい。
というかphp54のFormulaもdepends_on 'homebrew/dupes/zlib'って入ってた。


というわけで、最終的にこんな感じになった。

Mountain LionでのPHPのビルド

libpngとかのためにXQuartsをインストール。
Mountain LionからはX11が同梱されなくなったので自分でXQuartsを入れる。


brewで入れたもの


Apacheはシステム標準ではなくて/usr/local/apache2に自前で入れたもの。


んで、configure

DEST_DIR=/usr/local/php-5.4.6

./configure \
--prefix=${DEST_DIR} \
--with-config-file-path=${DEST_DIR}/etc \
--with-config-file-scan-dir=${DEST_DIR}/etc/php.d \
--with-apxs2=/usr/local/apache2/bin/apxs \
--enable-fpm \
--enable-mbstring \
--enable-mbregex \
--with-pdo-mysql=shared,mysqlnd \
--with-mysql=shared,mysqlnd \
--with-mysqli=shared,mysqlnd \
--with-mysql-sock=/usr/local/var/mysql/mysql.sock \
--with-gd=shared \
--with-jpeg-dir=$(brew --prefix jpeg) \
--enable-exif=shared \
--with-png-dir=/usr/X11 \
--with-zlib=$(brew --prefix zlib) \
--with-bz2=shared \
--enable-zip=shared \
--with-openssl=shared \
--enable-sockets=shared \
--with-curl=shared \
--enable-ftp=shared \
--with-mcrypt=shared,$(brew --prefix mcrypt) \
--enable-bcmath=shared \
--with-iconv=shared,/usr \
--enable-intl \
--with-icu-dir=$(brew --prefix icu4c)


homebrewで入れたものはこんな感じでパスが得られるので覚えておくと指定が楽。

$ brew --prefix zlib
/usr/local/Cellar/zlib/1.2.7


なお、標準のApacheに組み込む場合、make installすると

  • /usr/libexec/apache2/libphp5.so
  • /private/etc/apache2/other/php5.conf

あたりが上書きされると思うので注意。事前にコピーを取っておいたほうがいいかも。


ところで、zlibだけsharedにすると件のエラーが出てしまってできなかった。