Mac OS X El Capitan上でphp-buildするメモ

  • 37
    いいね
  • 0
    コメント

(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でリンクすることもできます。

こんな面倒なことをせずにbrew link --force openssl; brew link --force libxml2という手もアリですが(←最近のHomebrewでは不可能になりました)、僕は慎重派なので個別対応しています。

参考URL