こんにちは。開発部の森です。
先日MacBook Proが故障してしまったので修理に出したらクリーンインストールされて返却されたので、せっかくだから新しい環境作るかと思いmacOS MojaveからCatalinaにアップデートしたのです。
OSバージョン
10.15ですね。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.15 BuildVersion: 19A602
症状
phpenv でphpのビルドが失敗するようになってしまいました。
以下はphp7.3.9をビルドしようと試みたターミナルの出力結果です。
$ phpenv install 7.3.9 [Info]: Loaded extension plugin [Info]: Loaded apc Plugin. [Info]: Loaded composer Plugin. [Info]: Loaded github Plugin. [Info]: Loaded uprofiler Plugin. [Info]: Loaded xdebug Plugin. [Info]: Loaded xhprof Plugin. [Info]: Loaded zendopcache Plugin. [Info]: php.ini-production gets used as php.ini [Info]: Building 7.3.9 into /Users/jiska/.anyenv/envs/phpenv/versions/7.3.9 [Skipping]: Already downloaded and extracted https://secure.php.net/distributions/php-7.3.9.tar.bz2 [Preparing]: /var/tmp/php-build/source/7.3.9 ----------------- | BUILD ERROR | ----------------- Here are the last 10 lines from the log: ----------------------------------------- configure: WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 2.3, min: 204, excluded: ). configure: error: Cannot find zlib ----------------------------------------- The full Log is available at '/tmp/php-build.7.3.9.20191029095924.log'. [Warn]: Aborting build.
tmpに出力されたログには Cannot find zlib しか情報がありませんでした。
phpenvがダウンロードした /var/tmp/php-build/source/7.3.9
に出力された config.log
を確認してみます。
config.log全文はこちら https://gist.github.com/jiska/2be7ee5a8bf70d3dbf88e537b4537c0b#file-config-log
エラーを抜粋すると、hファイルが参照できていないようです。
$ cd /var/tmp/php-build/source/7.3.9 $ grep 'fatal err' config.log conftest.c:9:10: fatal error: 'ac_nonexistent.h' file not found conftest.c:9:10: fatal error: 'ac_nonexistent.h' file not found conftest.c:9:10: fatal error: 'ac_nonexistent.h' file not found conftest.c:52:10: fatal error: 'minix/config.h' file not found conftest.c:19:10: fatal error: 'minix/config.h' file not found conftest.c:60:10: fatal error: 'sys/pstat.h' file not found conftest.c:27:10: fatal error: 'sys/pstat.h' file not found conftest.c:28:10: fatal error: 'sys/exec.h' file not found conftest.c:40:10: fatal error: 'sys/prctl.h' file not found conftest.c:47:12: fatal error: 'port.h' file not found conftest.c:48:12: fatal error: 'sys/devpoll.h' file not found conftest.c:47:12: fatal error: 'sys/epoll.h' file not found conftest.c:48:10: fatal error: 'sys/apparmor.h' file not found conftest.c:98:10: fatal error: 'crypt.h' file not found conftest.c:101:10: fatal error: 'ieeefp.h' file not found conftest.c:124:10: fatal error: 'sys/statfs.h' file not found conftest.c:125:10: fatal error: 'sys/vfs.h' file not found conftest.c:125:10: fatal error: 'sys/sysexits.h' file not found conftest.c:125:10: fatal error: 'sys/varargs.h' file not found conftest.c:126:10: fatal error: 'sys/loadavg.h' file not found conftest.c:128:10: fatal error: 'unix.h' file not found conftest.c:305:10: fatal error: 'io.h' file not found conftest.c:272:10: fatal error: 'io.h' file not found
エラーは置いておいて手動でconfigure, makeしてみます。
# iconv指定しないとconfigure正常終了しないのでlibiconvもインストールしておく $ brew install libiconv $ ./configure --with-iconv=$(brew --prefix libiconv)
configureは終了しましたがmakeが途中で失敗してしまいます。
$ make (中略) Undefined symbols for architecture x86_64: "_libiconv", referenced from: _php_iconv_string in iconv.o __php_iconv_strlen in iconv.o _zif_iconv_substr in iconv.o __php_iconv_strpos in iconv.o _zif_iconv_mime_encode in iconv.o __php_iconv_appendl in iconv.o _php_iconv_stream_filter_append_bucket in iconv.o ... "_libiconv_close", referenced from: _php_iconv_string in iconv.o __php_iconv_strlen in iconv.o _zif_iconv_substr in iconv.o __php_iconv_strpos in iconv.o _zif_iconv_mime_encode in iconv.o __php_iconv_mime_decode in iconv.o _php_iconv_stream_filter_factory_create in iconv.o ... "_libiconv_open", referenced from: _php_iconv_string in iconv.o __php_iconv_strlen in iconv.o _zif_iconv_substr in iconv.o __php_iconv_strpos in iconv.o _zif_iconv_mime_encode in iconv.o __php_iconv_mime_decode in iconv.o _php_iconv_stream_filter_factory_create in iconv.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
make失敗しました。これを修正しても他にもオプションを追加しないといけないので大変です。
手軽に複数バージョンのphpをインストール、ビルドしたかったのにこれだとつらいですね。
暫定対応
homebrewでphpをインストールする
phpenvをいったん諦め、 homebrewで提供されているphp を使うことにします。
パッチバージョンは指定できないですが(hash指定すればできるけど手軽でないので割愛)マイナーバージョンは指定できるのでなんとかなります。
# 2019-10-29現在 7.3.11 がインストールされる $ brew install php (後略) $ /usr/local/opt/php/bin/php -v PHP 7.3.11 (cli) (built: Oct 24 2019 11:29:00) ( NTS ) (後略) # php@7.2 だと 7.2.24 がインストールされる $ /usr/local/opt/php@7.2/bin/php -v PHP 7.2.24 (cli) (built: Oct 25 2019 11:13:56) ( NTS ) (後略)
direnvでPATHを変更する
phpenvを使っているとディレクトリに .php-version
ファイルを配置することで使用するphpを指定できますね。それに近い設定をするべく direnv でPATHを変更します。
direnvをインストール、.profileなどに設定を追加後にphpのバージョンを変更したいディレクトリに以下のような .envrc
を配置し direnv allow .
します。
$ cd path/to/my-project # この例ではphp 7.2を指定している $ cat .envrc export PATH="/usr/local/opt/php@7.2/bin:$PATH" $ direnv allow . direnv: loading .envrc direnv: export ~PATH
これでphpのバージョンが変更されます。
$ cd path/to/my-project direnv: loading .envrc direnv: export ~PATH # 7.2.24 になった $ which php /usr/local/opt/php@7.2/bin/php $ php -v PHP 7.2.24 (cli) (built: Oct 25 2019 11:13:56) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.24, Copyright (c) 1999-2018, by Zend Technologies # 他のディレクトリに移動するとphpのバージョンが標準のものにもどる $ cd direnv: unloading $ which php /usr/local/bin/php $ php -v PHP 7.3.11 (cli) (built: Oct 24 2019 11:29:00) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.11, Copyright (c) 1999-2018, by Zend Technologies
Xdebugをインストールする
開発には Xdebug が欠かせないので pecl
でインストールします。
# peclのPATHも変更されている $ which pecl /usr/local/opt/php@7.2/bin/pecl $ pecl install xdebug (後略) # Xdebugがインストールされた $ php -v PHP 7.2.24 (cli) (built: Oct 25 2019 11:13:56) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Xdebug v2.7.2, Copyright (c) 2002-2019, by Derick Rethans with Zend OPcache v7.2.24, Copyright (c) 1999-2018, by Zend Technologies
これでphpの準備ができ、なんとか窮地を脱しました。
まとめ
Catalinaにバージョンアップした際には皆様もお気をつけください。
最後に
株式会社ROXXでは一緒に agent bank と back check を作っていくメンバーを随時募集しています。 この記事を読んでROXXに興味を持ってくれた方はぜひご応募ください。 www.wantedly.com