phpbrewでPHP 7.4を入れるのにいろいろつまづいた
はじめに
2019/11/28にPHP 7.4正式版がリリースされた。
https://www.php.net/releases/7_4_0.php
https://www.php.net/ChangeLog-7.php#7.4.0
Macbook AirにphpbrewでPHP 7.4をインストールするのにいろいろ苦労したので、
記録を残しておこうと思う。
手順
うまくいったのは以下の手順。
1:openssl, libxml2, pkg-config入れる
- OpenSSLのバージョンは1.1以上にする
- libxml2も最新版にする
- pkg-configも入れとく
$ brew install openssl
$ brew install libxml2
$ brew install pkg-config
OSデフォルトのOpenSSLが0.9.8の場合、1.0.2をインストールしてパスを貼り替えていても、PHP 7.4インストール時に1.0.2以上が必要って怒られた。
ビルドログに沿って.bashrcにOPENSSL_CFLAGS, OPENSSL_LIBSなど設定したが、うまくいかず。
途中でopenssl 1.0.2を強制削除する暴挙をとったところ、インストール済みのphp7.3が起動できなくなり、
さらにはphpbrewも使えない、7.3をuninstallできないなどなど環境を壊してしまったので、結局phpbrewを一度綺麗に削除して最初からやり直した。。
(※教訓:brew uninstall openssl --force とかやらない)
2:oniguruma(正規表現ライブラリ)
brewでインストールする
$ brew install oniguruma
3:パスの追加
openssl, libxml2のパスを追加
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"
export PATH="/usr/local/opt/libxml2/bin:$PATH"
4:環境変数の追加
いろいろ苦労したが、以下の環境変数を追加したら7.4のビルドとインストールができた。
export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"
export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
export PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl) --with-libxml-dir=$(brew --prefix libxml2)"
source ~/.bachrc
を実行して設定を反映するのを忘れずに。
4:PHP 7.4をインストール
phpbrewでPHP 7.4をインストール
$ phpbrew update
$ phpbrew known
Read local release list (last update: 2019-11-29 12:36:17 UTC).
You can run `phpbrew update` or `phpbrew known --update` to get a newer release list.
7.4: 7.4.0 ...
7.3: 7.3.12, 7.3.11, 7.3.10, 7.3.9, 7.3.8, 7.3.7, 7.3.6, 7.3.5 ...
7.2: 7.2.25, 7.2.24, 7.2.23, 7.2.22, 7.2.21, 7.2.20, 7.2.19, 7.2.18 ...
7.1: 7.1.33, 7.1.32, 7.1.31, 7.1.30, 7.1.29, 7.1.28, 7.1.27, 7.1.26 ...
7.0: 7.0.33, 7.0.32, 7.0.31, 7.0.30, 7.0.29, 7.0.28, 7.0.27, 7.0.26 ...
5.6: 5.6.40, 5.6.39, 5.6.38, 5.6.37, 5.6.36, 5.6.35, 5.6.34, 5.6.33 ...
5.5: 5.5.38, 5.5.37, 5.5.36, 5.5.35, 5.5.34, 5.5.33, 5.5.32, 5.5.31 ...
5.4: 5.4.45, 5.4.44, 5.4.43, 5.4.42, 5.4.41, 5.4.40, 5.4.39, 5.4.38 ...
$ phpbrew install 7.4.0 +default
バージョン切り替え
$ phpbrew switch php-7.4.0
$ php -v
PHP 7.4.0 (cli) (built: Dec 1 2019 01:39:20) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
めでたしめでたし!
※以下余談
以上、あっさり書いたけど、何かとインストールには苦労した。
インストール途中でいろいろつまづいたこと
元々OpenSSLはバージョン1.0.2rをインストールしていたのだが、
phpbrewでPHP 7.4をインストールすると今までに見たことないエラーが・・・
$ phpbrew install 7.4.0 +default
Error: Configure failed:
The last 5 lines in the log file:
installed software in a non-standard prefix.
Alternatively, you may set the environment variables OPENSSL_CFLAGS
and OPENSSL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
ググってみたところGithubのissueのページがヒット。
phpbrewのバグみたいなことが書かれているが、
ビルドログに出た内容を対策していけばなんとかならんかと。
OpenSSL
ビルドログを見たところ以下のようなメッセージが出力されていた。
checking for openssl >= 1.0.1... no
configure: error: Package requirements (openssl >= 1.0.1) were not met:
Requested 'openssl >= 1.0.1' but version of OpenSSL is 0.9.8zg
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables OPENSSL_CFLAGS
and OPENSSL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
いやいや、たしかにOpenSSLはOSデフォルトは0.9.8だが、今は1.0.2を入れてパスも通しているし。
$ openssl version
OpenSSL 1.0.2r 26 Feb 2019
$ which openssl
/usr/local/opt/openssl/bin/openssl
デフォルトで入っていたOpenSSLは以下。
$ /usr/bin/openssl version
OpenSSL 0.9.8zg 14 July 2015
ということなので Package requirements (openssl >= 1.0.1) were not met:
なエラー出ても困る。
ログに出ている通り、OPENSSL_CFLAGSとOPENSSL_LIBSを設定すればいいんかなと。
~/.bashrc
export OPENSSL_CFLAGS=-I/usr/local/opt/openssl/include
export OPENSSL_LIBS=-L/usr/local/opt/openssl/lib
を追記して、 source ~/.bashrc
で反映。
再びPHP 7.4をインストールする。
$ phpbrew install 7.4.0 +default
Error: Configure failed:
The last 5 lines in the log file:
installed software in a non-standard prefix.
Alternatively, you may set the environment variables ONIG_CFLAGS
and ONIG_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
今度は違うエラー。。ONIG ??ってなんだ?
ググってみたところ、onigurumaという正規表現ライブラリに関するものらしい。
↓の記事を見ている限りだと、onigurumaが今まで同梱されていたものが7.4から外部ライブラリ参照に変わった様子。(裏付け確認はしてない)
onigurumaインストール
これはbrewであっさりインストールできる。
$ brew install oniguruma
それにしても鬼車って名前いいな。
再びPHP 7.4をインストール開始したところ、今度はビルドが始まりそこそこ時間がかかり始めた。
これはうまくいくだろうと思い、うちの子を公園に連れて行くために小一時間ほど外出。
そして帰ってきて見ると、、
$ phpbrew install 7.4.0 +default
Error: Make failed:
The last 5 lines in the log file:
_php_openssl_capture_peer_certs 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
インストールできてないし、またみたことないエラーが。 ググって見たけどよくわからん。
途中、libxml2を更新してみたところ同時にOpenSSLが1.1に更新されたのだが事象は改善せず。
何かの記事でopensslを再インストールするとよい、みたいなのをちらっと見かけたので、
前述のbrew uninstall openssl --force
とかやってしまったところ、
phpが実行できなくなってしまい詰んだ。
$ phpbrew install 7.4.0 +default
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
Referenced from: /Users/gayou/.phpbrew/php/php-7.3.3/bin/php
Reason: image not found
Trace/BPT trap: 5
こうなるともうどうしようもなくなったので、
phpbrewを一度綺麗に削除してインストールし直す。
もう一度最初からphp 7.4をインストールしようとしたが、それでもエラーが発生。
ビルドログに以下のような情報が出ていたので、
_php_openssl_capture_peer_certs 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)
Warning: Refusing to link macOS-provided software: openssl@1.1
If you need to have openssl@1.1 first in your PATH run:
echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile
For compilers to find openssl@1.1 you may need to set:
export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
For pkg-config to find openssl@1.1 you may need to set:
export PKG_CONFIG_PATH=/usr/local/opt/openssl@1.1/lib/pkgconfig