🍎

macOS に phpenv で PHP 8.3.7 以降をインストールできない場合の対処法

2024/07/18に公開

ある日、いつものように phpenv で PHP 8.3.8 をインストールしようとしたところ、見慣れないエラーが表示されました。

configure: error: *** A compiler with support for C++17 language features is required.

色々と調べた結果、以下の記事に辿り着いたんですが、どうやら解決には至ってない様子。

https://scrapbox.io/takoba/PHP8.3.7をmacOS_Sonomaにphpenvでインストールする

上記の記事を参考に CXX 環境変数を設定したりしても確かにエラーは解消しません。そこで php-build のソースコードを眺めていると怪しげな記述が……

# icu4c 59+ requires C++11
if [[ -z "$CXXFLAGS" && $($(brew --prefix icu4c)/bin/icu-config --version) > "61" ]]; then
    # icu4c 61+ compatability (see #499)
    export CXXFLAGS="-std=c++11 -stdlib=libc++ -DU_USING_ICU_NAMESPACE=1"
elif [[ -z "$CXXFLAGS" && $($(brew --prefix icu4c)/bin/icu-config --version) > "59" ]]; then
    export CXXFLAGS="-std=c++11 -stdlib=libc++"
fi

「icu4c 59+ requires C++11」のコメントと共に環境変数 CXXFLAGS つまり C++ コンパイラに渡すオプションの中で -std=c++11 と指定されています。また、スクリプトを見る限りでは CXXFLAGS が既に存在する場合は上書きされないようです。そこで、php-build のスクリプトを参考に次のように CXXFLAGS を設定した上で phpenv を実行してみます。

env \
  CXXFLAGS="-std=c++17 -stdlib=libc++ -DU_USING_ICU_NAMESPACE=1" \
  phpenv install 8.3.7

すると、以下の通り無事にインストールできました。よかったー。

[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 8.3.7 into /Users/xxxxxxxx/.anyenv/envs/phpenv/versions/8.3.7
[Skipping]: Already downloaded and extracted https://www.php.net/distributions/php-8.3.7.tar.bz2
[Preparing]: /var/tmp/php-build/source/8.3.7
[Compiling]: /var/tmp/php-build/source/8.3.7
[xdebug]: Installing version 3.3.1
[Skipping]: Already downloaded http://xdebug.org/files/xdebug-3.3.1.tgz
[xdebug]: Compiling xdebug in /var/tmp/php-build/source/xdebug-3.3.1
[xdebug]: Installing xdebug configuration in /Users/xxxxxxxx/.anyenv/envs/phpenv/versions/8.3.7/etc/conf.d/xdebug.ini
[xdebug]: Cleaning up.
Makefile:245: warning: overriding commands for target `test'
Makefile:136: warning: ignoring old commands for target `test'
[Info]: Enabling Opcache...
[Info]: Done
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.8.3.7.20240718194343.log or rebuild with '--verbose' option
[Success]: Built 8.3.7 successfully.

Discussion