(2016/12/06追記)本稿の内容を勝手にやってくれるPull Requestがmergeされたので、下記のような苦労は過去のものになりました。「MacOSX上でphp-buildするときの苦労が減った話」も合わせてご確認ください。
「Mac OS X El CapitanからOpenSSLのヘッダファイルが消えた話」で紹介したように、Mac OS X El Capitanの/usr
以下のOpenSSLは0.9.8系かつヘッダファイルがないので、この環境でphp-build
でPHPをビルドしようと思ってもコンパイル中に死にます。
/var/tmp/php-build/source/7.0.6/ext/date/php_date.c:3756:5: note: use function 'llabs' instead
abs((utc_offset % 60)));
^~~
llabs
6 warnings generated.
/var/tmp/php-build/source/7.0.6/ext/openssl/openssl.c:44:10: fatal error: 'openssl/evp.h' file not found
#include <openssl/evp.h>
^
1 error generated.
make: *** [ext/openssl/openssl.lo] Error 1
これを解決するためにconfigure
の--with-openssl
オプションでHomebrewのOpenSSLを明示的に指定してやれば平和になるかと思いきや、これだけだと次のようにリンク時に死にます。
_php_openssl_setup_crypto in xp_ssl.o
"_TLSv1_1_server_method", referenced from:
_php_openssl_setup_crypto in xp_ssl.o
"_TLSv1_2_client_method", referenced from:
_php_openssl_setup_crypto in xp_ssl.o
"_TLSv1_2_server_method", referenced from:
_php_openssl_setup_crypto in xp_ssl.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: *** [sapi/cli/php] Error 1
これはMacOSX組み込みの古いlibsslをリンクしようとして死んでいます。結局、OpenSSLとLibxml2の両方についてHomebrewのものを指定する必要があります。
$ brew install openssl
$ brew install libxml2
$ PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl) --with-libxml-dir=$(brew --prefix libxml2)" PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install 7.0.6
これでうまくいく理由は、MacOSX組み込みのlibxml2と同じパスにlibsslが置かれているためです。組み込みのライブラリを1個も使わないようにすればライブラリのサーチパスにMacOSXのものが含まれなくなり、無事にHomebrewのOpenSSLが使われます。もしくは、リンク時の-L
オプションの順序を調整すればHomebrewのOpenSSLと組み込みのlibxml2でリンクすることもできます。
こんな面倒なことをせずに(←最近のHomebrewでは不可能になりました)、僕は慎重派なので個別対応しています。brew link --force openssl; brew link --force libxml2
という手もアリですが