絖綛 N@i.jp  昨日:00000000
 今日:00018329
 総計:00018329
keywords
管理者専用
  Post   Add link   Control Panel 































新しいトピック
最新:03/21 19:08


新しいコメント
最新:07/28 16:47






管理人へMAIL

プライバシーポリシー

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には無理だろうと思ったのですが、そこでテストが中断されてしまうのは困ったもので、何とか最後まで走行して欲しいところ。何とかならないかな?と思案している最中です。


< 過去の記事 [ 2月の Blog リスト ] 新しい記事 >

2023 calendar
2月
1234
567891011
12131415161718
19202122232425
262728


掲示板
最新:08/15 17:19


GsBlog was developed by GUSTAV, Copyright(C) 2003, Web Application Factory All Rights Reserved.