macOS に phpenv で PHP 7.4 をインストールする

[PHP 7.4 が2019年11月28日にリリースされて](https://www.php.net/archive/2019.php#2019-11-28-1)、 [phpenv + php-build では2019年12月10日に PHP 7.4 が追加されたよう](https://github.com/php-build/php-build/blob/master/CHANGELOG.md)なので、早速 macOS にインストールしてみたけど、結構てこずったので、私がインストールできた方法をまとめておきます。

# 環境

- macOS: 10.15.1
- phpenv: v0.9.0-rc.1
- php-build: v0.11.0dev

# はじめに実行したコマンド

phpenv を最新の状態にして

```
$ phpenv update
```

PHP 7.4 をインストールしようとしたところ、いくつかのエラーが発生したので、順番にエラーを潰していった。

```
$ phpenv install 7.4
```

# `krb5` をインストールする

`krb5` を入れろと言われるので、 `brew` で `krb5` をインストールする。

```
$ brew install krb5
```

あと、 `PKG_CONFIG_PATH` にパスを設定しろとも言われるので、設定する。私は fish shell を使っているので、 `.config/fish/conf.d/krb5.fish` に下記のように設定した。

```
set -gx PKG_CONFIG_PATH "/usr/local/opt/krb5/lib/pkgconfig" $PKG_CONFIG_PATH
```

## そのときのエラーメッセージ

```
configure: WARNING: unrecognized options: --with-png-dir, --with-libxml-dir, --with-icu-dir
configure: error: Package requirements (krb5-gssapi krb5) were not met:

No package 'krb5-gssapi' found
No package 'krb5' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables KERBEROS_CFLAGS
and KERBEROS_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
```

# `openssl` をインストールする

同じく `openssl ` を入れろと言われるので、 `brew` で `openssl` をインストールする。

```
brew install openssl@1.1
```

同じく `PKG_CONFIG_PATH` にパスを設定しろとも言われるので、設定する。 `.config/fish/conf.d/openssl.fish` に下記のように設定した。

```
set -gx PKG_CONFIG_PATH "/usr/local/opt/openssl@1.1/lib/pkgconfig" $PKG_CONFIG_PATH
```

## そのときのエラーメッセージ

```
configure: WARNING: unrecognized options: --with-png-dir, --with-libxml-dir, --with-icu-dir
configure: error: Package requirements (openssl >= 1.0.1) were not met:

No package 'openssl' found

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.
```

# `icu4c` をインストールする

同じく `icu` を入れろと言われるので、 `brew` で `icu4c` をインストールする。

```
brew install icu4c
```

同じく `PKG_CONFIG_PATH` にパスを設定しろとも言われるので、設定する。 `.config/fish/conf.d/icu4c.fish` に下記のように設定した。

```
set -gx PKG_CONFIG_PATH "/usr/local/opt/icu4c/lib/pkgconfig" $PKG_CONFIG_PATH
```

## そのときのエラーメッセージ

```
configure: WARNING: unrecognized options: --with-png-dir, --with-libxml-dir, --with-icu-dir
configure: error: Package requirements (icu-uc >= 50.1 icu-io icu-i18n) were not met:

No package 'icu-uc' found
No package 'icu-io' found
No package 'icu-i18n' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables ICU_CFLAGS
and ICU_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
```

# `libedit` をインストールする

同じく `libedit` を入れろと言われるので、 `brew` で `libedit ` をインストールする。

```
brew install libedit
```

同じく `PKG_CONFIG_PATH` にパスを設定しろとも言われるので、設定する。 `.config/fish/conf.d/libedit.fish` に下記のように設定した。

```
set -gx PKG_CONFIG_PATH "/usr/local/opt/libedit/lib/pkgconfig" $PKG_CONFIG_PATH
```

## そのときのエラーメッセージ

```
configure: WARNING: unrecognized options: --with-png-dir, --with-libxml-dir, --with-icu-dir
configure: WARNING: libedit directory ignored, rely on pkg-config
configure: error: Package requirements (libedit) were not met:

No package 'libedit' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables EDIT_CFLAGS
and EDIT_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
```

# `libxml2` のパスを設定する

`libxml2` は `brew` でインストールされていたけど、パスが通っていなかったので、ビルド時にエラーになった。

`.config/fish/conf.d/libzml2.fish` に下記のように設定した。

```
set -gx PKG_CONFIG_PATH "/usr/local/opt/libxml2/lib/pkgconfig" $PKG_CONFIG_PATH
```

## そのときのエラーメッセージ

```
configure: WARNING: unrecognized options: --with-png-dir, --with-libxml-dir, --with-icu-dir
configure: WARNING: unrecognized options: --with-png-dir, --with-libxml-dir, --with-icu-dir
warning: unsupported relocation in debug_info section.
note: while processing /private/var/tmp/php-build/source/7.4.0/ext/opcache/.libs/zend_accelerator_util_funcs.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: ext/opcache/.libs/opcache.a(shared_alloc_shm.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: ext/opcache/.libs/opcache.a(shared_alloc_shm.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /var/tmp/php-build/source/7.4.0/modules/opcache.a(shared_alloc_shm.o) has no symbols
/var/tmp/php-build/source/7.4.0/ext/libxml/libxml.c:34:10: fatal error: 'libxml/parser.h' file not found
#include <libxml/parser.h>
         ^~~~~~~~~~~~~~~~~
1 error generated.
make: *** [ext/libxml/libxml.lo] Error 1
```

# `bzip2` と `iconv` のパスを通す

`bzip2` と `iconv` は `brew` でインストールしたけど、 fish shell の設定ではうまくパスが通らなかったので、 `phpenv` で install するときにパスを渡すことにした。

```
brew install bzip2 libiconv
```

## エラーメッセージ

### `bzip2`

```
configure: WARNING: unrecognized options: --with-png-dir, --with-libxml-dir, --with-icu-dir
configure: error: Please reinstall the BZip2 distribution
```

### `iconv`

```
configure: WARNING: unrecognized options: --with-png-dir, --with-libxml-dir, --with-icu-dir
configure: error: Please specify the install prefix of iconv with --with-iconv=<DIR>
```

# 最終的なコマンド

私は fish shell を使っているので、最終的に下記のようなコマンドになった。

```
$ env PHP_BUILD_CONFIGURE_OPTS="--with-bz2=/usr/local/opt/bzip2 --with-iconv=/usr/local/opt/libiconv"  phpenv install 7.4.0
```

bash であれば下記のようになると思う。

```
$ PHP_BUILD_CONFIGURE_OPTS="--with-bz2=/usr/local/opt/bzip2 --with-iconv=/usr/local/opt/libiconv"  phpenv install 7.4.0
```

下記のような感じで、問題なくインストールできていることを確認した。

```
$ phpenv versions
  system
  7.2.25
  7.3.9
  7.4.0
$ phpenv shell 7.4
7.4
$ php -v
PHP 7.4.0 (cli) (built: Dec 13 2019 22:17:20) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.0, Copyright (c), by Zend Technologies
    with Xdebug v2.9.0, Copyright (c) 2002-2019, by Derick Rethans
```