■先日リリースされたPHP5.4.0。文法周りに手が入ったり、safe_modeのような古い、ルーズな設定を排除した新しいバージョン。ただ、コアに手が入った関係で、幾つかのPECLモジュールでコンパイルできないものがあった。DIO(ダイレクトI/O)がそれで、safe_modeを意識したコーディング部分が軒並み文法エラーで通らなくなっている。DIOはXBeeを使った家電制御アプリで欠かせないモジュールで、これが使えないのではPHP5.4.0も使えない。とはいえ、DIOの正式リリースがいつ出るのかは不明。自分で何とかしてみましょうか。
コンパイルエラーが出るのは以下の2ソース。
dio.c
dio_stream_wrappers.c
dio.cはPG(safe_mode)というマクロで、safe_modeフラグがオンの時の判定処理がエラーになる。dio_stream_wrappers.cも似ていて、safe_modeフラグ判定部分がエラーになる。いずれもsafe_modeを格納する領域がPHP5.4.0で削除されたため。
dio.cは以下の部分で、'PG(safe_mode)'を含む論理節を丸ごと削除した。CHECKUID_CHECK_MODE_PARAMはsafe_modeのことなので、後半のphp_checkuidも不要と判断した。
99c99
< if (php_check_open_basedir(file_name TSRMLS_CC) || (PG(safe_mode) && !php_checkuid(file_name, "wb+", CHECKUID_CHECK_MODE_PARAM))) {
---
> if (php_check_open_basedir(file_name TSRMLS_CC) ) {
dio_stream_wreppers.cも同様で、ただし、変更箇所は複数に分かれている。
146,214c212 / 213,214c212 / 310,311c308 / 377,378c374
< if (php_check_open_basedir(filename TSRMLS_CC) ||
< (PG(safe_mode) && !php_checkuid(filename, mode, CHECKUID_CHECK_MODE_PARAM))) {
---
> if (php_check_open_basedir(filename TSRMLS_CC) ){
とりあえずコンパイルは通る。動作確認はこれから。実際にUSB/FTDIデバイスを使って通信できることを確認する必要があるので、テスト方法をちょっと思案中。