macOS Catalinaにアップデートしたらphpenv installでビルドエラーしたのでhomebrew phpつかうようにした

f:id:jiska_roxx:20191031010953j:plain:w200

こんにちは。開発部の森です。

先日MacBook Proが故障してしまったので修理に出したらクリーンインストールされて返却されたので、せっかくだから新しい環境作るかと思いmacOS MojaveからCatalinaにアップデートしたのです。

OSバージョン

10.15ですね。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15
BuildVersion:   19A602

症状

phpenvphpのビルドが失敗するようになってしまいました。

以下は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 しか情報がありませんでした。

ログ全文はこちら https://gist.github.com/jiska/2be7ee5a8bf70d3dbf88e537b4537c0b#file-php-build-7-3-5-20191022215209-log

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の準備ができ、なんとか窮地を脱しました。

まとめ

  • phpをhomebrewでインストールした
  • direnvでPATH変更した
  • xdebugを追加した

Catalinaにバージョンアップした際には皆様もお気をつけください。

最後に

株式会社ROXXでは一緒に agent bankback check を作っていくメンバーを随時募集しています。 この記事を読んでROXXに興味を持ってくれた方はぜひご応募ください。   www.wantedly.com