PHP 8.2.3 を味見中
参照:PHP
ウチのBlogを動かすくらいは大丈夫そうだけど
今のうちから PHP 8.2系への移行も準備しておこうと PHP 8.2.3 を味見しています。現在、一時的に PHP 8.2.3 で運用していますが、何か不具合が見つかったら PHP 8.1系に戻そうと思います。今のところ何とか大丈夫っぽい感じではありますが。
1. PHP 8.2用のビルドスクリプト("build.sh" )
PHP 8.1の物から少しだけ変えています。PHPに加え、PCREのJITコンパイラもデフォルトで使えるようになったようなのですが、同様にインテル x86, x64アーキしかサポートしていないのかビルドが失敗します。そのため、JITコンパイラを無効にするため "--disable-opcache-jit, ---without-pcre-jit" オプションを指定するようにしました。
#!/usr/local/bin/bash -x
export MACOSX_DEPLOYMENT_TARGET=10.4
export GCC="/usr/local"
export SSL="/usr/local/libressl"
export PATH="${GCC}/bin:/usr/local/bin:/usr/bin:${PATH}"
export DYLD_LIBRARY_PATH="${SSL}/lib:${GCC}/lib:${DYLD_LIBRARY_PATH}"
export PKG_CONFIG_PATH="${SSL}/lib/pkgconfig:${GCC}/lib/pkgconfig:${PKG_CONFIG_PATH}"
export OPTFLAGS="-O2 -mpowerpc -mcpu=7450 -maltivec"
export PREFIX="/usr/local/php8"
./configure \
--prefix=${PREFIX} \
--with-apxs2="/usr/local/apache2/bin/apxs" \
--with-config-file-path="${PREFIX}/lib" \
--with-config-file-scan-dir="${PREFIX}/php.d" \
--with-iconv="/usr/local" \
--with-openssl=${SSL} \
--with-openssl-dir=${SSL} \
---without-pcre-jit \
--with-zlib=/usr \
--with-zlib-dir=/usr \
--enable-gd \
--with-external-gd \
--with-bz2="/usr/local" \
--enable-exif \
--enable-soap \
--enable-ftp \
--enable-sockets \
--enable-mbstring \
--enable-calendar \
--enable-bcmath \
--enable-pcntl \
--enable-shmop \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-curl="/usr/local" \
--with-mysql-sock=/tmp/mysql.sock \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-kerberos=/usr \
--with-imap-ssl=/usr \
--with-gettext=/usr/local \
--with-pear \
--disable-huge-code-pages \
--disable-opcache-jit \
CC="${GCC}/bin/gcc" \
CXX="${GCC}/bin/g++" \
CPP="${GCC}/bin/cpp" \
CPPFLAGS="-I${SSL}/include -I/usr/local/include -I/usr/include" \
CFLAGS="${OPTFLAGS} -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
CXXFLAGS="${OPTFLAGS} -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
LDFLAGS="-L${SSL}/lib -L${GCC}/lib -L/usr/local/lib -L/usr/lib"
make
make test > check.log
|
注)「¥」は実際には半角の「\」(バックスラッシュ)
2. ソース修正
PHP 8.1 までに行っていた
"Zend/zend_alloc.c"
"Zend/zend.c"
"ext/openssl/openssl.c"
"ext/opcache/shared_alloc_mmap.c"
"Zend/asm/jump_ppc32_sysv_macho_gas.S"
"Zend/asm/make_ppc32_sysv_macho_gas.S"
に加え、"ext/hash/xxhash/xxhash.h" にも修正が必要になりました。1547行めからの
#ifndef XXH_STATIC_ASSERT
# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */
# include
# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0)
# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */
# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0)
# else
# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0)
# endif
# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c)
#endif
|
なのですが、static_assert がリンクエラー(undef)になってしまうんですよね。static_assert (静的アサーション)ってC++翻訳時の警告機能だったと思ったのだけど、最近のC言語(C11規格)では標準仕様になったのですね。翻訳(コンパイル)時に解釈されるので、ライブラリの中に static_assert って名前の関数があるわけじゃないですよね?
ウチの C/C++が古いようですね。__STDC_VERSION__ の値は 201112L なのだけど static_assert は関数扱いになります。__STDC_VERSION__ マクロでは static_assert (静的アサーション)機能の有無は判断できないのでしょう。
翻訳時の警告なので実行に影響するわけじゃなかろう、てことで static_assert を使わないようコメントアウトしてしまいます。
#ifndef XXH_STATIC_ASSERT
//# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */
//# include
//# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0)
//# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */
//# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0)
//# else
# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0)
//# endif
# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c)
#endif
|
3. ビルド&テスト
以上でビルドは突破できるようになったのですが、テスト(make test )が途中エラーで終了してしまい最後まで走行できませんでした。
TEST 12963/16020 [ext/standard/tests/file/bug55124.phpt]
PASS Bug #55124 (recursive mkdir fails with current (dot) directory in path) [ext/standard/tests/file/bug55124.phpt]
TEST 12964/16020 [ext/standard/tests/file/bug60120.phpt]
|
エラーメッセージを見たところ、4GB以上のメモリ領域を確保しようとしている感じでした。そりゃ流石にウチの Mac OS Xには無理だろうと思ったのですが、そこでテストが中断されてしまうのは困ったもので、何とか最後まで走行して欲しいところ。何とかならないかな?と思案している最中です。
|