Browse Month: November 2014

OS X (10.9) で PHP 5.6.2 で pgsql を組み込もうとしてはまったお話

OS X 10.9 で、pgsql 入りの PHP 5.6.2 を自分でコンパイルしてインストールしようとしたところ、結果いうと make の最後のリンクに失敗してしまってインストールできませんでした。

公式サイトから、PHP 5.6.2 をダウンロードして、次のような configure してみました。なお、事前に postgresql などは homebrew 経由で事前にインストール済みです。
インストール先は、homebrew 以下になっていますが、これは試験的なインストールのためです。


php-5.6.2$ ./configure --prefix=/opt/boxen/homebrew/Cellar/php56/5.6.2 --localstatedir=/usr/local/homebrew/var --sysconfdir=/usr/local/homebrew/etc/php/5.6 --with-config-file-path=/usr/local/homebrew/etc/php/5.6 --with-config-file-scan-dir=/usr/local/homebrew/etc/php/5.6/conf.d --with-iconv-dir=/usr --enable-dba --with-ndbm=/usr --enable-exif --enable-intl --enable-soap --enable-wddx --enable-ftp --enable-sockets --enable-zip --enable-shmop --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-mbstring --enable-mbregex --enable-bcmath --enable-calendar --with-zlib=/usr/local/homebrew/opt/zlib --with-ldap --with-ldap-sasl=/usr --with-xmlrpc --with-kerberos=/usr --with-gd --enable-gd-native-ttf --with-freetype-dir=/usr/local/homebrew/opt/freetype --with-icu-dir=/usr/local/homebrew/opt/icu4c --with-jpeg-dir=/usr/local/homebrew/opt/jpeg --with-png-dir=/usr/local/homebrew/opt/libpng --with-gettext=/usr/local/homebrew/opt/gettext --with-libedit --with-unixODBC=/usr/local/homebrew/opt/unixodbc --with-pdo-odbc=unixODBC,/usr/local/homebrew/opt/unixodbc --mandir=/usr/local/homebrew/Cellar/php56/5.6.2/share/man --with-mhash --with-curl=/usr --with-snmp=/usr --with-bz2=/usr --with-openssl=/usr --with-xsl=/usr/local/homebrew/opt/libxslt --with-apxs2=/usr/sbin/apxs --libexecdir=/usr/local/homebrew/Cellar/php56/5.6.2/libexec --with-mysql-sock=/tmp/mysql.sock --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --enable-pcntl --enable-zend-signals --enable-dtrace --disable-phpdbg --enable-opcache
php-5.6.2$ make
...
Undefined symbols for architecture x86_64:
"_lo_lseek64", referenced from:
_zif_pg_lo_seek in pgsql.o
"_lo_tell64", referenced from:
_zif_pg_lo_tell in pgsql.o
"_lo_truncate64", referenced from:
_zif_pg_lo_truncate in pgsql.o
ld: symbol(s) not found for architecture x86_64

そして、homebrew-php という、PHP に特化した Homebrew をラップしているものがあったので、試しにこれでインストールしてみました。


$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/homebrew-php
$ brew install php56 --with-apache --with-pgsql
...

この方法だと、pgsql を組み込んでインストールすることができました。
実は、最初に紹介した configure オプションは、この PHP5.6 Formula でインストールしたときの configure とまったく同じものだったのですが、なぜか同じ configure オプションでもインストールできませんでした。おそらく、make するときの環境変数の設定まわりできっと Homebrew がよきにやってくれているようなのですが、すこしソースコードを追った感じだと具体的な原因は分かりませんした。

実はいままで phpenv + php-build の環境で使って開発をしていたのですが、そもそも PHP をまったく切り替えることがないし、phpenv けっこう重いので、これを気に homebrew-php に切り替えて phpenv + php-build を使うのはやめることにしました。

これで、PHP まわりのローカル環境の開発がスッキリしました。あわせて、msgpack や redis などもあるので、インストールしてさくっと組み込むことができました。

そして、ここまでのインストールもオプション付きでインストールするのが面倒、いつもローカルで使っている PHP の設定が include_path の設定がないなどがあったので、オリジナルの my-php56 を書いてみました。次のコマンドを使うと、さくっと今まで設定したものがインストールして、かつ php.ini の設定をしてくれるので便利だと思います。


$ brew tap n0ts/myformula
$ brew install my-php56

最後に homebrew 経由で curl や libxml2 が入っていると、apachectl -t でエラーになることがありますが、これは envvars だけの問題で動作はするので、気になる人は次のように直しておくとよいでしょう。


--- /usr/sbin/envvars-std 2014-01-16 10:08:32.000000000 +0900
+++ /usr/sbin/envvars 2014-11-13 07:35:17.000000000 +0900
@@ -20,6 +20,8 @@
#
if test "x$DYLD_LIBRARY_PATH" != "x" ; then
DYLD_LIBRARY_PATH="/usr/lib:$DYLD_LIBRARY_PATH"
+elif test "x$HOMEBREW_ROOT" != "x" ; then
+ DYLD_LIBRARY_PATH="$HOMEBREW_ROOT/lib:/usr/lib"
else
DYLD_LIBRARY_PATH="/usr/lib"
fi

日々使っている開発環境も、細切れ時間を見つけて、ちゃんとメンテナンスしていくのも重要なことですね