macのphpenvでphpをビルドする際のpostgresやpeclオプションやらの備忘録

今回、php-mime-mail-parser/php-mime-mail-parserでメールのパースを行いたく、peclのmailparseモジュールが必要になったので、折角なので最終版のphp7.4.27をインストールしました。

たまーにしか行わないビルド、その都度、色々調べることになるので(汗)備忘録としてまとめます。

phpenvのリストを更新

$ cd ~/.phpenv/plugins/php-build
$ git pull
Updating 09e8c54..fd7be5b
error: Your local changes to the following files would be overwritten by merge:
	bin/phpenv-uninstall
Please, commit your changes or stash them before you can merge.
Aborting

php-buildの最新版をpullしてくるだけなんですが安定のエラー。

localのphpenv-uninstallが変更されてるっぽいですが捨ててもいいのですが、ひとまずstashして放置。

$ git stash
Saved working directory and index state WIP on master: 09e8c54 Add PHP 8.0.1, 7.4.14, 7.3.26 (#659)
HEAD is now at 09e8c54 Add PHP 8.0.1, 7.4.14, 7.3.26 (#659)

$ php-build $ git pull
......
 create mode 100644 share/php-build/definitions/8.0.9
 create mode 100644 share/php-build/definitions/8.1.0
 create mode 100644 share/php-build/definitions/8.1.1
 create mode 100644 share/php-build/definitions/8.1.2
 create mode 100644 share/php-build/definitions/8.2snapshot

アップデートされました。

$ git stash apply
Auto-merging bin/phpenv-uninstall
CONFLICT (content): Merge conflict in bin/phpenv-uninstall

stashを一応、戻そうとおもったら安定のコンクフリクト。だよね。

<<<<<<< Updated upstream
IFS=$'\n' scripts=(`type phpenv-hooks >/dev/null 2>&1 && phpenv-hooks uninstall || true`)
=======
#IFS=$'\n' scripts=(`phpenv-hooks uninstall`)
>>>>>>> Stashed changes

発見。

$ git reset --hard
$ git stash drop

もちろんリモートを優先することにします。

スタッシュ前に戻し、スタッシュ内容は破棄し先に進めます。

phpenvでインストールしたいバージョンを選ぶ

$ phpenv install --list

最新のインストール可能なPHPのバージョンがリストアップされます。

デフォルトのビルドオプションを設定

$ vi ~/.phpenv/plugins/php-build/share/php-build/default_configure_options

--with-pgsql
--with-pdo-pgsql

よく忘れるpostgresモジュールのビルドもデフォルトで行うよう、オプションがなければ追加。

必要なパッケージをインストール

で、いつもビルドでこのあたりのビルドエラーがでます

No package 'openssl' found
configure: error: Please reinstall the BZip2 distribution

ので、必要そうなパッケージを予めインストールしておきます。

$ brew install autoconf bzip2 icu4c krb5 libedit libiconv libjpeg libpng libxml2 libzip oniguruma openssl@1.1

最後に、peclもオプションに追加してインストール

$ PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig" PHP_BUILD_CONFIGURE_OPTS="--with-bz2=/usr/local/opt/bzip2 --with-iconv=/usr/local/opt/libiconv --with-pear" PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install 7.4.27

phpの切り替え

$ phpenv versions

でインストールされたのを確認し、

$ phpenv global 7.4.27

もしくは、localオプションを利用して切り替えです。

最後にmailparse.so をインストール。

$ pecl install mailparse

....
configuration option "php_ini" is not set to php.ini location
You should add "extension=mailparse.so" to php.ini

メッセージ通り、

$ vi ~/.phpenv/versions/7.4.27/etc/php.ini

;最後に追記
extension=mailparse.so

などで、php.ini に extension=mailparse.so を追記します。

$ php -i | grep mailparse
mailparse
mailparse support => enabled
mailparse.def_charset => us-ascii => us-ascii

これで、mailparseが有効になりました。

$ composer require php-mime-mail-parser/php-mime-mail-parser

....
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing php-mime-mail-parser/php-mime-mail-parser (7.0.0): Extracting archive

無事、composerで7.0.0がインストールが出来ました。

このmailparseが無いと、composerがエラーでコケればいいんですが、

Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing php-mime-mail-parser/php-mime-mail-parser (v1.0.0): Extracting archive

phpのバージョンによっては、v1.0.0 が入っちゃって、まったく使い物にならなかったり……

インストール出来ているものと思いこんで、沼にハマっていたのは秘密です^^